AWS CloudFormation
User Guide (API Version 2010-05-15)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

自定义资源

使用自定义资源,您可以在模板中编写自定义配置逻辑,每次创建、更新(如果您更改了自定义资源)或删除堆栈时,AWS CloudFormation 都会运行该逻辑。例如,您可能需要包含不可作为 AWS CloudFormation 资源类型的资源。您可以使用自定义资源包含这些资源。这样,您仍然可以在一个堆栈中管理所有相关资源。

使用 AWS::CloudFormation::CustomResourceCustom::String 资源类型可以在模板中定义自定义资源。自定义资源需要一个属性,即服务令牌,它指定 AWS CloudFormation 发送请求的目标,如 Amazon SNS 主题。

注意

如果使用 VPC 端点功能,则 VPC 中的自定义资源必须能够访问 AWS CloudFormation 特定的 S3 存储桶。自定义资源必须将响应发送到预签名的 Amazon S3 URL。如果不能向 Amazon S3 发送响应,AWS CloudFormation 不会收到响应,堆栈操作就会失败。有关更多信息,请参阅 AWS CloudFormation 和 VPC 终端节点

自定义资源的工作原理

对自定义资源执行的任何操作均涉及三方。

template developer

创建包含自定义资源类型的模板。template developer在模板中指定服务令牌和所有输入数据。

custom resource provider

拥有自定义资源并确定如何处理和响应来自 AWS CloudFormation 的请求。custom resource provider必须提供template developer使用的服务令牌。

AWS CloudFormation

在堆栈操作期间,向模板中指定的服务令牌发送请求,然后等待响应,再继续堆栈操作。

template developer和custom resource provider可以是同一人员或实体,但过程相同。以下步骤介绍了一般过程:

  1. template developer在其模板中定义自定义资源,该模板包含服务令牌和任何输入数据参数。根据自定义资源,输入数据是可能必需的;但是,服务令牌是总是必需的。

    服务令牌指定 AWS CloudFormation 将请求发送到的位置,例如发送到 Amazon SNS 主题 ARN 或 AWS Lambda 函数 ARN。有关更多信息,请参阅 AWS::CloudFormation::CustomResource。服务令牌和输入数据的结构由custom resource provider定义。

  2. 当任何人使用模板创建、更新或删除自定义资源时,AWS CloudFormation 将向指定服务令牌发送请求。服务令牌必须位于您要创建堆栈的同一区域。

    在请求中,AWS CloudFormation 包含请求类型和自定义资源向其发送请求的预签名 Amazon Simple Storage Service URL 等信息。有关请求中包含的内容的更多信息,请参阅自定义资源请求对象

    下面的示例数据显示 AWS CloudFormation 在请求中包含哪些内容:

    Copy
    { "RequestType" : "Create", "ResponseURL" : "http://pre-signed-S3-url-for-response", "StackId" : "arn:aws:cloudformation:us-west-2:EXAMPLE/stack-name/guid", "RequestId" : "unique id for this create request", "ResourceType" : "Custom::TestResource", "LogicalResourceId" : "MyTestResource", "ResourceProperties" : { "Name" : "Value", "List" : [ "1", "2", "3" ] } }

    注意

    在本示例中,ResourceProperties 允许 AWS CloudFormation 创建发送到 Lambda 函数的自定义有效负载。

  3. custom resource provider处理 AWS CloudFormation 请求并向预签名 URL 返回 SUCCESSFAILED 响应。custom resource provider 提供采用 JSON 格式文件的响应并将响应上传到预签名的 S3 URL。有关更多信息,请参阅 Amazon Simple Storage Service 开发人员指南 中的使用预签名 URL 上传对象

    在响应中,custom resource provider还可以包含template developer可以访问的名称-值对。例如,如果请求成功,响应可以包含输出数据,如果请求失败,可以包含错误消息。有关响应的更多信息,请参阅自定义资源响应对象

    重要

    由于可通过揭露属性值 (如 DescribeStackEvents) 的 API 查看名称值对,因此名称值对应包含敏感信息。

    custom resource provider负责侦听和响应请求。例如,对于 Amazon SNS 通知,custom resource provider必须侦听和响应发送到特定主题 ARN 的通知。AWS CloudFormation 在预签名 URL 位置等待并侦听响应。

    下面的示例数据说明自定义资源在响应中可以包含的内容:

    Copy
    { "Status" : "SUCCESS", "PhysicalResourceId" : "TestResource1", "StackId" : "arn:aws:cloudformation:us-west-2:EXAMPLE:stack/stack-name/guid", "RequestId" : "unique id for this create request", "LogicalResourceId" : "MyTestResource", "Data" : { "OutputName1" : "Value1", "OutputName2" : "Value2", } }
  4. 获得 SUCCESS 响应后,AWS CloudFormation 继续堆栈操作。如果收到 FAILURE 或未返回任何响应,则操作失败。来自自定义资源的所有输出数据都存储在预签名 URL 位置。template developer可使用 Fn::GetAtt 函数检索该数据。