

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Tulis aturan Guard untuk mengevaluasi sumber daya untuk Guard Hooks
<a name="guard-hooks-write-rules"></a>

AWS CloudFormation Guard adalah bahasa khusus domain open-source dan tujuan umum (DSL) yang dapat Anda gunakan untuk menulis. policy-as-code Topik ini menjelaskan cara menggunakan Guard to author contoh aturan yang dapat dijalankan di Guard Hook untuk mengevaluasi CloudFormation dan AWS Cloud Control API operasi secara otomatis. Ini juga akan fokus pada berbagai jenis input yang tersedia untuk aturan Guard Anda tergantung pada kapan Guard Hook Anda berjalan. Guard Hook dapat dikonfigurasi untuk dijalankan selama jenis operasi berikut:
+ Operasi sumber daya
+ Operasi tumpukan
+ Ubah operasi set

Untuk informasi selengkapnya tentang menulis aturan Penjaga, lihat [AWS CloudFormation Guard Aturan penulisan](https://docs.aws.amazon.com/cfn-guard/latest/ug/writing-rules.html)

**Topics**
+ [Operasi sumber daya Aturan penjaga](#guard-hooks-write-rules-resource-operations)
+ [Aturan Penjaga operasi tumpukan](#guard-hooks-write-rules-stack-operations)
+ [Ubah aturan Penjaga operasi yang ditetapkan](#guard-hooks-write-rules-change-set-operations)

## Operasi sumber daya Aturan penjaga
<a name="guard-hooks-write-rules-resource-operations"></a>

Setiap kali Anda membuat, memperbarui, atau menghapus sumber daya, itu dianggap sebagai operasi sumber daya. Sebagai contoh, jika Anda menjalankan pembaruan CloudFormation tumpukan yang membuat sumber daya baru, Anda telah menyelesaikan operasi sumber daya. Saat Anda membuat, memperbarui, atau menghapus sumber daya menggunakan Cloud Control API, itu juga dianggap sebagai operasi sumber daya. Anda dapat mengkonfigurasi Guard Hook Anda untuk menargetkan `RESOURCE` dan `CLOUD_CONTROL` operasi dalam `TargetOperations` konfigurasi untuk Hook Anda. Ketika Guard Hook Anda mengevaluasi operasi sumber daya, mesin Guard mengevaluasi input sumber daya.

**Topics**
+ [Sintaks masukan sumber daya jaga](#guard-hooks-write-rules-resource-operations-input)
+ [Contoh masukan operasi sumber daya Guard](#guard-hooks-write-rules-resource-operations-example)
+ [Aturan penjaga untuk perubahan sumber daya](#guard-hooks-rules-resource-changes)

### Sintaks masukan sumber daya jaga
<a name="guard-hooks-write-rules-resource-operations-input"></a>

Input sumber daya Guard adalah data yang tersedia untuk aturan Guard Anda untuk dievaluasi.

Berikut ini adalah contoh bentuk input sumber daya:

```
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`  <a name="guard-hook-resource-hookcontext"></a>  
`AWSAccountID`  <a name="guard-hook-resource-awsaccountid"></a>
ID yang Akun AWS berisi sumber daya yang sedang dievaluasi.  
`StackId`  <a name="guard-hook-resource-stackid"></a>
ID tumpukan CloudFormation tumpukan yang merupakan bagian dari operasi sumber daya. Ini kosong jika penelepon adalah Cloud Control API.  
`HookTypeName`  <a name="guard-hook-resource-hooktypename"></a>
Nama Hook yang sedang berjalan.  
`HookTypeVersion`  <a name="guard-hook-resource-hooktypeversion"></a>
Versi Hook yang sedang berjalan.  
`InvocationPoint`  <a name="guard-hook-resource-invocationpoint"></a>
Titik yang tepat dalam logika penyediaan tempat Hook berjalan.  
*Nilai yang valid*: (`CREATE_PRE_PROVISION`\$1 `UPDATE_PRE_PROVISION` \$1`DELETE_PRE_PROVISION`)  
`TargetName`  <a name="guard-hook-resource-targetname"></a>
Jenis target yang dievaluasi, misalnya,`AWS::S3::Bucket`.  
`TargetType`  <a name="guard-hook-resource-targettype"></a>
Jenis target yang sedang dievaluasi, misalnya`AWS::S3::Bucket`. Untuk sumber daya yang disediakan dengan Cloud Control API, nilai ini akan menjadi. `RESOURCE`  
`TargetLogicalId`  <a name="guard-hook-resource-targetlogicalid"></a>
Sumber `TargetLogicalId` daya yang sedang dievaluasi. Jika asal Hook adalah CloudFormation, ini akan menjadi ID logis (juga dikenal sebagai nama logis) dari sumber daya. Jika asal Hook adalah Cloud Control API, ini akan menjadi nilai yang dibangun.  
`ChangeSetId`  <a name="guard-hook-resource-changesetid"></a>
Perubahan set ID yang dieksekusi menyebabkan pemanggilan Hook. Nilai ini kosong jika perubahan sumber daya dimulai oleh Cloud Control API, atau `create-stack``update-stack`, atau `delete-stack` operasi.

`Resources`  <a name="guard-hook-resource-resources"></a>  
`ResourceLogicalID`  <a name="guard-hook-resource-current-resourcelogicalid"></a>
Ketika operasi dimulai oleh CloudFormation, `ResourceLogicalID` adalah ID logis dari sumber daya dalam CloudFormation template.  
Ketika operasi dimulai oleh Cloud Control API, `ResourceLogicalID` ini adalah kombinasi dari jenis sumber daya, nama, ID operasi, dan ID permintaan.  
`ResourceType`  <a name="guard-hook-resource-current-resourcetype"></a>
Jenis nama sumber daya (contoh:`AWS::S3::Bucket`).  
`ResourceProperties`  <a name="guard-hook-resource-current-resourceproperties"></a>
Properti yang diusulkan dari sumber daya yang sedang dimodifikasi. Saat Guard Hook berjalan melawan perubahan CloudFormation sumber daya, fungsi, parameter, dan transformasi apa pun akan diselesaikan sepenuhnya. Jika sumber daya dihapus, nilai ini akan kosong.

`Previous`  <a name="guard-hook-resource-previous"></a>  
`ResourceLogicalID`  <a name="guard-hook-resource-previous-resourcelogicalid"></a>
Ketika operasi dimulai oleh CloudFormation, `ResourceLogicalID` adalah ID logis dari sumber daya dalam CloudFormation template.  
Ketika operasi dimulai oleh Cloud Control API, `ResourceLogicalID` ini adalah kombinasi dari jenis sumber daya, nama, ID operasi, dan ID permintaan.  
`ResourceType`  <a name="guard-hook-resource-previous-resourcetype"></a>
Jenis nama sumber daya (contoh:`AWS::S3::Bucket`).  
`ResourceProperties`  <a name="guard-hook-resource-previous-resourceproperties"></a>
Properti saat ini terkait dengan sumber daya yang sedang dimodifikasi. Jika sumber daya dihapus, nilai ini akan kosong.

### Contoh masukan operasi sumber daya Guard
<a name="guard-hooks-write-rules-resource-operations-example"></a>

Contoh masukan berikut menunjukkan Guard Hook yang akan menerima definisi `AWS::S3::Bucket` sumber daya untuk diperbarui. Ini adalah data yang tersedia untuk Guard untuk evaluasi.

```
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
```

Untuk melihat semua properti yang tersedia untuk jenis sumber daya, lihat [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-s3-bucket.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-s3-bucket.html).

### Aturan penjaga untuk perubahan sumber daya
<a name="guard-hooks-rules-resource-changes"></a>

Ketika Guard Hook mengevaluasi perubahan sumber daya, itu dimulai dengan mengunduh semua aturan yang dikonfigurasi dengan Hook. Aturan-aturan ini kemudian dievaluasi terhadap input sumber daya. Hook akan gagal jika ada aturan yang gagal dalam evaluasi mereka. Jika tidak ada kegagalan, Hook akan lewat.

Contoh berikut adalah aturan Guard yang mengevaluasi apakah `ObjectLockEnabled` properti adalah `true` untuk jenis `AWS::S3::Bucket` sumber daya apa pun.

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

Ketika aturan ini berjalan terhadap input berikut, itu akan gagal karena `ObjectLockEnabled` properti tidak disetel ke`true`.

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

Ketika aturan ini berjalan terhadap input berikut, itu akan berlalu karena `ObjectLockEnabled` diatur ke`true`.

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

Ketika Hook gagal, aturan yang gagal akan disebarkan kembali ke CloudFormation atau Cloud Control API. Jika bucket logging telah dikonfigurasi untuk Guard Hook, umpan balik aturan tambahan akan diberikan di sana. Umpan balik tambahan ini mencakup `Violation` dan `Fix` informasi.

## Aturan Penjaga operasi tumpukan
<a name="guard-hooks-write-rules-stack-operations"></a>

Saat CloudFormation tumpukan dibuat, diperbarui, atau dihapus, Anda dapat mengonfigurasi Guard Hook untuk memulai dengan mengevaluasi template baru dan berpotensi memblokir operasi tumpukan agar tidak dilanjutkan. Anda dapat mengonfigurasi Guard Hook Anda untuk menargetkan `STACK` operasi dalam `TargetOperations` konfigurasi untuk Hook Anda.

**Topics**
+ [Sintaks masukan tumpukan penjaga](#guard-hooks-write-rules-stack-operations-input)
+ [Contoh masukan operasi tumpukan Guard](#guard-hooks-write-rules-stack-operations-example)
+ [Aturan penjaga untuk perubahan tumpukan](#guard-hooks-rules-stack-changes)

### Sintaks masukan tumpukan penjaga
<a name="guard-hooks-write-rules-stack-operations-input"></a>

Input untuk operasi tumpukan Guard menyediakan seluruh CloudFormation template untuk dievaluasi aturan Guard Anda.

Berikut ini adalah contoh bentuk input 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`  <a name="guard-hook-stack-hookcontext"></a>  
`AWSAccountID`  <a name="guard-hook-stack-awsaccountid"></a>
ID yang Akun AWS berisi sumber daya.  
`StackId`  <a name="guard-hook-stack-stackid"></a>
ID tumpukan CloudFormation tumpukan yang merupakan bagian dari operasi tumpukan.  
`HookTypeName`  <a name="guard-hook-stack-hooktypename"></a>
Nama Hook yang sedang berjalan.  
`HookTypeVersion`  <a name="guard-hook-stack-hooktypeversion"></a>
Versi Hook yang sedang berjalan.  
`InvocationPoint`  <a name="guard-hook-stack-invocationpoint"></a>
Titik yang tepat dalam logika penyediaan tempat Hook berjalan.  
*Nilai yang valid*: (`CREATE_PRE_PROVISION`\$1 `UPDATE_PRE_PROVISION` \$1`DELETE_PRE_PROVISION`)  
`TargetName`  <a name="guard-hook-stack-targetname"></a>
Nama tumpukan yang sedang dievaluasi.  
`TargetType`  <a name="guard-hook-stack-targettype"></a>
Nilai ini akan `STACK` saat dijalankan sebagai Hook tingkat tumpukan.  
`ChangeSetId`  <a name="guard-hook-stack-changesetid"></a>
Perubahan set ID yang dieksekusi menyebabkan pemanggilan Hook. Nilai ini kosong jika operasi tumpukan dimulai oleh`create-stack`,`update-stack`, atau `delete-stack` operasi.

`Proposed CloudFormation Template`  <a name="guard-hook-stack-template-current-template"></a>
Nilai CloudFormation template lengkap yang diteruskan ke CloudFormation `create-stack` atau `update-stack` operasi. Ini termasuk hal-hal seperti`Resources`,`Outputs`, dan`Properties`. Ini bisa berupa string JSON atau YAMAL tergantung pada apa yang disediakan. CloudFormation  
Dalam `delete-stack` operasi, nilai ini akan kosong.

`Previous`  <a name="guard-hook-stack-template-previous-template"></a>
 CloudFormation Template terakhir berhasil digunakan. Nilai ini kosong jika tumpukan sedang dibuat atau dihapus.  
Dalam `delete-stack` operasi, nilai ini akan kosong.

**catatan**  
Template yang disediakan adalah apa yang diteruskan ke `create` atau `update` tumpukan operasi. Saat menghapus tumpukan, tidak ada nilai templat yang disediakan.

### Contoh masukan operasi tumpukan Guard
<a name="guard-hooks-write-rules-stack-operations-example"></a>

Contoh masukan berikut menunjukkan Guard Hook yang akan menerima template lengkap dan template yang sebelumnya digunakan. Template dalam contoh ini menggunakan format 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": {}
        }
    }
}
```

### Aturan penjaga untuk perubahan tumpukan
<a name="guard-hooks-rules-stack-changes"></a>

Ketika Guard Hook mengevaluasi perubahan tumpukan, itu dimulai dengan mengunduh semua aturan yang dikonfigurasi dengan Hook. Aturan-aturan ini kemudian dievaluasi terhadap input sumber daya. Hook akan gagal jika ada aturan yang gagal dalam evaluasi mereka. Jika tidak ada kegagalan, Hook akan lewat.

Contoh berikut adalah aturan Guard yang mengevaluasi jika ada jenis `AWS::S3::Bucket` sumber daya yang berisi properti dipanggil`BucketEncryption`, dengan `SSEAlgorithm` set ke salah satu `aws:kms` atau`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"
  >>
}
```

Ketika aturan berjalan terhadap template berikut, itu akan`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}'
```

Ketika aturan berjalan terhadap template berikut, itu akan`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
```

## Ubah aturan Penjaga operasi yang ditetapkan
<a name="guard-hooks-write-rules-change-set-operations"></a>

Saat set CloudFormation perubahan dibuat, Anda dapat mengonfigurasi Guard Hook untuk mengevaluasi template dan perubahan yang diusulkan dalam set perubahan untuk memblokir eksekusi set perubahan.

**Topics**
+ [Perubahan penjaga mengatur sintaks masukan](#guard-hooks-write-rules-change-set-operations-input)
+ [Contoh Guard mengubah set masukan operasi](#guard-hooks-write-rules-change-set-operations-example)
+ [Aturan penjaga untuk operasi set perubahan](#guard-hooks-rules-change-set-operations)

### Perubahan penjaga mengatur sintaks masukan
<a name="guard-hooks-write-rules-change-set-operations-input"></a>

Input set perubahan Guard adalah data yang tersedia untuk aturan Guard Anda untuk dievaluasi.

Berikut ini adalah contoh bentuk dari input set perubahan:

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

Sintaks `ResourceChange` model adalah:

```
logicalResourceId: String 
resourceType: String
tindakan: CREATE, UPDATE, DELETE
LineNumber: Number
sebelumKonteks: JSON String
AfterContext: JSON String
```

`HookContext`  <a name="guard-hook-change-set-hookcontext"></a>  
`AWSAccountID`  <a name="guard-hook-change-set-awsaccountid"></a>
ID yang Akun AWS berisi sumber daya.  
`StackId`  <a name="guard-hook-change-set-stackid"></a>
ID tumpukan CloudFormation tumpukan yang merupakan bagian dari operasi tumpukan.  
`HookTypeName`  <a name="guard-hook-change-set-hooktypename"></a>
Nama Hook yang sedang berjalan.  
`HookTypeVersion`  <a name="guard-hook-change-set-hooktypeversion"></a>
Versi Hook yang sedang berjalan.  
`InvocationPoint`  <a name="guard-hook-change-set-invocationpoint"></a>
Titik yang tepat dalam logika penyediaan tempat Hook berjalan.  
*Nilai yang valid*: (`CREATE_PRE_PROVISION`\$1 `UPDATE_PRE_PROVISION` \$1`DELETE_PRE_PROVISION`)  
`TargetName`  <a name="guard-hook-change-set-targetname"></a>
Nama tumpukan yang sedang dievaluasi.  
`TargetType`  <a name="guard-hook-change-set-targettype"></a>
Nilai ini akan `CHANGE_SET` ketika berjalan sebagai perubahan set-level Hook.  
`TargetLogicalId`  <a name="guard-hook-change-set-targetlogicalid"></a>
Nilai ini akan menjadi ARN dari set perubahan.  
`ChangeSetId`  <a name="guard-hook-change-set-changesetid"></a>
Perubahan set ID yang dieksekusi menyebabkan pemanggilan Hook. Nilai ini kosong jika operasi tumpukan dimulai oleh`create-stack`,`update-stack`, atau `delete-stack` operasi.

`Proposed CloudFormation Template`  <a name="guard-hook-change-set-current-template"></a>
 CloudFormation Template lengkap yang disediakan untuk `create-change-set` operasi. Ini bisa berupa string JSON atau YAMAL tergantung pada apa yang disediakan. CloudFormation

`Previous`  <a name="guard-hook-change-set-previous-template"></a>
 CloudFormation Template terakhir berhasil digunakan. Nilai ini kosong jika tumpukan sedang dibuat atau dihapus.

`Changes`  <a name="guard-hook-change-set-changes"></a>
`Changes`Modelnya. Ini mencantumkan perubahan sumber daya.

Perubahan    
logicalResourceId  <a name="guard-hook-change-set-change-logicalresourceid"></a>
Nama sumber daya logis dari sumber daya yang diubah.  
resourceType  <a name="guard-hook-change-set-change-resourcetype"></a>
Jenis sumber daya yang akan diubah.  
tindakan  <a name="guard-hook-change-set-change-action"></a>
Jenis operasi yang dilakukan pada sumber daya.  
*Nilai yang valid*: (`CREATE`\$1 `UPDATE` \$1`DELETE`)  
LineNumber  <a name="guard-hook-change-set-change-linenumber"></a>
Nomor baris dalam template yang terkait dengan perubahan.  
sebelumKonteks  <a name="guard-hook-change-set-change-beforecontext"></a>
Sebuah string JSON properti sumber daya sebelum perubahan:  

```
{"properties": {"property1": "value"}}
```  
AfterContext  <a name="guard-hook-change-set-change-aftercontext"></a>
Sebuah string JSON properti sumber daya setelah perubahan:  

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

### Contoh Guard mengubah set masukan operasi
<a name="guard-hooks-write-rules-change-set-operations-example"></a>

Contoh masukan berikut menunjukkan Guard Hook yang akan menerima template lengkap, template yang sebelumnya digunakan, dan daftar perubahan sumber daya. Template dalam contoh ini menggunakan format 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\"}}}"
  }
]
```

### Aturan penjaga untuk operasi set perubahan
<a name="guard-hooks-rules-change-set-operations"></a>

Contoh berikut adalah aturan Penjaga yang mengevaluasi perubahan pada bucket Amazon S3, dan memastikan `VersionConfiguration` bahwa tidak dinonaktifkan.

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