翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
ガードフックのリソースを評価するためのガードルールを記述する
AWS CloudFormation Guard は、policy-as-codeの作成に使用できるオープンソースおよび汎用のドメイン固有の言語 (DSL) です。このトピックでは、Guard を使用して、Guard Hook で実行して CloudFormation と AWS クラウドコントロール API オペレーションを自動的に評価できるルールの例を作成する方法について説明します。また、ガードフックが実行されるタイミングに応じて、ガードルールで使用できるさまざまなタイプの入力にも焦点を当てます。ガードフックは、次のタイプのオペレーション中に実行するように設定できます。
-
リソースオペレーション
-
スタックオペレーション
-
変更セットオペレーション
ガードルールの記述の詳細については、「ルールの記述 AWS CloudFormation Guard」を参照してください。
リソースオペレーションのガードルール
リソースを作成、更新、または削除するときはいつでも、リソースオペレーションと見なされます。たとえば、新しいリソースを作成する CloudFormation スタックの更新を実行すると、リソースオペレーションが完了しました。Cloud Control API を使用してリソースを作成、更新、または削除すると、リソースオペレーションとも見なされます。フックの設定で RESOURCEおよび CLOUD_CONTROLオペレーションをターゲットにするように ガードフックTargetOperationsを設定できます。ガードフックがリソースオペレーションを評価すると、ガードエンジンはリソース入力を評価します。
ガードリソース入力構文
Guard リソース入力は、評価するために Guard ルールで使用できるデータです。
リソース入力の形状の例を次に示します。
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-
評価対象のリソース AWS アカウント を含む の ID。
StackId-
リソースオペレーションの一部である CloudFormation スタックのスタック ID。呼び出し元が Cloud Control API の場合、これは空です。
HookTypeName-
実行中のフックの名前。
HookTypeVersion-
実行中のフックのバージョン。
InvocationPoint-
フックが実行されるプロビジョニングロジックの正確なポイント。
有効な値: (
CREATE_PRE_PROVISION|UPDATE_PRE_PROVISION|DELETE_PRE_PROVISION) TargetName-
評価されるターゲットタイプ。例:
AWS::S3::Bucket。 TargetType-
評価されるターゲットタイプ。例:
AWS::S3::Bucket。Cloud Control API でプロビジョニングされたリソースの場合、この値は になりますRESOURCE。 TargetLogicalId-
評価対象のリソース
TargetLogicalIdの 。フックのオリジンが CloudFormation の場合、これはリソースの論理 ID (論理名とも呼ばれます) になります。フックのオリジンが Cloud Control API の場合、これは構築された値になります。 ChangeSetId-
フック呼び出しを引き起こすために実行された変更セット ID。リソースの変更が Cloud Control API、、、
create-stackupdate-stackまたはdelete-stackオペレーションによって開始された場合、この値は空です。
Resources-
ResourceLogicalID-
オペレーションが CloudFormation によって開始されると、
ResourceLogicalIDは CloudFormation テンプレート内のリソースの論理 ID です。オペレーションが Cloud Control API によって開始されると、
ResourceLogicalIDはリソースタイプ、名前、オペレーション ID、リクエスト ID の組み合わせになります。 ResourceType-
リソースのタイプ名 (例:
AWS::S3::Bucket)。 ResourceProperties-
変更するリソースの提案されたプロパティ。Guard Hook が CloudFormation リソースに対して実行されている場合、関数、パラメータ、変換はすべて完全に解決されます。リソースが削除されている場合、この値は空になります。
Previous-
ResourceLogicalID-
オペレーションが CloudFormation によって開始されると、
ResourceLogicalIDは CloudFormation テンプレート内のリソースの論理 ID です。オペレーションが Cloud Control API によって開始されると、
ResourceLogicalIDはリソースタイプ、名前、オペレーション ID、リクエスト ID の組み合わせになります。 ResourceType-
リソースのタイプ名 (例:
AWS::S3::Bucket)。 ResourceProperties-
変更するリソースに関連付けられている現在のプロパティ。リソースが削除されている場合、この値は空になります。
Guard リソースオペレーション入力の例
次の入力例は、更新するAWS::S3::Bucketリソースの定義を受け取る Guard Hook を示しています。これは、Guard が評価に使用できるデータです。
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
リソースタイプで使用できるすべてのプロパティを確認するには、「」を参照してくださいAWS::S3::Bucket。
リソース変更のガードルール
ガードフックがリソースの変更を評価するとき、まずフックで設定されたすべてのルールをダウンロードします。これらのルールは、リソース入力に対して評価されます。いずれかのルールが評価に失敗すると、フックは失敗します。失敗がない場合、フックは成功します。
次の例は、 ObjectLockEnabledプロパティが任意のAWS::S3::Bucketリソースタイプtrue用であるかどうかを評価する Guard ルールです。
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. >> }
次の入力に対してこのルールを実行すると、 ObjectLockEnabledプロパティが に設定されていないため失敗しますtrue。
Resources: MyS3Bucket: Type: AWS::S3::Bucket Properties: BucketName:amzn-s3-demo-bucketObjectLockEnabled: false
このルールは次の入力に対して実行されると、 ObjectLockEnabledが に設定されているため、渡されますtrue。
Resources: MyS3Bucket: Type: AWS::S3::Bucket Properties: BucketName:amzn-s3-demo-bucketObjectLockEnabled: true
フックが失敗すると、失敗したルールは CloudFormation または Cloud Control API に伝達されます。Guard Hook にログ記録バケットが設定されている場合、そこに追加のルールフィードバックが提供されます。この追加のフィードバックには、 Violationおよび Fix情報が含まれます。
スタックオペレーションのガードルール
CloudFormation スタックが作成、更新、または削除されると、新しいテンプレートを評価してスタックオペレーションの進行をブロックできるように Guard Hook を設定できます。フックの設定でSTACKオペレーションをターゲットにするように ガードフックTargetOperationsを設定できます。
ガードスタックの入力構文
Guard スタックオペレーションの入力は、Guard ルールが評価する CloudFormation テンプレート全体を提供します。
スタック入力の形状の例を次に示します。
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-
リソース AWS アカウント を含む の ID。
StackId-
スタックオペレーションの一部である CloudFormation スタックのスタック ID。
HookTypeName-
実行中のフックの名前。
HookTypeVersion-
実行中のフックのバージョン。
InvocationPoint-
フックが実行されるプロビジョニングロジックの正確なポイント。
有効な値: (
CREATE_PRE_PROVISION|UPDATE_PRE_PROVISION|DELETE_PRE_PROVISION) TargetName-
評価対象のスタックの名前。
TargetType-
この値は、スタックレベルのフックとして を実行する
STACKときに になります。 ChangeSetId-
フック呼び出しを引き起こすために実行された変更セット ID。スタックオペレーションが
create-stack、、またはdelete-stackオペレーションによって開始された場合update-stack、この値は空です。
Proposed CloudFormation Template-
CloudFormation
create-stackまたはupdate-stackオペレーションに渡された CloudFormation テンプレートの完全な値。これには、Resources、、Outputsなどが含まれますProperties。CloudFormation に提供された内容に応じて、JSON または YAML 文字列にすることができます。delete-stackオペレーションでは、この値は空になります。 Previous-
最後に正常にデプロイされた CloudFormation テンプレート。スタックを作成または削除する場合、この値は空です。
delete-stackオペレーションでは、この値は空になります。
注記
提供されるテンプレートは、 createまたは updateスタックオペレーションに渡されます。スタックを削除する場合、テンプレート値は指定されません。
Guard スタックオペレーション入力の例
次の入力例は、完全なテンプレートと以前にデプロイされたテンプレートを受け取る Guard Hook を示しています。この例のテンプレートは 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": {} } } }
スタック変更のガードルール
ガードフックがスタックの変更を評価するとき、まずフックで設定されたすべてのルールをダウンロードします。これらのルールは、リソース入力に対して評価されます。いずれかのルールが評価に失敗すると、フックは失敗します。失敗がない場合、フックは成功します。
次の例は、 を aws:kmsまたは SSEAlgorithmに設定してBucketEncryption、 というプロパティを含むAWS::S3::Bucketリソースタイプがあるかどうかを評価する Guard ルールです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" >> }
ルールが次のテンプレートに対して実行されると、 になります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}'
ルールが次のテンプレートに対して実行されると、 になります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
変更セットオペレーションのガードルール
CloudFormation 変更セットが作成されると、変更セットで提案されたテンプレートと変更を評価して変更セットの実行をブロックするように Guard Hook を設定できます。
ガード変更セットの入力構文
ガード変更セット入力は、Guard ルールが評価できるようにするデータです。
以下は、変更セット入力の形状の例です。
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}]
ResourceChange モデル構文は次のとおりです。
logicalResourceId: String resourceType: String アクション: CREATE, UPDATE, DELETE lineNumber: Number beforeContext: JSON String afterContext: JSON String
HookContext-
AWSAccountID-
リソース AWS アカウント を含む の ID。
StackId-
スタックオペレーションの一部である CloudFormation スタックのスタック ID。
HookTypeName-
実行中のフックの名前。
HookTypeVersion-
実行中のフックのバージョン。
InvocationPoint-
フックが実行されるプロビジョニングロジックの正確なポイント。
有効な値: (
CREATE_PRE_PROVISION|UPDATE_PRE_PROVISION|DELETE_PRE_PROVISION) TargetName-
評価対象のスタックの名前。
TargetType-
この値は、変更セットレベルのフックとして を実行する
CHANGE_SETときに になります。 TargetLogicalId-
この値は、変更セットの ARN になります。
ChangeSetId-
フック呼び出しを引き起こすために実行された変更セット ID。スタックオペレーションが
create-stack、、またはdelete-stackオペレーションによって開始された場合update-stack、この値は空です。
Proposed CloudFormation Template-
create-change-setオペレーションに提供された完全な CloudFormation テンプレート。CloudFormation に提供された内容に応じて、JSON または YAML 文字列にすることができます。 Previous-
最後に正常にデプロイされた CloudFormation テンプレート。スタックを作成または削除する場合、この値は空です。
Changes-
Changesモデル。これにより、リソースの変更が一覧表示されます。
- 変更
-
- logicalResourceId
-
変更されたリソースの論理リソース名。
- resourceType
-
変更されるリソースタイプ。
- アクション
-
リソースで実行されるオペレーションのタイプ。
有効な値: (
CREATE|UPDATE|DELETE) - lineNumber
-
変更に関連付けられたテンプレートの行番号。
- beforeContext
-
変更前のリソースのプロパティの JSON 文字列:
{"properties": {"property1": "value"}} - afterContext
-
変更後のリソースのプロパティの JSON 文字列:
{"properties": {"property1": "new value"}}
ガード変更セットオペレーション入力の例
次の入力例は、完全なテンプレート、以前にデプロイされたテンプレート、およびリソース変更のリストを受け取る Guard Hook を示しています。この例のテンプレートは 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\"}}}" } ]
変更セットオペレーションのガードルール
次の例は、Amazon S3 バケットの変更を評価し、 が無効にならないようにする Guard ルールVersionConfigurationです。
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' } }