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

AWS::CloudFormation::CustomResource

在 AWS CloudFormation 模板中,您可以使用 AWS::CloudFormation::CustomResourceCustom::String 资源类型指定自定义资源。

自定义资源为您提供了一种在 AWS CloudFormation 模板中编写自定义配置逻辑并使 AWS CloudFormation 在堆栈操作(如创建、更新或删除堆栈)期间运行该逻辑的方式。有关更多信息,请参阅 自定义资源

注意

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

语法

要在 AWS CloudFormation 模板中声明此实体,请使用以下语法:

JSON

{ "Type" : "Custom::String", "Version" : "1.0", "Properties" : { "ServiceToken" : String, ... provider-defined properties ... } }

YAML

Type: "Custom::String" Version: "1.0" Properties: ServiceToken: String ... provider-defined properties ...

Custom::String

对于自定义资源,您可以指定 AWS::CloudFormation::CustomResource 作为资源类型,也可以指定自己的资源类型名称。例如,您可以使用 AWS::CloudFormation::CustomResource,而不使用 Custom::MyCustomResourceTypeName

自定义资源类型名称可包含字母数字字符和以下字符:_@-。您可指定最大长度为 60 个字符的自定义资源类型名称。在更新期间,不能更改类型。

使用自己的资源类型名称有助于快速区分堆栈中自定义资源的类型。例如,如果您有执行两种不同 ping 测试的两个自定义资源,则可以将其类型命名为 Custom::PingTester(而不使用 AWS::CloudFormation::CustomResource)以便方便地识别为 ping 测试器。

属性

注意

AWS 为自定义资源,仅定义一个属性:ServiceToken。其他所有属性都是服务供应商定义的。

ServiceToken

服务提供商提供给template developer的用于访问服务的服务令牌,如 Amazon SNS 主题 ARN 或 Lambda 函数 ARN。服务令牌必须来自您要创建堆栈的同一区域。

Required: Yes

Type: String

更新要求:不支持更新。

返回值

对于自定义资源,返回值是由 custom resource provider 定义的,并且可通过调用 Fn::GetAtt 在供应商定义的属性中进行检索。

示例

在模板中创建自定义资源定义

下面的示例演示如何在模板中创建自定义资源定义。

ServiceToken 之外的所有属性以及 Fn::GetAtt 资源属性都由 custom resource provider 定义。

JSON

{ "AWSTemplateFormatVersion" : "2010-09-09", "Resources" : { "MyFrontEndTest" : { "Type": "Custom::PingTester", "Version" : "1.0", "Properties" : { "ServiceToken": "arn:aws:sns:us-east-1:84969EXAMPLE:CRTest", "key1" : "string", "key2" : [ "list" ], "key3" : { "key4" : "map" } } } }, "Outputs" : { "CustomResourceAttribute1" : { "Value" : { "Fn::GetAtt" : ["MyFrontEndTest", "responseKey1"] } }, "CustomResourceAttribute2" : { "Value" : { "Fn::GetAtt" : ["MyFrontEndTest", "responseKey2"] } } } }

YAML

AWSTemplateFormatVersion: "2010-09-09" Resources: MyFrontEndTest: Type: "Custom::PingTester" Version: "1.0" Properties: ServiceToken: "arn:aws:sns:us-east-1:84969EXAMPLE:CRTest" key1: string key2: - list key3: key4: map Outputs: CustomResourceAttribute1: Value: Fn::GetAtt: - MyFrontEndTest - responseKey1 CustomResourceAttribute2: Value: Fn::GetAtt: - MyFrontEndTest - responseKey2

在自定义资源中使用 AWS Lambda 函数

使用 Lambda 函数和自定义资源,您可以运行自定义代码以响应堆栈事件(创建、更新和删除)。以下自定义资源调用了 Lambda 函数并向其发送 StackName 属性作为输入。函数使用该属性从适当堆栈获取输出。

JSON

"MyCustomResource" : { "Type" : "Custom::TestLambdaCrossStackRef", "Properties" : { "ServiceToken": { "Fn::Join": [ "", [ "arn:aws:lambda:", { "Ref": "AWS::Region" }, ":", { "Ref": "AWS::AccountId" }, ":function:", {"Ref" : "LambdaFunctionName"} ] ] }, "StackName": { "Ref": "NetworkStackName" } } }

YAML

MyCustomResource: Type: "Custom::TestLambdaCrossStackRef" Properties: ServiceToken: !Sub | arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:${LambdaFunctionName} StackName: Ref: "NetworkStackName"

在更新期间替换自定义资源

您可以更新需要替换基础物理资源的自定义资源。在 AWS CloudFormation 模板中更新自定义资源时,AWS CloudFormation 会向相应的自定义资源发送更新请求。如果该自定义资源需要替换,则新的自定义资源必须用新的物理 ID 发送响应。AWS CloudFormation 收到响应时,会比较新旧自定义资源的 PhysicalResourceId。如果物理资源 ID 不同,则 AWS CloudFormation 将该更新视为替换,并向旧资源发送删除请求。有关此过程的分步演练,请参阅堆栈更新

请注意以下几点: