メニュー
AWS CloudFormation
ユーザーガイド (API Version 2010-05-15)

AWS::CloudFormation::CustomResource

AWS CloudFormation テンプレートでは、AWS::CloudFormation::CustomResource または Custom::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

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

YAML

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

Custom::String

カスタムリソースには、リソースタイプとして AWS::CloudFormation::CustomResource を指定する以外に、独自のリソースタイプの名前を指定できます。たとえば、AWS::CloudFormation::CustomResource の代わりに、Custom::MyCustomResourceTypeName を使用できます。

カスタムリソースタイプ名には、英数字および次の文字を含めることができます。_@-。カスタムリソースタイプ名には最長 60 文字まで指定できます。更新時にタイプを変更することはできません。

リソースタイプに独自の名前を使用すると、スタックのカスタムリソースのタイプをすばやく識別できます。たとえば、カスタムリソースが 2 つあり、それぞれが異なる ping テストを実行する場合であれば、そのタイプ名を (AWS::CloudFormation::CustomResource ではなく) Custom::PingTester として、ping テスターであることが容易にわかるようにするという使い方が考えられます。

プロパティ

注記

カスタムリソースでは、AWS で定義できるプロパティは ServiceToken のみとなっています。他のプロパティは、サービスプロバイダーが定義します。

ServiceToken

サービスにアクセスするためにサービスプロバイダーから template developer に与えられたサービストークン (Amazon SNS トピックの ARN、Lambda 関数の ARN など)。このサービストークンは、作成しているスタックと同じリージョンのものである必要があります。

Required: Yes

Type: String

[Update requires]: アップデートはサポートされていません。

戻り値

カスタムリソースでは、custom resource provider が戻り値を定義します。戻り値を取得するときは、プロバイダーが定義した属性について Fn::GetAtt を呼び出します。

テンプレートでカスタムリソース定義を作成する

以下の例は、テンプレートでカスタムリソース定義を作成する方法を示しています。

ServiceToken 以外のプロパティと、Fn::GetAtt リソース属性はすべて、custom resource provider が定義します。

JSON

Copy
{ "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

Copy
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

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

YAML

Copy
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 を比較します。この 2 つが異なる場合には、AWS CloudFormation は新しい方が更新用のものであると認識し、古いリソースに削除リクエストを送信します。このプロセスの順を追った説明については、「スタックの更新」を参照してください。

次の点に注意してください。