

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

# Menetapkan dan mereferensikan variabel dalam aturan Guard
<a name="variables"></a>

Anda dapat menetapkan variabel dalam file AWS CloudFormation Guard aturan untuk menyimpan informasi yang ingin Anda referensikan dalam aturan Guard Anda. Guard mendukung penugasan variabel satu tembakan. Variabel dievaluasi dengan malas, artinya Guard hanya mengevaluasi variabel ketika aturan dijalankan.

**Topics**
+ [Menetapkan variabel](#assigning-variables)
+ [Variabel referensi](#referencing-variables)
+ [Lingkup variabel](#variable-scope)
+ [Contoh variabel dalam file aturan Guard](#variables-examples)

## Menetapkan variabel
<a name="assigning-variables"></a>

Gunakan `let` kata kunci untuk menginisialisasi dan menetapkan variabel. Sebagai praktik terbaik, gunakan kasus ular untuk nama variabel. Variabel dapat menyimpan literal statis atau properti dinamis yang dihasilkan dari kueri. Dalam contoh berikut, variabel `ecs_task_definition_task_role_arn` menyimpan nilai string statis`arn:aws:iam:123456789012:role/my-role-name`.

```
let ecs_task_definition_task_role_arn = 'arn:aws:iam::123456789012:role/my-role-name'
```

Dalam contoh berikut, variabel `ecs_tasks` menyimpan hasil kueri yang mencari semua `AWS::ECS::TaskDefinition` sumber daya dalam CloudFormation template. Anda dapat merujuk `ecs_tasks` untuk mengakses informasi tentang sumber daya tersebut ketika Anda menulis aturan.

```
let ecs_tasks = Resources.*[
    Type == 'AWS::ECS::TaskDefinition'
]
```

## Variabel referensi
<a name="referencing-variables"></a>

Gunakan `%` awalan untuk mereferensikan variabel.

Berdasarkan contoh `ecs_task_definition_task_role_arn` variabel di[Menetapkan variabel](#assigning-variables), Anda dapat referensi `ecs_task_definition_task_role_arn` di `query|value literal` bagian klausa aturan Guard. Menggunakan referensi itu memastikan bahwa nilai yang ditentukan untuk `TaskDefinitionArn` properti sumber `AWS::ECS::TaskDefinition` daya apa pun dalam CloudFormation template adalah nilai string statis`arn:aws:iam:123456789012:role/my-role-name`.

```
Resources.*.Properties.TaskDefinitionArn == %ecs_task_definition_role_arn
```

Berdasarkan contoh `ecs_tasks` variabel di[Menetapkan variabel](#assigning-variables), Anda dapat mereferensikan `ecs_tasks` dalam kueri (misalnya, %ecs\_tasks.properties). Pertama, Guard mengevaluasi variabel `ecs_tasks` dan kemudian menggunakan nilai yang dikembalikan untuk melintasi hierarki. Jika variabel `ecs_tasks` menyelesaikan nilai non-string, maka Guard melempar kesalahan.

**catatan**  
Saat ini, Guard tidak mendukung variabel referensi di dalam pesan kesalahan khusus.

## Lingkup variabel
<a name="variable-scope"></a>

Lingkup mengacu pada visibilitas variabel yang didefinisikan dalam file aturan. Sebuah nama variabel hanya dapat digunakan sekali dalam lingkup. Ada tiga tingkat di mana variabel dapat dideklarasikan, atau tiga kemungkinan cakupan variabel:
+ **File-level** — Biasanya dideklarasikan di bagian atas file aturan, Anda dapat menggunakan variabel tingkat file di semua aturan dalam file aturan. Mereka terlihat ke seluruh file.

  Dalam contoh berikut aturan file, variabel `ecs_task_definition_task_role_arn` dan `ecs_task_definition_execution_role_arn` diinisialisasi pada file-tingkat.

  ```
  let ecs_task_definition_task_role_arn = 'arn:aws:iam::123456789012:role/my-task-role-name'
  let ecs_task_definition_execution_role_arn = 'arn:aws:iam::123456789012:role/my-execution-role-name'
  
  rule check_ecs_task_definition_task_role_arn
  {
      Resources.*.Properties.TaskRoleArn == %ecs_task_definition_task_role_arn
  }
  
  rule check_ecs_task_definition_execution_role_arn
  {
      Resources.*.Properties.ExecutionRoleArn == %ecs_task_definition_execution_role_arn
  }
  ```
+ **Rule-level** — Dideklarasikan dalam aturan, variabel tingkat aturan hanya terlihat oleh aturan tertentu. Referensi apa pun di luar aturan menghasilkan kesalahan.

  Dalam contoh berikut aturan file, variabel `ecs_task_definition_task_role_arn` dan `ecs_task_definition_execution_role_arn` diinisialisasi pada aturan-tingkat. Hanya `ecs_task_definition_task_role_arn` dapat direferensikan dalam aturan `check_ecs_task_definition_task_role_arn` bernama. Anda hanya dapat mereferensikan `ecs_task_definition_execution_role_arn` variabel dalam aturan `check_ecs_task_definition_execution_role_arn` bernama.

  ```
  rule check_ecs_task_definition_task_role_arn
  {
      let ecs_task_definition_task_role_arn = 'arn:aws:iam::123456789012:role/my-task-role-name'
      Resources.*.Properties.TaskRoleArn == %ecs_task_definition_task_role_arn
  }
  
  rule check_ecs_task_definition_execution_role_arn
  {
      let ecs_task_definition_execution_role_arn = 'arn:aws:iam::123456789012:role/my-execution-role-name'
      Resources.*.Properties.ExecutionRoleArn == %ecs_task_definition_execution_role_arn
  }
  ```
+ **Tingkat blok** — Dideklarasikan dalam blok, seperti `when` klausa, variabel tingkat blok hanya terlihat oleh blok tertentu. Referensi apa pun di luar blok menghasilkan kesalahan.

  Dalam contoh berikut aturan file, variabel `ecs_task_definition_task_role_arn` dan `ecs_task_definition_execution_role_arn` diinisialisasi pada blok-tingkat dalam blok tipe. `AWS::ECS::TaskDefinition` Anda hanya dapat mereferensikan `ecs_task_definition_execution_role_arn` variabel `ecs_task_definition_task_role_arn` dan dalam blok `AWS::ECS::TaskDefinition` tipe untuk aturan masing-masing.

  ```
  rule check_ecs_task_definition_task_role_arn
  {
      AWS::ECS::TaskDefinition
      {
          let ecs_task_definition_task_role_arn = 'arn:aws:iam::123456789012:role/my-task-role-name'
          Properties.TaskRoleArn == %ecs_task_definition_task_role_arn
      }
  }
  
  rule check_ecs_task_definition_execution_role_arn
  {
      AWS::ECS::TaskDefinition
      {
          let ecs_task_definition_execution_role_arn = 'arn:aws:iam::123456789012:role/my-execution-role-name'
          Properties.ExecutionRoleArn == %ecs_task_definition_execution_role_arn
      }
  }
  ```

## Contoh variabel dalam file aturan Guard
<a name="variables-examples"></a>

Bagian berikut memberikan contoh penugasan variabel statis dan dinamis.

### Penugasan statis
<a name="assigning-static-variables"></a>

Berikut ini adalah contoh CloudFormation template.

```
Resources:
  EcsTask:
    Type: 'AWS::ECS::TaskDefinition'
    Properties:
      TaskRoleArn: 'arn:aws:iam::123456789012:role/my-role-name'
```

Berdasarkan template ini, Anda dapat menulis aturan yang disebut `check_ecs_task_definition_task_role_arn` yang memastikan bahwa `TaskRoleArn` properti dari semua sumber daya `AWS::ECS::TaskDefinition` template adalah`arn:aws:iam::123456789012:role/my-role-name`.

```
rule check_ecs_task_definition_task_role_arn
{
    let ecs_task_definition_task_role_arn = 'arn:aws:iam::123456789012:role/my-role-name'
    Resources.*.Properties.TaskRoleArn == %ecs_task_definition_task_role_arn
}
```

Dalam lingkup aturan, Anda dapat menginisialisasi variabel yang dipanggil `ecs_task_definition_task_role_arn` dan menetapkan untuk itu nilai string statis. `'arn:aws:iam::123456789012:role/my-role-name'` Klausa aturan memeriksa apakah nilai yang ditentukan untuk `TaskRoleArn` properti `EcsTask` sumber daya adalah `arn:aws:iam::123456789012:role/my-role-name` dengan mereferensikan `ecs_task_definition_task_role_arn` variabel di bagian tersebut`query|value literal`.

### Penugasan dinamis
<a name="example-dynamic-assignment"></a>

Berikut ini adalah contoh CloudFormation template.

```
Resources:
  EcsTask:
    Type: 'AWS::ECS::TaskDefinition'
    Properties:
      TaskRoleArn: 'arn:aws:iam::123456789012:role/my-role-name'
```

Berdasarkan template ini, Anda dapat menginisialisasi variabel yang disebut `ecs_tasks` dalam lingkup file dan menetapkan untuk itu query. `Resources.*[ Type == 'AWS::ECS::TaskDefinition'` Guard menanyakan semua sumber daya dalam template input dan menyimpan informasi tentang mereka di`ecs_tasks`. Anda juga dapat menulis aturan yang disebut `check_ecs_task_definition_task_role_arn` yang memastikan bahwa `TaskRoleArn` properti dari semua sumber daya `AWS::ECS::TaskDefinition` template `arn:aws:iam::123456789012:role/my-role-name`

```
let ecs_tasks = Resources.*[
    Type == 'AWS::ECS::TaskDefinition'
]

rule check_ecs_task_definition_task_role_arn
{
    %ecs_tasks.Properties.TaskRoleArn == 'arn:aws:iam::123456789012:role/my-role-name'
}
```

Klausa aturan memeriksa apakah nilai yang ditentukan untuk `TaskRoleArn` properti `EcsTask` sumber daya adalah `arn:aws:iam::123456789012:role/my-role-name` dengan mereferensikan `ecs_task_definition_task_role_arn` variabel di bagian tersebut`query`.

### Menegakkan konfigurasi CloudFormation template
<a name="example-3"></a>

Mari kita telusuri contoh kasus penggunaan produksi yang lebih kompleks. Dalam contoh ini, kami menulis aturan Penjaga untuk memastikan kontrol yang lebih ketat tentang bagaimana tugas Amazon ECS didefinisikan.

Berikut ini adalah contoh CloudFormation template.

```
Resources:
  EcsTask:
    Type: 'AWS::ECS::TaskDefinition'
    Properties:
      TaskRoleArn: 
        'Fn::GetAtt': [TaskIamRole, Arn]
      ExecutionRoleArn:
        'Fn::GetAtt': [ExecutionIamRole, Arn]

  TaskIamRole:
    Type: 'AWS::IAM::Role'
    Properties:
      PermissionsBoundary: 'arn:aws:iam::123456789012:policy/MyExamplePolicy'

  ExecutionIamRole:
    Type: 'AWS::IAM::Role'
    Properties:
      PermissionsBoundary: 'arn:aws:iam::123456789012:policy/MyExamplePolicy'
```

Berdasarkan template ini, kami menulis aturan berikut untuk memastikan bahwa persyaratan ini terpenuhi:
+ Setiap `AWS::ECS::TaskDefinition` sumber daya dalam template memiliki peran tugas dan peran eksekusi yang dilampirkan.
+ Peran tugas dan peran eksekusi adalah peran AWS Identity and Access Management (IAM).
+ Peran didefinisikan dalam template.
+ `PermissionsBoundary`Properti ditentukan untuk setiap peran.

```
# Select all Amazon ECS task definition resources from the template
let ecs_tasks = Resources.*[
    Type == 'AWS::ECS::TaskDefinition'
]

# Select a subset of task definitions whose specified value for the TaskRoleArn property is an Fn::Gett-retrievable attribute
let task_role_refs = some %ecs_tasks.Properties.TaskRoleArn.'Fn::GetAtt'[0]

# Select a subset of TaskDefinitions whose specified value for the ExecutionRoleArn property is an Fn::Gett-retrievable attribute
let execution_role_refs = some %ecs_tasks.Properties.ExecutionRoleArn.'Fn::GetAtt'[0]

# Verify requirement #1
rule all_ecs_tasks_must_have_task_end_execution_roles 
    when %ecs_tasks !empty 
{
    %ecs_tasks.Properties {
        TaskRoleArn exists
        ExecutionRoleArn exists
    }
}

# Verify requirements #2 and #3
rule all_roles_are_local_and_type_IAM
    when all_ecs_tasks_must_have_task_end_execution_roles
{
    let task_iam_references = Resources.%task_role_refs
    let execution_iam_reference = Resources.%execution_role_refs

    when %task_iam_references !empty {
        %task_iam_references.Type == 'AWS::IAM::Role'
    }

    when %execution_iam_reference !empty {
        %execution_iam_reference.Type == 'AWS::IAM::Role'
    }
}

# Verify requirement #4
rule check_role_have_permissions_boundary
    when all_ecs_tasks_must_have_task_end_execution_roles
{
    let task_iam_references = Resources.%task_role_refs
    let execution_iam_reference = Resources.%execution_role_refs

    when %task_iam_references !empty {
        %task_iam_references.Properties.PermissionsBoundary exists
    }

    when %execution_iam_reference !empty {
        %execution_iam_reference.Properties.PermissionsBoundary exists
    }
}
```