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
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.
Menetapkan variabel
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 statisarn: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 AWS 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
Gunakan % awalan untuk referensi variabel.
Berdasarkan contoh ecs_task_definition_task_role_arn variabel diMenetapkan variabel, 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 statisarn:aws:iam:123456789012:role/my-role-name.
Resources.*.Properties.TaskDefinitionArn == %ecs_task_definition_role_arn
Berdasarkan contoh ecs_tasks variabel diMenetapkan variabel, 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
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_arndanecs_task_definition_execution_role_arndiinisialisasi 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_arndanecs_task_definition_execution_role_arndiinisialisasi pada aturan-tingkat. Hanyaecs_task_definition_task_role_arndapat direferensikan dalam aturancheck_ecs_task_definition_task_role_arnbernama. Anda hanya dapat mereferensikanecs_task_definition_execution_role_arnvariabel dalam aturancheck_ecs_task_definition_execution_role_arnbernama.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
whenklausa, 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_arndanecs_task_definition_execution_role_arndiinisialisasi pada blok-tingkat dalam blok tipe.AWS::ECS::TaskDefinitionAnda hanya dapat mereferensikanecs_task_definition_execution_role_arnvariabelecs_task_definition_task_role_arndan dalam blokAWS::ECS::TaskDefinitiontipe 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
Bagian berikut memberikan contoh penugasan variabel statis dan dinamis.
Penugasan statis
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 adalaharn: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 tersebutquery|value
literal.
Penugasan dinamis
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 diecs_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 tersebutquery.
Menegakkan konfigurasi AWS CloudFormation template
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 ECS tugas Amazon 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::TaskDefinitionsumber daya dalam template memiliki peran tugas dan peran eksekusi yang dilampirkan. -
Peran tugas dan peran eksekusi adalah AWS Identity and Access Management (IAM) peran.
-
Peran didefinisikan dalam template.
-
PermissionsBoundaryProperti 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 } }