

# AWS Lambdaと使用するCloudFormation
<a name="services-cloudformation"></a>

AWS CloudFormation テンプレートでは、Lambda 関数をカスタムリソースのターゲットとして指定できます。パラメータの処理にカスタムリソースを使用したり、設定値を取得したり、スタックのライフサイクルイベント中に他の AWS のサービスを呼び出したりします。

次の例は、テンプレートの別の場所で定義される関数を呼び出します。

**Example - カスタムリソースの定義**  

```
Resources:
  primerinvoke:
    Type: [AWS::CloudFormation::CustomResource](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cfn-customresource.html)
    Version: "1.0"
    Properties:
      ServiceToken: !GetAtt primer.Arn
      FunctionName: !Ref randomerror
```

サービストークンは、スタックの作成、更新あるいは削除時に CloudFormation が呼び出す関数の Amazon リソースネーム (ARN) です。また、`FunctionName` のように CloudFormation が関数にそのまま渡す追加のプロパティを含めることができます。

CloudFormation では、コールバック URL を含むイベントで[非同期的に](invocation-async.md) Lambda 関数を呼び出します。

**Example – CloudFormation メッセージイベント**  

```
{
    "RequestType": "Create",
    "ServiceToken": "arn:aws:lambda:us-east-1:123456789012:function:lambda-error-processor-primer-14ROR2T3JKU66",
    "ResponseURL": "https://cloudformation-custom-resource-response-useast1.s3-us-east-1.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-1%3A123456789012%3Astack/lambda-error-processor/1134083a-2608-1e91-9897-022501a2c456%7Cprimerinvoke%7C5d478078-13e9-baf0-464a-7ef285ecc786?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Expires=1555451971&Signature=28UijZePE5I4dvukKQqM%2F9Rf1o4%3D",
    "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/lambda-error-processor/1134083a-2608-1e91-9897-022501a2c456",
    "RequestId": "5d478078-13e9-baf0-464a-7ef285ecc786",
    "LogicalResourceId": "primerinvoke",
    "ResourceType": "AWS::CloudFormation::CustomResource",
    "ResourceProperties": {
        "ServiceToken": "arn:aws:lambda:us-east-1:123456789012:function:lambda-error-processor-primer-14ROR2T3JKU66",
        "FunctionName": "lambda-error-processor-randomerror-ZWUC391MQAJK"
    }
}
```

関数は、成功あるいは失敗を示すコールバック URL にレスポンスを返す処理を行います 完全なレスポンスの構文については、「[カスタムリソースの応答オブジェクト](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/crpg-ref-responses.html)」を参照してください。

**Example – CloudFormation カスタムリソース応答**  

```
{
    "Status": "SUCCESS",
    "PhysicalResourceId": "2019/04/18/[$LATEST]b3d1bfc65f19ec610654e4d9b9de47a0",
    "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/lambda-error-processor/1134083a-2608-1e91-9897-022501a2c456",
    "RequestId": "5d478078-13e9-baf0-464a-7ef285ecc786",
    "LogicalResourceId": "primerinvoke"
}
```

CloudFormation は応答の送信を処理する `cfn-response` という名前のライブラリを提供します。テンプレートで関数を定義する場合、ライブラリを名前で使用できます。CloudFormation はこのライブラリを作成する関数のデプロイパッケージに追加します。

カスタムリソースが使用する関数に [Elastic Network Interface](configuration-vpc.md#configuration-vpc-enis) がアタッチされている場合、次のリソースを **region** が関数が属するリージョンにダッシュがない VPC ポリシーに追加します。たとえば、`us-east-1` は `useast1` です。これにより、カスタムリソースは、CloudFormation スタックにシグナルを送り返すコールバック URL に応答できるようになります。

```
arn:aws:s3:::cloudformation-custom-resource-response-region",
"arn:aws:s3:::cloudformation-custom-resource-response-region/*",
```

次の関数例では、2 番目の関数を呼び出しています。呼び出しが成功すると、この関数は成功レスポンスを CloudFormation に送信し、スタックの更新が継続します。テンプレートは、AWS Serverless Application Model から提供される [AWS:: Serverless:: Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html) リソースタイプを使用します。

**Example – カスタムリソース関数**  

```
Transform: 'AWS::Serverless-2016-10-31'
Resources:
  primer:
    Type: [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html)
    Properties:
      Handler: index.handler
      Runtime: nodejs16.x
      InlineCode: |
        var aws = require('aws-sdk');
        var response = require('cfn-response');
        exports.handler = function(event, context) {
            // For Delete requests, immediately send a SUCCESS response.
            if (event.RequestType == "Delete") {
                response.send(event, context, "SUCCESS");
                return;
            }
            var responseStatus = "FAILED";
            var responseData = {};
            var functionName = event.ResourceProperties.FunctionName
            var lambda = new aws.Lambda();
            lambda.invoke({ FunctionName: functionName }, function(err, invokeResult) {
                if (err) {
                    responseData = {Error: "Invoke call failed"};
                    console.log(responseData.Error + ":\n", err);
                }
                else responseStatus = "SUCCESS";
                response.send(event, context, responseStatus, responseData);
            });
        };
      Description: Invoke a function to create a log stream.
      MemorySize: 128
      Timeout: 8
      Role: !GetAtt role.Arn
      Tracing: Active
```

カスタムリソースが呼び出す関数がテンプレートで定義されていない場合、AWS CloudFormation の [cfn-response モジュール](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-lambda-function-code-cfnresponsemodule.html)から `cfn-response` のリソースコードを取得できます。

カスタムリソースの詳細については、*AWS CloudFormationユーザーガイド*の[カスタムリソース](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html)を参照してください。