Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Scrivi le regole di Guard per valutare le risorse per Guard Hooks
AWS CloudFormation Guard è un linguaggio specifico di dominio (DSL) open source e generico che puoi utilizzare per creare policy as-code. Questo argomento spiega come utilizzare Guard per creare regole di esempio che possono essere eseguite in Guard Hook per valutare e eseguire automaticamente le operazioni. CloudFormation AWS Cloud Control API Si concentrerà anche sui diversi tipi di input disponibili per le regole Guard a seconda di quando Guard Hook viene eseguito. Un Guard Hook può essere configurato per funzionare durante i seguenti tipi di operazioni:
-
Operazioni sulle risorse
-
Operazioni sullo stack
-
Operazioni relative ai set di modifiche
Per ulteriori informazioni sulla scrittura delle regole di Guard, vedi Scrittura AWS CloudFormation Guard delle regole
Argomenti
Funzionamento delle risorse (regole Guard)
Ogni volta che crei, aggiorni o elimini una risorsa, questa viene considerata un'operazione relativa alle risorse. Ad esempio, se si esegue l'aggiornamento di uno CloudFormation stack che crea una nuova risorsa, è stata completata un'operazione relativa alle risorse. Anche la creazione, l'aggiornamento o l'eliminazione di una risorsa utilizzando l'API Cloud Control viene considerata un'operazione relativa alle risorse. Puoi configurare Guard Hook in base al target RESOURCE e CLOUD_CONTROL alle operazioni nella TargetOperations configurazione del tuo Hook. Quando Guard Hook valuta un'operazione di risorse, il motore Guard valuta un input di risorse.
Argomenti
Sintassi di input delle risorse Guard
L'input della risorsa Guard è costituito dai dati messi a disposizione delle regole Guard per la valutazione.
Di seguito è riportato un esempio di forma di input di risorsa:
HookContext: AWSAccountID: String StackId: String HookTypeName: String HookTypeVersion: String InvocationPoint: [CREATE_PRE_PROVISION, UPDATE_PRE_PROVISION, DELETE_PRE_PROVISION] TargetName: String TargetType: RESOURCE TargetLogicalId: String ChangeSetId: String Resources: {ResourceLogicalID}: ResourceType: {ResourceType} ResourceProperties: {ResourceProperties} Previous: ResourceLogicalID: ResourceType: {ResourceType} ResourceProperties: {PreviousResourceProperties}
HookContext-
AWSAccountID-
L'ID della risorsa Account AWS che contiene la risorsa da valutare.
StackId-
L'ID dello CloudFormation stack che fa parte dell'operazione sulla risorsa. È vuoto se il chiamante è Cloud Control API.
HookTypeName-
Il nome dell'Hook in esecuzione.
HookTypeVersion-
La versione dell'Hook in esecuzione.
InvocationPoint-
Il punto esatto nella logica di provisioning in cui viene eseguito l'Hook.
Valori validi: (
CREATE_PRE_PROVISION|UPDATE_PRE_PROVISION|DELETE_PRE_PROVISION) TargetName-
Il tipo di destinazione da valutare, ad esempio,
AWS::S3::Bucket. TargetType-
Il tipo di destinazione da valutare, ad esempio
AWS::S3::Bucket. Per le risorse fornite con Cloud Control API, questo valore saràRESOURCE. TargetLogicalId-
La
TargetLogicalIdrisorsa da valutare. Se l'origine dell'Hook è CloudFormation, questo sarà l'ID logico (noto anche come nome logico) della risorsa. Se l'origine dell'Hook è l'API Cloud Control, questo sarà un valore costruito. ChangeSetId-
L'ID del set di modifiche che è stato eseguito per causare l'invocazione di Hook. Questo valore è vuoto se la modifica della risorsa è stata avviata dall'API Cloud Control o dalle operazioni,
create-stackupdate-stack, o.delete-stack
Resources-
ResourceLogicalID-
Quando l'operazione viene avviata da CloudFormation,
ResourceLogicalIDè l'ID logico della risorsa nel CloudFormation modello.Quando l'operazione viene avviata dall'API Cloud Control, si
ResourceLogicalIDtratta di una combinazione del tipo di risorsa, del nome, dell'ID dell'operazione e dell'ID della richiesta. ResourceType-
Il nome del tipo della risorsa (esempio:
AWS::S3::Bucket). ResourceProperties-
Le proprietà proposte della risorsa da modificare. Quando Guard Hook è in esecuzione rispetto alle modifiche alle CloudFormation risorse, tutte le funzioni, i parametri e le trasformazioni verranno completamente risolti. Se la risorsa viene eliminata, questo valore sarà vuoto.
Previous-
ResourceLogicalID-
Quando l'operazione viene avviata da CloudFormation,
ResourceLogicalIDè l'ID logico della risorsa nel CloudFormation modello.Quando l'operazione viene avviata dall'API Cloud Control, si
ResourceLogicalIDtratta di una combinazione del tipo di risorsa, del nome, dell'ID dell'operazione e dell'ID della richiesta. ResourceType-
Il nome del tipo della risorsa (esempio:
AWS::S3::Bucket). ResourceProperties-
Le proprietà correnti associate alla risorsa da modificare. Se la risorsa viene eliminata, questo valore sarà vuoto.
Esempio di input per l'operazione della risorsa Guard
Il seguente input di esempio mostra un Guard Hook che riceverà la definizione della AWS::S3::Bucket risorsa da aggiornare. Questi sono i dati a disposizione di Guard per la valutazione.
HookContext: AwsAccountId: "123456789012" StackId: "arn:aws:cloudformation:us-west-2:123456789012:stack/MyStack/1a2345b6-0000-00a0-a123-00abc0abc000" HookTypeName: org::s3policy::hook HookTypeVersion: "00001" InvocationPoint: UPDATE_PRE_PROVISION TargetName: AWS::S3::Bucket TargetType: RESOURCE TargetLogicalId: MyS3Bucket ChangeSetId: "" Resources: MyS3Bucket: Type: AWS::S3::Bucket Properties: BucketName:amzn-s3-demo-bucketObjectLockEnabled: true Previous: MyS3Bucket: Type: AWS::S3::Bucket Properties: BucketName:amzn-s3-demo-bucketObjectLockEnabled: false
Per vedere tutte le proprietà disponibili per il tipo di risorsa, vedere AWS::S3::Bucket.
Regole di protezione per le modifiche alle risorse
Quando un Guard Hook valuta le modifiche alle risorse, inizia scaricando tutte le regole configurate con l'Hook. Queste regole vengono quindi valutate rispetto all'input della risorsa. The Hook fallirà se qualche regola non viene valutata. Se non ci sono guasti, l'Hook passerà.
L'esempio seguente è una regola Guard che valuta se la ObjectLockEnabled proprietà è true per qualsiasi tipo di AWS::S3::Bucket risorsa.
let s3_buckets_default_lock_enabled = Resources.*[ Type == 'AWS::S3::Bucket'] rule S3_BUCKET_DEFAULT_LOCK_ENABLED when %s3_buckets_default_lock_enabled !empty { %s3_buckets_default_lock_enabled.Properties.ObjectLockEnabled exists %s3_buckets_default_lock_enabled.Properties.ObjectLockEnabled == true << Violation: S3 Bucket ObjectLockEnabled must be set to true. Fix: Set the S3 property ObjectLockEnabled parameter to true. >> }
Quando questa regola viene eseguita sul seguente input, avrà esito negativo poiché la ObjectLockEnabled proprietà non è impostata su. true
Resources: MyS3Bucket: Type: AWS::S3::Bucket Properties: BucketName:amzn-s3-demo-bucketObjectLockEnabled: false
Quando questa regola viene eseguita sul seguente input, passerà poiché ObjectLockEnabled è impostata sutrue.
Resources: MyS3Bucket: Type: AWS::S3::Bucket Properties: BucketName:amzn-s3-demo-bucketObjectLockEnabled: true
Quando un Hook fallisce, le regole non riuscite verranno propagate nuovamente alla nostra CloudFormation API Cloud Control. Se è stato configurato un bucket di registrazione per Guard Hook, verrà fornito un feedback aggiuntivo sulle regole. Questo feedback aggiuntivo include le informazioni Violation eFix.
Stack operation (regole Guard)
Quando uno CloudFormation stack viene creato, aggiornato o eliminato, puoi configurare Guard Hook in modo che inizi valutando il nuovo modello e potenzialmente bloccando il proseguimento dell'operazione sullo stack. Puoi configurare Guard Hook per indirizzare STACK le operazioni nella TargetOperations configurazione del tuo Hook.
Argomenti
Sintassi di input dello stack Guard
L'input per le operazioni dello stack Guard fornisce l'intero CloudFormation modello da valutare per le regole Guard.
Di seguito è riportato un esempio di forma di input dello stack:
HookContext: AWSAccountID: String StackId: String HookTypeName: String HookTypeVersion: String InvocationPoint: [CREATE_PRE_PROVISION, UPDATE_PRE_PROVISION, DELETE_PRE_PROVISION] TargetName: String TargetType:STACK ChangeSetId: String {Proposed CloudFormation Template} Previous: {CloudFormation Template}
HookContext-
AWSAccountID-
L'ID del Account AWS contenitore della risorsa.
StackId-
L'ID dello CloudFormation stack che fa parte dell'operazione sullo stack.
HookTypeName-
Il nome dell'Hook in esecuzione.
HookTypeVersion-
La versione dell'Hook in esecuzione.
InvocationPoint-
Il punto esatto nella logica di provisioning in cui viene eseguito l'Hook.
Valori validi: (
CREATE_PRE_PROVISION|UPDATE_PRE_PROVISION|DELETE_PRE_PROVISION) TargetName-
Il nome dello stack da valutare.
TargetType-
Questo valore verrà visualizzato
STACKquando viene eseguito come Hook a livello di stack. ChangeSetId-
L'ID del set di modifiche che è stato eseguito per causare l'invocazione di Hook. Questo valore è vuoto se l'operazione sullo stack è stata avviata da un'operazione
create-stack,update-stack, o.delete-stack
Proposed CloudFormation Template-
Il valore completo del CloudFormation modello passato a CloudFormation
create-stackorupdate-stackoperations. Ciò include cose comeResources,Outputs, eProperties. Può essere una stringa JSON o YAML a seconda di cosa è stata fornita. CloudFormationNelle
delete-stackoperazioni, questo valore sarà vuoto. Previous-
L'ultimo CloudFormation modello distribuito con successo. Questo valore è vuoto se lo stack viene creato o eliminato.
Nelle
delete-stackoperazioni, questo valore sarà vuoto.
Nota
I modelli forniti sono ciò che viene passato create o le operazioni di update impilamento. Quando si elimina uno stack, non vengono forniti valori di modello.
Esempio di input per l'operazione Guard stack
Il seguente input di esempio mostra un Guard Hook che riceverà un modello completo e il modello precedentemente distribuito. Il modello in questo esempio utilizza il formato JSON.
HookContext: AwsAccountId: 123456789012 StackId: "arn:aws:cloudformation:us-west-2:123456789012:stack/MyStack/1a2345b6-0000-00a0-a123-00abc0abc000" HookTypeName: org::templatechecker::hook HookTypeVersion: "00001" InvocationPoint: UPDATE_PRE_PROVISION TargetName: MyStack TargetType: CHANGE_SET TargetLogicalId: arn:aws:cloudformation:us-west-2:123456789012:changeSet/SampleChangeSet/1a2345b6-0000-00a0-a123-00abc0abc000 ChangeSetId: arn:aws:cloudformation:us-west-2:123456789012:changeSet/SampleChangeSet/1a2345b6-0000-00a0-a123-00abc0abc000 Resources: { "S3Bucket": { "Type": "AWS::S3::Bucket", "Properties": { "BucketEncryption": { "ServerSideEncryptionConfiguration": [ {"ServerSideEncryptionByDefault": {"SSEAlgorithm": "aws:kms", "KMSMasterKeyID": "KMS-KEY-ARN" }, "BucketKeyEnabled": true } ] } } } Previous: { "AWSTemplateFormatVersion": "2010-09-09", "Resources": { "S3Bucket": { "Type": "AWS::S3::Bucket", "Properties": {} } } }
Regole di protezione per le modifiche allo stack
Quando un Guard Hook valuta le modifiche allo stack, inizia scaricando tutte le regole configurate con l'Hook. Queste regole vengono quindi valutate rispetto all'input della risorsa. The Hook fallirà se qualche regola non viene valutata. Se non ci sono guasti, l'Hook passerà.
L'esempio seguente è una regola Guard che valuta se ci sono tipi di AWS::S3::Bucket risorse contenenti una proprietà chiamataBucketEncryption, con il valore SSEAlgorithm impostato su oaws:kms. AES256
let s3_buckets_s3_default_encryption = Resources.*[ Type == 'AWS::S3::Bucket'] rule S3_DEFAULT_ENCRYPTION_KMS when %s3_buckets_s3_default_encryption !empty { %s3_buckets_s3_default_encryption.Properties.BucketEncryption exists %s3_buckets_s3_default_encryption.Properties.BucketEncryption.ServerSideEncryptionConfiguration[*].ServerSideEncryptionByDefault.SSEAlgorithm in ["aws:kms","AES256"] << Violation: S3 Bucket default encryption must be set. Fix: Set the S3 Bucket property BucketEncryption.ServerSideEncryptionConfiguration.ServerSideEncryptionByDefault.SSEAlgorithm to either "aws:kms" or "AES256" >> }
Quando la regola viene eseguita sul modello seguente, lo faràfail.
AWSTemplateFormatVersion: 2010-09-09 Description: S3 bucket without default encryption Resources: EncryptedS3Bucket: Type: 'AWS::S3::Bucket' Properties: BucketName: !Sub 'encryptedbucket-${AWS::Region}-${AWS::AccountId}'
Quando la regola viene eseguita sul modello seguente, lo faràpass.
AWSTemplateFormatVersion: 2010-09-09 Description: S3 bucket with default encryption using SSE-KMS with an S3 Bucket Key Resources: EncryptedS3Bucket: Type: 'AWS::S3::Bucket' Properties: BucketName: !Sub 'encryptedbucket-${AWS::Region}-${AWS::AccountId}' BucketEncryption: ServerSideEncryptionConfiguration: - ServerSideEncryptionByDefault: SSEAlgorithm: 'aws:kms' KMSMasterKeyID: KMS-KEY-ARN BucketKeyEnabled: true
Modifica le regole dell'operazione Guard
Quando viene creato un set di CloudFormation modifiche, puoi configurare Guard Hook per valutare il modello e le modifiche proposte nel set di modifiche per bloccare l'esecuzione del set di modifiche.
Argomenti
Sintassi di input del set di modifiche Guard
L'input del set di modifiche Guard è costituito dai dati resi disponibili per la valutazione delle regole di Guard.
Di seguito è riportato un esempio di forma di input del set di modifiche:
HookContext: AWSAccountID: String StackId: String HookTypeName: String HookTypeVersion: String InvocationPoint: [CREATE_PRE_PROVISION, UPDATE_PRE_PROVISION, DELETE_PRE_PROVISION] TargetName: CHANGE_SET TargetType:CHANGE_SET TargetLogicalId:ChangeSet ID ChangeSetId: String {Proposed CloudFormation Template} Previous: {CloudFormation Template} Changes: [{ResourceChange}]
La sintassi ResourceChange del modello è:
logico ResourceId: String resourceType: String operazione: CREATE, UPDATE, DELETE Numero di riga: Number BeforeContext: JSON String AfterContext: JSON String
HookContext-
AWSAccountID-
L'ID del Account AWS contenitore della risorsa.
StackId-
L'ID dello CloudFormation stack che fa parte dell'operazione sullo stack.
HookTypeName-
Il nome dell'Hook in esecuzione.
HookTypeVersion-
La versione dell'Hook in esecuzione.
InvocationPoint-
Il punto esatto nella logica di provisioning in cui viene eseguito l'Hook.
Valori validi: (
CREATE_PRE_PROVISION|UPDATE_PRE_PROVISION|DELETE_PRE_PROVISION) TargetName-
Il nome dello stack da valutare.
TargetType-
Questo valore verrà visualizzato
CHANGE_SETquando viene eseguito come Hook a livello di set di modifica. TargetLogicalId-
Questo valore sarà l'ARN del set di modifiche.
ChangeSetId-
L'ID del set di modifiche che è stato eseguito per causare l'invocazione di Hook. Questo valore è vuoto se l'operazione sullo stack è stata avviata da un'operazione
create-stack,update-stack, o.delete-stack
Proposed CloudFormation Template-
Il CloudFormation modello completo fornito a un'
create-change-setoperazione. Può essere una stringa JSON o YAML a seconda di cosa è stata fornita. CloudFormation Previous-
L'ultimo modello distribuito con successo. CloudFormation Questo valore è vuoto se lo stack viene creato o eliminato.
Changes-
Il
Changesmodello. Questo elenca le modifiche alle risorse.
- Modifiche
-
- logico ResourceId
-
Il nome logico della risorsa modificata.
- resourceType
-
Il tipo di risorsa che verrà modificato.
- operazione
-
Il tipo di operazione eseguita sulla risorsa.
Valori validi: (
CREATE|UPDATE|DELETE) - Numero di riga
-
Il numero di riga nel modello associato alla modifica.
- BeforeContext
-
Una stringa JSON di proprietà della risorsa prima della modifica:
{"properties": {"property1": "value"}} - AfterContext
-
Una stringa JSON di proprietà della risorsa dopo la modifica:
{"properties": {"property1": "new value"}}
Esempio di input dell'operazione Guard change set
Il seguente input di esempio mostra un Guard Hook che riceverà un modello completo, il modello precedentemente distribuito e un elenco di modifiche alle risorse. Il modello in questo esempio utilizza il formato JSON.
HookContext: AwsAccountId: "00000000" StackId: MyStack HookTypeName: org::templatechecker::hook HookTypeVersion: "00001" InvocationPoint: UPDATE_PRE_PROVISION TargetName: my-example-stack TargetType:STACK TargetLogicalId: arn...:changeSet/change-set ChangeSetId: "" Resources: { "S3Bucket": { "Type": "AWS::S3::Bucket", "Properties": { "BucketName": "amzn-s3-demo-bucket", "VersioningConfiguration":{ "Status": "Enabled" } } } Previous: { "AWSTemplateFormatVersion": "2010-09-09", "Resources": { "S3Bucket": { "Type": "AWS::S3::Bucket", "Properties": { "BucketName": "amzn-s3-demo-bucket", "VersioningConfiguration":{ "Status": "Suspended" } } } } } Changes: [ { "logicalResourceId": "S3Bucket", "resourceType": "AWS::S3::Bucket", "action": "UPDATE", "lineNumber": 5, "beforeContext": "{\"Properties\":{\"VersioningConfiguration\":{\"Status\":\"Suspended\"}}}", "afterContext": "{\"Properties\":{\"VersioningConfiguration\":{\"Status\":\"Enabled\"}}}" } ]
Regola di protezione per le operazioni sui set di modifiche
L'esempio seguente è una regola Guard che valuta le modifiche ai bucket Amazon S3 e garantisce che VersionConfiguration non siano disattivate.
let s3_buckets_changing = Changes[resourceType == 'AWS::S3::Bucket'] rule S3_VERSIONING_STAY_ENABLED when %s3_buckets_changing !empty { let afterContext = json_parse(%s3_buckets_changing.afterContext) when %afterContext.Properties.VersioningConfiguration.Status !empty { %afterContext.Properties.VersioningConfiguration.Status == 'Enabled' } }