自定义资源 - Amazon CloudFormation
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

自定义资源

注意

CloudFormation 注册表比自定义资源提供了几个优势,这些优势包括:

  • 支持对第三方应用程序资源进行建模、预置和管理

  • 支持 CreateReadUpdateDeleteList (CRUDL) 操作

  • 支持对私有和第三方资源类型的偏差检测

与自定义资源不同,基于注册表的资源不需要关联 Amazon SNS 主题或 Lambda 函数即可执行 CRUDL 操作。有关 CloudFormation 注册表的更多信息,请参阅使用 Amazon CloudFormation 注册表

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

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

注意

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

自定义资源的工作原理

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

template developer

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

custom resource provider

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

Amazon CloudFormation

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

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

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

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

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

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

    以下示例数据显示 Amazon CloudFormation 在请求中包含哪些内容:

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

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

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

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

    重要

    如果名称值对包含敏感信息,应使用 NoEcho 字段遮蔽自定义资源的输出。否则,这些值通过显示属性值的 API(例如 DescribeStackEvents)可见。

    有关使用 NoEcho 来遮蔽敏感信息的更多信息,请参阅请勿将凭证嵌入您的模板最佳实践。

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

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

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