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.
Zuweisen und Referenzieren von Variablen in Guard-Regeln
Sie können Ihren AWS CloudFormation Guard Regeldateien Variablen zuweisen, um Informationen zu speichern, auf die Sie in Ihren Guard-Regeln verweisen möchten. Guard unterstützt die einmalige Variablenzuweisung. Variablen werden träge ausgewertet, was bedeutet, dass Guard Variablen nur auswertet, wenn Regeln ausgeführt werden.
Themen
Variablen zuweisen
Verwenden Sie das let Schlüsselwort, um eine Variable zu initialisieren und zuzuweisen. Es hat sich bewährt, Snake-Groß- und Kleinschreibung für Variablennamen zu verwenden. Variablen können statische Literale oder dynamische Eigenschaften speichern, die sich aus Abfragen ergeben. Im folgenden Beispiel ecs_task_definition_task_role_arn speichert die Variable den statischen Zeichenkettenwertarn:aws:iam:123456789012:role/my-role-name.
let ecs_task_definition_task_role_arn = 'arn:aws:iam::123456789012:role/my-role-name'
Im folgenden Beispiel ecs_tasks speichert die Variable die Ergebnisse einer Abfrage, die nach allen AWS::ECS::TaskDefinition Ressourcen in einer AWS CloudFormation
Vorlage sucht. Sie könnten beim Schreiben von Regeln auf Zugriffsinformationen zu diesen Ressourcen verweisenecs_tasks.
let ecs_tasks = Resources.*[ Type == 'AWS::ECS::TaskDefinition' ]
Variablen referenzieren
Verwenden Sie das % Präfix, um auf eine Variable zu verweisen.
Basierend auf dem ecs_task_definition_task_role_arn Variablenbeispiel in Variablen zuweisen können Sie ecs_task_definition_task_role_arn im query|value
literal Abschnitt einer Guard-Regelklausel darauf verweisen. Durch die Verwendung dieser Referenz wird sichergestellt, dass es sich bei dem für die TaskDefinitionArn Eigenschaft einer beliebigen AWS::ECS::TaskDefinition Ressource in einer CloudFormation Vorlage angegebenen Wert um den statischen Zeichenkettenwert handeltarn:aws:iam:123456789012:role/my-role-name.
Resources.*.Properties.TaskDefinitionArn == %ecs_task_definition_role_arn
Basierend auf dem ecs_tasks Variablenbeispiel in Variablen zuweisen können Sie ecs_tasks in einer Abfrage referenzieren (z. B. %ECS_Tasks.Properties). Zuerst wertet Guard die Variable aus ecs_tasks und verwendet dann die zurückgegebenen Werte, um die Hierarchie zu durchqueren. Wenn die Variable in Werte ecs_tasks aufgelöst wird, die keine Zeichenfolge sind, gibt Guard einen Fehler aus.
Anmerkung
Derzeit unterstützt Guard die Referenzierung von Variablen in benutzerdefinierten Fehlermeldungen nicht.
Gültigkeitsbereich der Variablen
Der Gültigkeitsbereich bezieht sich auf die Sichtbarkeit von Variablen, die in einer Regeldatei definiert sind. Ein Variablenname kann innerhalb eines Bereichs nur einmal verwendet werden. Es gibt drei Ebenen, auf denen eine Variable deklariert werden kann, oder drei mögliche Variablenbereiche:
-
Dateiebene — In der Regel oben in der Regeldatei deklariert, können Sie Variablen auf Dateiebene in allen Regeln innerhalb der Regeldatei verwenden. Sie sind für die gesamte Datei sichtbar.
In der folgenden Beispieldatei
ecs_task_definition_execution_role_arnwerden die Variablenecs_task_definition_task_role_arnund D auf Dateiebene initialisiert.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 } -
Regelebene — Innerhalb einer Regel deklariert, sind Variablen auf Regelebene nur für diese spezielle Regel sichtbar. Alle Verweise außerhalb der Regel führen zu einem Fehler.
In der folgenden Beispiel-Regeldatei
ecs_task_definition_execution_role_arnwerden die Variablenecs_task_definition_task_role_arnund D auf Regelebene initialisiert.ecs_task_definition_task_role_arnSie können nur innerhalb der benannten Regel referenziert werden.check_ecs_task_definition_task_role_arnSie können nur innerhalb dercheck_ecs_task_definition_execution_role_arnbenannten Regel auf dieecs_task_definition_execution_role_arnVariable verweisen.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 } -
Blockebene — Innerhalb eines Blocks, z. B. einer
whenKlausel, deklariert, sind Variablen auf Blockebene nur für diesen bestimmten Block sichtbar. Alle Verweise außerhalb des Blocks führen zu einem Fehler.In der folgenden Beispiel-Regeldatei
ecs_task_definition_execution_role_arnwerden die Variablenecs_task_definition_task_role_arnund D auf Blockebene innerhalb desAWS::ECS::TaskDefinitionTypblocks initialisiert. Sie können nur auf dieecs_task_definition_execution_role_arnVariablenecs_task_definition_task_role_arnund innerhalb derAWS::ECS::TaskDefinitionTypblöcke für ihre jeweiligen Regeln verweisen.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 } }
Beispiele für Variablen in Guard-Regeldateien
Die folgenden Abschnitte enthalten Beispiele für die statische und dynamische Zuweisung von Variablen.
Statische Zuweisung
Im Folgenden finden Sie eine CloudFormation Beispielvorlage.
Resources: EcsTask: Type: 'AWS::ECS::TaskDefinition' Properties: TaskRoleArn: 'arn:aws:iam::123456789012:role/my-role-name'
Basierend auf dieser Vorlage können Sie eine Regel mit dem Namen schreibencheck_ecs_task_definition_task_role_arn, die sicherstellt, dass die TaskRoleArn Eigenschaft aller AWS::ECS::TaskDefinition Vorlagenressourcen lautetarn: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 }
Im Rahmen der Regel können Sie eine Variable namens initialisieren ecs_task_definition_task_role_arn und ihr den statischen Zeichenkettenwert 'arn:aws:iam::123456789012:role/my-role-name' zuweisen. Die Regelklausel überprüft, ob der für die TaskRoleArn Eigenschaft der EcsTask Ressource angegebene Wert angegeben wurde, arn:aws:iam::123456789012:role/my-role-name indem sie auf die ecs_task_definition_task_role_arn Variable im Abschnitt verweist. query|value
literal
Dynamische Zuweisung
Im Folgenden finden Sie eine CloudFormation Beispielvorlage.
Resources: EcsTask: Type: 'AWS::ECS::TaskDefinition' Properties: TaskRoleArn: 'arn:aws:iam::123456789012:role/my-role-name'
Basierend auf dieser Vorlage können Sie eine Variable initialisieren, die ecs_tasks im Gültigkeitsbereich der Datei aufgerufen wird, und ihr die Abfrage Resources.*[ Type == 'AWS::ECS::TaskDefinition' zuweisen. Guard fragt alle Ressourcen in der Eingabevorlage ab und speichert Informationen über sie inecs_tasks. Sie können auch eine Regel namens schreibencheck_ecs_task_definition_task_role_arn, die sicherstellt, dass die TaskRoleArn Eigenschaft aller AWS::ECS::TaskDefinition Vorlagenressourcen 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' }
Die Regelklausel überprüft, ob der für die TaskRoleArn Eigenschaft der EcsTask Ressource angegebene Wert auf die ecs_task_definition_task_role_arn Variable im query Abschnitt verweist. arn:aws:iam::123456789012:role/my-role-name
Erzwingen der Vorlagenkonfiguration AWS CloudFormation
Sehen wir uns ein komplexeres Beispiel für einen Produktionsanwendungsfall an. In diesem Beispiel schreiben wir Guard-Regeln, um strengere Kontrollen bei der Definition von ECS Amazon-Aufgaben zu gewährleisten.
Im Folgenden finden Sie eine CloudFormation Beispielvorlage.
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'
Basierend auf dieser Vorlage schreiben wir die folgenden Regeln, um sicherzustellen, dass diese Anforderungen erfüllt werden:
-
Jeder
AWS::ECS::TaskDefinitionRessource in der Vorlage ist sowohl eine Aufgabenrolle als auch eine Ausführungsrolle zugeordnet. -
Die Aufgabenrollen und Ausführungsrollen sind Rollen AWS Identity and Access Management (IAM).
-
Die Rollen sind in der Vorlage definiert.
-
Die
PermissionsBoundaryEigenschaft wird für jede Rolle angegeben.
# 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 } }