组件 CloudFormation IaC 文件参数详细信息和示例 - AWS Proton

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

组件 CloudFormation IaC 文件参数详细信息和示例

您可以在组件基础设施即代码 (IaC) 文件中定义和引用参数。有关参数、参数类型、 AWS Proton 参数命名空间以及如何在 IaC 文件中使用参数的详细说明,请参阅AWS Proton 参数。有关组件的更多信息,请参阅AWS Proton 组件

定义组件输出参数

您可以在组件 IaC 文件中定义输出参数。然后,您可以在服务 IaC 文件中引用这些输出。

注意

您无法为组件 IaC 文件定义输入。附加的组件可以从它们附加到的服务实例中获取输入。分离的组件没有输入。

读取组件 IaC 文件中的参数值

您可以在组件 IaC 文件中读取与组件和其他资源相关的参数。您可以通过在参数命名空间中引用参数的名称来读取 AWS Proton 参数值。

  • 输入参数 - 引用 service_instance.inputs.input-name 以读取附加的服务实例输入值。

  • 资源参数-通过引用component.nameservice.nameservice_instance.name、和environment.name等名称来读取 AWS Proton 资源参数。

  • 输出参数 - 引用 environment.outputs.output-name 以读取环境输出。

包含参数的示例组件和服务 IaC 文件

以下示例显示一个组件,该组件预置 Amazon Simple Storage Service (Amazon S3) 存储桶和相关的访问策略,并将两种资源的 Amazon 资源名称 (ARN) 公开为组件输出。服务 IaC 模板将组件输出添加为 Amazon Elastic Container Service (Amazon ECS) 任务的容器环境变量以使输出可供容器中运行的代码使用,并将存储桶访问策略添加到任务的角色中。存储桶名称基于环境、服务、服务实例和组件的名称,这意味着存储桶与扩展特定服务实例的特定组件模板实例结合使用。开发人员可以根据该组件模板创建多个自定义组件,以针对不同的服务实例和功能需求预置 Amazon S3 存储桶。

该示例说明了如何使用 Jinja {{ ... }} 语法引用服务 IaC 文件中的组件和其他资源参数。只有在组件附加到服务实例时,您才能使用 {% if ... %} 语句添加语句块。proton_cfn_* 关键字是可用于清理输出参数值和设置参数值格式的筛选条件。有关筛选条件的更多信息,请参阅 CloudFormation IaC 文件的参数过滤器

作为管理员,您编写服务 IaC 模板文件。

例 使用组件的服务 CloudFormation IaC 文件
# service/instance_infrastructure/cloudformation.yaml Resources: TaskDefinition: Type: AWS::ECS::TaskDefinition Properties: TaskRoleArn: !Ref TaskRole ContainerDefinitions: - Name: '{{service_instance.name}}' # ... {% if service_instance.components.default.outputs | length > 0 %} Environment: {{ service_instance.components.default.outputs | proton_cfn_ecs_task_definition_formatted_env_vars }} {% endif %} # ... 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: # ...

作为开发人员,您编写组件 IaC 模板文件。

例 组件 CloudFormation iaC 文件
# cloudformation.yaml # A component that defines an S3 bucket and a policy for accessing the bucket. Resources: S3Bucket: Type: 'AWS::S3::Bucket' Properties: BucketName: '{{environment.name}}-{{service.name}}-{{service_instance.name}}-{{component.name}}' S3BucketAccessPolicy: Type: AWS::IAM::ManagedPolicy Properties: PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: - 's3:Get*' - 's3:List*' - 's3:PutObject' Resource: !GetAtt S3Bucket.Arn Outputs: BucketName: Description: "Bucket to access" Value: !GetAtt S3Bucket.Arn BucketAccessPolicyArn: Value: !Ref S3BucketAccessPolicy

为服务实例 AWS Proton 渲染 AWS CloudFormation 模板并将所有参数替换为实际值时,模板可能如下所示。

例 服务实例 CloudFormation 呈现的 iaC 文件
Resources: TaskDefinition: Type: AWS::ECS::TaskDefinition Properties: TaskRoleArn: !Ref TaskRole ContainerDefinitions: - Name: '{{service_instance.name}}' # ... Environment: - Name: BucketName Value: arn:aws:s3:us-east-1:123456789012:environment_name-service_name-service_instance_name-component_name - Name: BucketAccessPolicyArn Value: arn:aws:iam::123456789012:policy/cfn-generated-policy-name # ... TaskRole: Type: AWS::IAM::Role Properties: # ... ManagedPolicyArns: - !Ref BaseTaskRoleManagedPolicy - arn:aws:iam::123456789012:policy/cfn-generated-policy-name # Basic permissions for the task BaseTaskRoleManagedPolicy: Type: AWS::IAM::ManagedPolicy Properties: # ...