CloudFormation IaC 文件的参数过滤器 - AWS Proton

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

CloudFormation IaC 文件的参数过滤器

当您引用 AWS CloudFormation IaC 文件中的AWS Proton 参数时,您可以使用称为过滤器的 Jinja 修饰符来验证、筛选和格式化参数值,然后再将其插入到渲染的模板中。在引用组件输出参数时,筛选条件验证是特别有用的,因为组件创建和附加是由开发人员完成的,并且在服务实例模板中使用组件输出的管理员可能希望验证它们是否存在和有效。不过,您可以在任何 Jinja IaC 文件中使用筛选条件。

以下各节描述和定义了可用的参数筛选器,并提供了示例。 AWS Proton 定义了其中的大多数过滤器。default 筛选条件是 Jinja 内置筛选条件。

为 Amazon ECS 任务设置环境属性格式

声明

dict → proton_cfn_ecs_task_definition_formatted_env_vars (raw: boolean = True) → YAML list of dicts

说明

该筛选条件为 Amazon Elastic Container Service (Amazon ECS) 任务定义 ContainerDefinition 部分的 Environment 属性中使用的输出列表设置格式。

还可以将 raw 设置为 False 以验证参数值。在这种情况下,该值需要与正则表达式 ^[a-zA-Z0-9_-]*$ 匹配。如果该值未通过验证,模板渲染将失败。

如果使用以下自定义组件模板:

Resources: # ... Outputs: Output1: Description: "Example component output 1" Value: hello Output2: Description: "Example component output 2" Value: world

以及以下服务模板:

Resources: TaskDefinition: Type: AWS::ECS::TaskDefinition Properties: # ... ContainerDefinitions: - Name: MyServiceName # ... Environment: {{ service_instance.components.default.outputs | proton_cfn_ecs_task_definition_formatted_env_vars }}

渲染的服务模板如下所示:

Resources: TaskDefinition: Type: AWS::ECS::TaskDefinition Properties: # ... ContainerDefinitions: - Name: MyServiceName # ... Environment: - Name: Output1 Value: hello - Name: Output2 Value: world

设置 Lambda 函数的环境属性格式

声明

dict → proton_cfn_lambda_function_formatted_env_vars (raw: boolean = True) → YAML dict

说明

此过滤器格式化了要在 AWS Lambda 函数定义Properties部分的 En vironment 属性中使用的输出列表。

还可以将 raw 设置为 False 以验证参数值。在这种情况下,该值需要与正则表达式 ^[a-zA-Z0-9_-]*$ 匹配。如果该值未通过验证,模板渲染将失败。

如果使用以下自定义组件模板:

Resources: # ... Outputs: Output1: Description: "Example component output 1" Value: hello Output2: Description: "Example component output 2" Value: world

以及以下服务模板:

Resources: Lambda: Type: AWS::Lambda::Function Properties: Environment: Variables: {{ service_instance.components.default.outputs | proton_cfn_lambda_function_formatted_env_vars }}

渲染的服务模板如下所示:

Resources: Lambda: Type: AWS::Lambda::Function Properties: Environment: Variables: Output1: hello Output2: world

提取 IAM policy ARN 以包含在 IAM 角色中

声明

dict → proton_cfn_iam_policy_arns → YAML list

说明

此筛选器格式化了要在 AWS Identity and Access Management (IAM) 角色定义Properties部分的ManagedPolicyArns 属性中使用的输出列表。该筛选条件使用正则表达式 ^arn:[a-zA-Z-]+:iam::\d{12}:policy/ 从输出参数列表中提取有效的 IAM policy ARN。您可以使用该筛选条件,将输出参数值中的策略附加到服务模板中的 IAM 角色定义。

如果使用以下自定义组件模板:

Resources: # ... ExamplePolicy1: Type: AWS::IAM::ManagedPolicy Properties: # ... ExamplePolicy2: Type: AWS::IAM::ManagedPolicy Properties: # ... # ... Outputs: Output1: Description: "Example component output 1" Value: hello Output2: Description: "Example component output 2" Value: world PolicyArn1: Description: "ARN of policy 1" Value: !Ref ExamplePolicy1 PolicyArn2: Description: "ARN of policy 2" Value: !Ref ExamplePolicy2

以及以下服务模板:

Resources: # ... TaskRole: Type: AWS::IAM::Role Properties: # ... ManagedPolicyArns: - !Ref BaseTaskRoleManagedPolicy {{ service_instance.components.default.outputs | proton_cfn_iam_policy_arns }} # Basic permissions for the task BaseTaskRoleManagedPolicy: Type: AWS::IAM::ManagedPolicy Properties: # ...

渲染的服务模板如下所示:

Resources: # ... TaskRole: Type: AWS::IAM::Role Properties: # ... ManagedPolicyArns: - !Ref BaseTaskRoleManagedPolicy - arn:aws:iam::123456789012:policy/cfn-generated-policy-name-1 - arn:aws:iam::123456789012:policy/cfn-generated-policy-name-2 # Basic permissions for the task BaseTaskRoleManagedPolicy: Type: AWS::IAM::ManagedPolicy Properties: # ...

清理属性值

声明

string → proton_cfn_sanitize → string

说明

这是一个通用的筛选条件。可以使用该筛选条件验证参数值的安全性。该筛选条件验证值是否与正则表达式 ^[a-zA-Z0-9_-]*$ 匹配或者是有效的 Amazon 资源名称 (ARN)。如果该值未通过验证,模板渲染将失败。

如果使用以下自定义组件模板:

Resources: # ... Outputs: Output1: Description: "Example of valid output" Value: "This-is_valid_37" Output2: Description: "Example incorrect output" Value: "this::is::incorrect" SomeArn: Description: "Example ARN" Value: arn:aws:some-service::123456789012:some-resource/resource-name
  • 服务模板中的以下引用:

    # ... {{ service_instance.components.default.outputs.Output1 | proton_cfn_sanitize }}

    渲染如下所示:

    # ... This-is_valid_37
  • 服务模板中的以下引用:

    # ... {{ service_instance.components.default.outputs.Output2 | proton_cfn_sanitize }}

    包含以下渲染错误的结果:

    Illegal character(s) detected in "this::is::incorrect". Must match regex ^[a-zA-Z0-9_-]*$ or be a valid ARN
  • 服务模板中的以下引用:

    # ... {{ service_instance.components.default.outputs.SomeArn | proton_cfn_sanitize }}

    渲染如下所示:

    # ... arn:aws:some-service::123456789012:some-resource/resource-name

为不存在的引用提供默认值

描述

在命名空间引用不存在时,default 筛选条件提供默认值。可以使用它编写强大的模板,即使您引用的参数丢失,也可以成功进行渲染。

如果服务实例没有附加直接定义的(默认)组件,或者附加的组件没有名为 test 的输出,服务模板中的以下引用将导致模板渲染失败。

# ... {{ service_instance.components.default.outputs.test }}

要避免该问题,请添加 default 筛选条件。

# ... {{ service_instance.components.default.outputs.test | default("[optional-value]") }}