View a markdown version of this page

Schreiben Sie Guard-Regeln, um die Ressourcen für Guard Hooks zu evaluieren - CloudFormation

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Schreiben Sie Guard-Regeln, um die Ressourcen für Guard Hooks zu evaluieren

AWS CloudFormation Guard ist eine domänenspezifische Open-Source-Sprache (DSL) für allgemeine Zwecke, mit der Sie Policy-as-Code erstellen können. In diesem Thema wird erklärt, wie Sie Guard verwenden, um Beispielregeln zu erstellen, die im Guard Hook ausgeführt werden können, um Operationen automatisch auszuwerten. CloudFormation AWS -Cloud-Control- API Es konzentriert sich auch auf die verschiedenen Arten von Eingaben, die für Ihre Guard-Regeln verfügbar sind, je nachdem, wann Ihr Guard Hook ausgeführt wird. Ein Guard Hook kann so konfiguriert werden, dass er während der folgenden Arten von Vorgängen ausgeführt wird:

  • Ressourcenvorgänge

  • Operationen stapeln

  • Operationen ändern

Weitere Informationen zum Schreiben von Guard-Regeln finden Sie unter AWS CloudFormation Guard Regeln schreiben

Guard-Regeln für den Ressourcenbetrieb

Jedes Mal, wenn Sie eine Ressource erstellen, aktualisieren oder löschen, wird dies als Ressourcenvorgang betrachtet. Wenn Sie beispielsweise die Aktualisierung eines CloudFormation Stacks ausführen, der eine neue Ressource erstellt, haben Sie einen Ressourcenvorgang abgeschlossen. Wenn Sie eine Ressource mithilfe der Cloud Control API erstellen, aktualisieren oder löschen, wird dies ebenfalls als Ressourcenvorgang betrachtet. Sie können Ihren Guard Hook für Ziele RESOURCE und CLOUD_CONTROL Operationen in der TargetOperations Konfiguration für Ihren Hook konfigurieren. Wenn Ihr Guard Hook eine Ressourcenoperation auswertet, wertet die Guard-Engine eine Ressourceneingabe aus.

Syntax zur Eingabe von Guard-Ressourcen

Die Guard-Ressourceneingabe besteht aus den Daten, die Ihren Guard-Regeln zur Auswertung zur Verfügung gestellt werden.

Im Folgenden finden Sie ein Beispiel für die Form einer Ressourceneingabe:

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

Die ID des Objekts AWS-Konto , das die auszuwertende Ressource enthält.

StackId

Die Stack-ID des CloudFormation Stacks, der Teil der Ressourcenoperation ist. Dies ist leer, wenn der Aufrufer die Cloud Control API ist.

HookTypeName

Der Name des Hooks, der gerade läuft.

HookTypeVersion

Die Version des Hooks, der ausgeführt wird.

InvocationPoint

Der genaue Punkt in der Bereitstellungslogik, an dem der Hook ausgeführt wird.

Gültige Werte: (CREATE_PRE_PROVISION| UPDATE_PRE_PROVISION |DELETE_PRE_PROVISION)

TargetName

Der Zieltyp, der ausgewertet wird, AWS::S3::Bucket z. B.

TargetType

Der Zieltyp, der evaluiert wird, zum BeispielAWS::S3::Bucket. Für Ressourcen, die mit der Cloud Control API bereitgestellt werdenRESOURCE, lautet dieser Wert.

TargetLogicalId

Der Wert TargetLogicalId der Ressource, die evaluiert wird. Wenn der Ursprung des Hooks ist CloudFormation, ist dies die logische ID (auch bekannt als logischer Name) der Ressource. Wenn der Ursprung des Hooks die Cloud Control API ist, handelt es sich um einen konstruierten Wert.

ChangeSetId

Die Änderungssatz-ID, die ausgeführt wurde, um den Hook-Aufruf auszulösen. Dieser Wert ist leer, wenn die Ressourcenänderung von der Cloud Control API oder den delete-stack Vorgängen, create-stackupdate-stack, oder initiiert wurde.

