自定义资源
注意
CloudFormation 注册表比自定义资源提供了几个优势,这些优势包括:
-
支持对第三方应用程序资源进行建模、预置和管理
-
支持
Create
、Read
、Update
、Delete
和List
(CRUDL
) 操作 -
支持对私有和第三方资源类型的偏差检测
与自定义资源不同,基于注册表的资源不需要关联 Amazon SNS 主题或 Lambda 函数即可执行 CRUDL
操作。有关 CloudFormation 注册表的更多信息,请参阅使用 Amazon CloudFormation 注册表。
使用自定义资源,您可以在模板中编写自定义配置逻辑,每次创建、更新 (如果您更改了自定义资源) 或删除堆栈时,Amazon CloudFormation 都会运行该逻辑。例如,您可能需要包含不可作为 Amazon CloudFormation 资源类型的资源。您可以使用自定义资源包含这些资源。这样,您仍然可以在一个堆栈中管理所有相关资源。
使用 AWS::CloudFormation::CustomResource 或 Custom::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可以是同一人员或实体,但过程相同。以下步骤介绍了一般过程:
-
template developer在其模板中定义自定义资源,该模板包含服务令牌和任何输入数据参数。根据自定义资源,输入数据是可能必需的;但是,服务令牌是总是必需的。
服务令牌指定 Amazon CloudFormation 将请求发送到的位置,例如 Amazon SNS 主题 ARN 或 Amazon Lambda 函数 ARN。有关更多信息,请参阅 AWS::CloudFormation::CustomResource。服务令牌和输入数据的结构由custom resource provider定义。
-
当任何人使用模板创建、更新或删除自定义资源时,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 函数的自定义负载。 -
自定义资源提供商处理 Amazon CloudFormation 请求并向预签名 URL 返回
SUCCESS
或FAILED
响应。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", } }
-
获得
SUCCESS
响应后,Amazon CloudFormation 继续堆栈操作。如果收到FAILED
响应或未返回任何响应,则操作失败。来自自定义资源的所有输出数据都存储在预签名 URL 位置。template developer可使用 Fn::GetAtt 函数检索该数据。