Resources
ResourceLogicalID

Wenn der Vorgang von initiiert wird CloudFormation, ResourceLogicalID ist das die logische ID der Ressource in der CloudFormation Vorlage.

Wenn der Vorgang von der Cloud Control API initiiert wird, ResourceLogicalID handelt es sich um eine Kombination aus Ressourcentyp, Name, Vorgangs-ID und Anforderungs-ID.

ResourceType

Der Typname der Ressource (Beispiel:AWS::S3::Bucket).

ResourceProperties

Die vorgeschlagenen Eigenschaften der Ressource, die geändert wird. Wenn der Guard Hook gegen die CloudFormation Ressourcenänderungen ausgeführt wird, werden alle Funktionen, Parameter und Transformationen vollständig aufgelöst. Wenn die Ressource gelöscht wird, ist dieser Wert leer.

Previous
ResourceLogicalID

Wenn der Vorgang von initiiert wird CloudFormation, ResourceLogicalID ist das die logische ID der Ressource in der CloudFormation Vorlage.

Wenn der Vorgang von der Cloud Control API initiiert wird, ResourceLogicalID handelt es sich um eine Kombination aus Ressourcentyp, Name, Vorgangs-ID und Anforderungs-ID.

ResourceType

Der Typname der Ressource (Beispiel:AWS::S3::Bucket).

ResourceProperties

Die aktuellen Eigenschaften, die der Ressource zugeordnet sind, die geändert wird. Wenn die Ressource gelöscht wird, ist dieser Wert leer.

Beispiel für eine Guard-Resource-Operationseingabe

Die folgende Beispieleingabe zeigt einen Guard-Hook, der die Definition der zu aktualisierenden AWS::S3::Bucket Ressource erhält. Dies sind die Daten, die Guard zur Auswertung zur Verfügung stehen.

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-bucket ObjectLockEnabled: true Previous: MyS3Bucket: Type: AWS::S3::Bucket Properties: BucketName: amzn-s3-demo-bucket ObjectLockEnabled: false

Alle für den Ressourcentyp verfügbaren Eigenschaften finden Sie unter AWS::S3::Bucket.

Regeln für Änderungen an Ressourcen schützen

Wenn ein Guard-Hook Ressourcenänderungen auswertet, lädt er zunächst alle mit dem Hook konfigurierten Regeln herunter. Diese Regeln werden dann anhand der Ressourceneingabe ausgewertet. Der Hook schlägt fehl, wenn Regeln ihre Bewertung nicht bestehen. Wenn es keine Fehler gibt, wird der Hook bestanden.

Das folgende Beispiel ist eine Guard-Regel, die auswertet, ob die ObjectLockEnabled Eigenschaft true für einen AWS::S3::Bucket Ressourcentyp gilt.

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. >> }

Wenn diese Regel für die folgende Eingabe ausgeführt wird, schlägt sie fehl, da die ObjectLockEnabled Eigenschaft nicht auf true festgelegt ist.

Resources: MyS3Bucket: Type: AWS::S3::Bucket Properties: BucketName: amzn-s3-demo-bucket ObjectLockEnabled: false

Wenn diese Regel für die folgende Eingabe ausgeführt wird, ist sie gültig, da die auf gesetzt ObjectLockEnabled isttrue.

Resources: MyS3Bucket: Type: AWS::S3::Bucket Properties: BucketName: amzn-s3-demo-bucket ObjectLockEnabled: true

Wenn ein Hook fehlschlägt, werden die fehlgeschlagenen Regeln zurück an unsere CloudFormation Cloud Control API weitergegeben. Wenn ein Logging-Bucket für den Guard Hook konfiguriert wurde, wird dort zusätzliches Regelfeedback bereitgestellt. Dieses zusätzliche Feedback beinhaltet die Violation und Fix Informationen.

Regeln für Stack Operation Guard

Wenn ein CloudFormation Stack erstellt, aktualisiert oder gelöscht wird, können Sie Ihren Guard Hook so konfigurieren, dass er mit der Auswertung der neuen Vorlage beginnt und möglicherweise die Fortsetzung des Stack-Vorgangs blockiert. In der Konfiguration für Ihren Hook können Sie Ihren Guard Hook so TargetOperations konfigurieren, dass er auf STACK Operationen abzielt.

Guard Stack-Eingabesyntax

Die Eingabe für Guard-Stack-Operationen stellt die gesamte CloudFormation Vorlage zur Auswertung Ihrer Guard-Regeln bereit.

Das Folgende ist ein Beispiel für die Form einer Stack-Eingabe:

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

Die ID der, die die Ressource AWS-Konto enthält.

StackId

Die Stack-ID des CloudFormation Stacks, der Teil der Stackoperation ist.

HookTypeName

Der Name des Hooks, der gerade ausgeführt wird.

HookTypeVersion

Die Version des Hooks, der ausgeführt wird.

InvocationPoint

Der genaue Punkt in der Bereitstellungslogik, an dem der Hook ausgeführt wird.

Gültige Werte: (CREATE_PRE_PROVISION| UPDATE_PRE_PROVISION |DELETE_PRE_PROVISION)

TargetName

Der Name des Stacks, der ausgewertet wird.

TargetType

Dieser Wert wird angegeben, STACK wenn er als Hook auf Stackebene ausgeführt wird.

ChangeSetId

Die Änderungssatz-ID, die ausgeführt wurde, um den Hook-Aufruf auszulösen. Dieser Wert ist leer, wenn der Stack-Vorgang durch eine create-stackupdate-stack, delete-stack OR-Operation initiiert wurde.

Proposed CloudFormation Template

Der vollständige CloudFormation Vorlagenwert, der an unsere CloudFormation create-stack update-stack Operationen übergeben wurde. Dazu gehören Dinge wie ResourcesOutputs, undProperties. Es kann eine JSON- oder YAML-Zeichenfolge sein, je nachdem, was bereitgestellt wurde. CloudFormation

Bei delete-stack Operationen ist dieser Wert leer.

Previous

Die letzte erfolgreich bereitgestellte CloudFormation Vorlage. Dieser Wert ist leer, wenn der Stapel erstellt oder gelöscht wird.

Bei delete-stack Operationen ist dieser Wert leer.

Anmerkung

Die bereitgestellten Vorlagen sind das, was an create oder update Stack-Operationen übergeben wird. Beim Löschen eines Stacks werden keine Vorlagenwerte bereitgestellt.

Beispiel: Eingabe einer Guard-Stack-Operation

Die folgende Beispieleingabe zeigt einen Guard-Hook, der eine vollständige Vorlage und die zuvor bereitgestellte Vorlage erhält. Die Vorlage in diesem Beispiel verwendet das JSON-Format.

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": {} } } }

Schutzregeln für Stack-Änderungen

Wenn ein Guard-Hook Stack-Änderungen auswertet, lädt er zunächst alle mit dem Hook konfigurierten Regeln herunter. Diese Regeln werden dann anhand der Ressourceneingabe ausgewertet. Der Hook schlägt fehl, wenn Regeln ihre Bewertung nicht bestehen. Wenn es keine Fehler gibt, wird der Hook bestanden.

Das folgende Beispiel ist eine Guard-Regel, die auswertet, ob es AWS::S3::Bucket Ressourcentypen gibt, die eine aufgerufene Eigenschaft enthaltenBucketEncryption, deren Wert entweder auf aws:kms oder SSEAlgorithm AES256 gesetzt ist.

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" >> }

Wenn die Regel mit der folgenden Vorlage ausgeführt wird, wird fail sie ausgeführt.

AWSTemplateFormatVersion: 2010-09-09 Description: S3 bucket without default encryption Resources: EncryptedS3Bucket: Type: 'AWS::S3::Bucket' Properties: BucketName: !Sub 'encryptedbucket-${AWS::Region}-${AWS::AccountId}'

Wenn die Regel mit der folgenden Vorlage ausgeführt wird, wird sie ausgeführtpass.

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

Ändern Sie die Regeln für Operation Guard

Wenn ein CloudFormation Änderungssatz erstellt wird, können Sie Ihren Guard Hook so konfigurieren, dass die Vorlage und die im Änderungssatz vorgeschlagenen Änderungen ausgewertet werden, um die Ausführung des Änderungssatzes zu blockieren.

Guard-Änderungssatz-Eingabesyntax

Die Guard-Change-Set-Eingabe besteht aus den Daten, die Ihren Guard-Regeln zur Auswertung zur Verfügung gestellt werden.

Im Folgenden finden Sie ein Beispiel für die Form einer Change-Set-Eingabe:

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}]

Die ResourceChange Modellsyntax lautet:

logisch ResourceId: String RessourcenTyp: String action: CREATE, UPDATE, DELETE Zeilennummer: Number BeforeContext: JSON String AfterContext: JSON String
HookContext
AWSAccountID

Die ID der Ressource AWS-Konto , die die Ressource enthält.

StackId

Die Stack-ID des CloudFormation Stacks, der Teil der Stackoperation ist.

HookTypeName

Der Name des Hooks, der gerade ausgeführt wird.

HookTypeVersion

Die Version des Hooks, der ausgeführt wird.

InvocationPoint

Der genaue Punkt in der Bereitstellungslogik, an dem der Hook ausgeführt wird.

Gültige Werte: (CREATE_PRE_PROVISION| UPDATE_PRE_PROVISION |DELETE_PRE_PROVISION)

TargetName

Der Name des Stacks, der ausgewertet wird.

TargetType

Dieser Wert wird angegeben, CHANGE_SET wenn er als Hook auf Change-Set-Ebene ausgeführt wird.

TargetLogicalId

Dieser Wert wird der ARN des Änderungssatzes sein.

ChangeSetId

Die Änderungssatz-ID, die ausgeführt wurde, um den Hook-Aufruf auszulösen. Dieser Wert ist leer, wenn der Stack-Vorgang durch eine create-stackupdate-stack, delete-stack OR-Operation initiiert wurde.

Proposed CloudFormation Template

Die vollständige CloudFormation Vorlage, die für einen create-change-set Vorgang bereitgestellt wurde. Es kann sich um eine JSON- oder YAML-Zeichenfolge handeln, je nachdem, was bereitgestellt wurde. CloudFormation

Previous

Die letzte erfolgreich bereitgestellte CloudFormation Vorlage. Dieser Wert ist leer, wenn der Stapel erstellt oder gelöscht wird.

Changes

Das Changes Modell. Dies listet die Ressourcenänderungen auf.

Änderungen
logisch ResourceId

Der logische Ressourcenname der geänderten Ressource.

RessourcenTyp

Der Ressourcentyp, der geändert wird.

action

Die Art der Operation, die für die Ressource ausgeführt wird.

Gültige Werte: (CREATE| UPDATE |DELETE)

Zeilennummer

Die Zeilennummer in der Vorlage, die der Änderung zugeordnet ist.

BeforeContext

Eine JSON-Zeichenfolge mit Eigenschaften der Ressource vor der Änderung:

{"properties": {"property1": "value"}}
AfterContext

Eine JSON-Zeichenfolge mit Eigenschaften der Ressource nach der Änderung:

{"properties": {"property1": "new value"}}

Beispiel für eine Guard-Change-Set-Operationseingabe

Die folgende Beispieleingabe zeigt einen Guard-Hook, der eine vollständige Vorlage, die zuvor bereitgestellte Vorlage und eine Liste von Ressourcenänderungen erhält. Die Vorlage in diesem Beispiel verwendet das JSON-Format.

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\"}}}" } ]

Schutzregel für Change-Set-Operationen

Das folgende Beispiel ist eine Guard-Regel, die Änderungen an Amazon S3-Buckets auswertet und sicherstellt, dass diese VersionConfiguration nicht deaktiviert werden.

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' } }