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

AWS Lambda 関数コード

Code は、AWS Lambda 関数のソースコードを指定するための、AWS::Lambda::Function リソースのプロパティです。ソースコードはテンプレートまたは Amazon Simple Storage Service (Amazon S3) バケット内のファイルに配置できます。nodejs4.3python2.7nodejs6.10、および python3.6 ランタイム環境の場合のみ、インライン形式でソースコードを提供できます。

注記

ソースコードが Amazon S3 バケットに置かれた Lambda 関数を更新するには、S3BucketS3Key、または S3ObjectVersion プロパティを更新して、更新をトリガーする必要があります。ソースコードを単独で更新しても、関数は更新されません。

構文

JSON

Copy
{ "S3Bucket" : String, "S3Key" : String, "S3ObjectVersion" : String, "ZipFile" : String }

YAML

Copy
S3Bucket: String S3Key: String S3ObjectVersion: String ZipFile: String

プロパティ

S3Bucket

デプロイパッケージを含む .zip ファイルがある Amazon S3 バケットの名前が保存されます。このバケットは、Lambda 関数を作成するのと同じ AWS リージョン内に存在する必要があります。Lambda 関数とバケットが同じリージョンにある限り、別の AWS アカウントからバケットを指定できます。

注記

cfn-response モジュールは Amazon S3 バケットに保存されたソースコードには使用できません。応答を送信するには、独自の関数を作成します。

Required: Conditional S3Bucket および S3Key プロパティを両方指定するか、ZipFile プロパティを指定します。

Type: String

S3Key

ソースコードを含む .zip ファイルの場所と名前。このプロパティを指定する場合は、S3Bucket プロパティも指定する必要があります。

Required: Conditional S3Bucket および S3Key プロパティを両方指定するか、ZipFile プロパティを指定する必要があります。

Type: String

S3ObjectVersion

S3 のバージョニングが有効な場合は、ソースコードを含む .zip ファイルのバージョン ID。S3Bucket および S3Key プロパティを指定した場合のみ、このプロパティを指定できます。

Required: No

Type: String

ZipFile

nodejs4.3nodejs6.10python2.7、および python3.6 ランタイム環境の場合は、Lambda 関数のソースコード。このプロパティを他のランタイム環境で使用することはできません。

最大 4096 文字を指定できます。ソースコード内では、引用符 (")、改行 (\n)、タブ (\t) など、一部の特殊文字の前にはバックスラッシュ (\) を置く必要があります。特殊文字のリストについては、http://json.org/ を参照してください。

AWS CloudFormation カスタムリソースと通信する関数を指定する場合、関数を呼び出したカスタムリソースに応答を送信するために独自の関数を作成する必要はありません。AWS CloudFormation に、応答の送信を簡素化する応答モジュールが用意されています。詳細については、「cfn-response モジュール」を参照してください。

Required: Conditional S3Bucket および S3Key プロパティを両方指定するか、ZipFile プロパティを指定する必要があります。

Type: String

cfn-response モジュール

ZipFileプロパティを使用して関数のソースコードを指定し、その関数が AWS CloudFormation カスタムリソースと通信する場合、cfn-response モジュールをロードしてこれらのリソースに応答を送信できます。このモジュールには send メソッドが含まれています。このメソッドは、Amazon S3 の署名付き URL (ResponseURL) を経由して、カスタムリソースに応答オブジェクトを送信します。

send メソッドを実行した後、Lambda 関数は終了するため、メソッドの後の記述は無視されます。

注記

cfn-response モジュールは、ZipFile プロパティを使用してソースコードを作成した場合にのみ使用できます。Amazon S3 バケットに保存されたソースコードには使用できません。 バケットのコードでは、独自の関数を作成してレスポンスを送信する必要があります。

cfn-response モジュールの読み込み

nodejs4.3、または nodejs6.10 ランタイム環境の場合は、require() 関数を使用して cfn-response モジュールをロードします。たとえば、次のコードでは、response という名前で cfn-response オブジェクトを作成しています。

Copy
var response = require('cfn-response');

python2.7、または python3.6 環境では、次の例に示すように、import ステートメントを使用して cfnresponse モジュールをロードします。

注記

この完全インポートステートメントを使用します。インポートステートメントの他の形式では、AWS CloudFormation では応答モジュールが含まれません。

Copy
import cfnresponse

send メソッドのパラメーター

send メソッドで次のパラメーターを使用できます。

event

カスタムリソースのリクエストに含まれるフィールド。

context

関数および任意のコールバックが実行完了したとき、または Lambda 実行環境内からの情報にアクセスするときに指定できる Lambda 関数固有のオブジェクト。詳細については、AWS Lambda Developer Guideの「プログラミングモデル (Node.js) 」を参照してください。

responseStatus

関数が正常に完了したかどうか。このステータスを指定するには、cfnresponse モジュール定数を使用します。成功に実行した場合は SUCCESS、失敗した場合は FAILED を指定します。

responseData

カスタムリソースの応答オブジェクトData フィールド。データの内容は、名前と値のペアのリストです。

physicalResourceId

オプション。関数を呼び出したカスタムリソースの一意の識別子。モジュールのデフォルトでは、Lambda 関数に関連付けられている Amazon CloudWatch Logs ログストリームが使用されます。

Node.js

次の Node.js の例では、インラインの Lambda 関数で入力値を受け取り、その値に 5 を乗算しています。インライン関数は、パッケージを作成して Amazon S3 バケットにアップロードするのではなく、ソースコードをテンプレート内で直接指定できるため、小さな関数の場合は特に便利です。この関数では、cfn-responsesend メソッドを使用して、呼び出たカスタムリソースに結果を返しています。

JSON
Copy
"ZipFile": { "Fn::Join": ["", [ "var response = require('cfn-response');", "exports.handler = function(event, context) {", " var input = parseInt(event.ResourceProperties.Input);", " var responseData = {Value: input * 5};", " response.send(event, context, response.SUCCESS, responseData);", "};" ]]}
YAML
Copy
ZipFile: > var response = require('cfn-response'); exports.handler = function(event, context) { var input = parseInt(event.ResourceProperties.Input); var responseData = {Value: input * 5}; response.send(event, context, response.SUCCESS, responseData); };

Python

前の例と同様に、次の Python の例 (この例はバージョン 2.7 と 3.6 の両方で動作します) では、インライン Lambda 関数は整数値をとり、それに 5 を乗算します。

JSON
Copy
"ZipFile" : { "Fn::Join" : ["\n", [ "import json", "import cfnresponse", "def handler(event, context):", " responseValue = int(event['ResourceProperties']['Input']) * 5", " responseData = {}", " responseData['Data'] = responseValue", " cfnresponse.send(event, context, cfnresponse.SUCCESS, responseData, \"CustomResourcePhysicalID\")" ]]}
YAML
Copy
ZipFile: | import json import cfnresponse def handler(event, context): responseValue = int(event['ResourceProperties']['Input']) * 5 responseData = {} responseData['Data'] = responseValue cfnresponse.send(event, context, cfnresponse.SUCCESS, responseData, "CustomResourcePhysicalID")

モジュールのソースコード

nodejs4.3、または nodejs6.10 ランタイム環境の応答モジュールのソースコードは次の通りです。これを確認してモジュールの動作を理解し、独自の応答関数の実装に役立ててください。

Copy
/* Copyright 2015 Amazon Web Services, Inc. or its affiliates. All Rights Reserved. This file is licensed to you under the AWS Customer Agreement (the "License"). You may not use this file except in compliance with the License. A copy of the License is located at http://aws.amazon.com/agreement/. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions and limitations under the License. */ exports.SUCCESS = "SUCCESS"; exports.FAILED = "FAILED"; exports.send = function(event, context, responseStatus, responseData, physicalResourceId) { var responseBody = JSON.stringify({ Status: responseStatus, Reason: "See the details in CloudWatch Log Stream: " + context.logStreamName, PhysicalResourceId: physicalResourceId || context.logStreamName, StackId: event.StackId, RequestId: event.RequestId, LogicalResourceId: event.LogicalResourceId, Data: responseData }); console.log("Response body:\n", responseBody); var https = require("https"); var url = require("url"); var parsedUrl = url.parse(event.ResponseURL); var options = { hostname: parsedUrl.hostname, port: 443, path: parsedUrl.path, method: "PUT", headers: { "content-type": "", "content-length": responseBody.length } }; var request = https.request(options, function(response) { console.log("Status code: " + response.statusCode); console.log("Status message: " + response.statusMessage); context.done(); }); request.on("error", function(error) { console.log("send(..) failed executing https.request(..): " + error); context.done(); }); request.write(responseBody); request.end(); }

python3.6 環境の応答モジュールのソースコードは次の通りです。

Copy
# Copyright 2016 Amazon Web Services, Inc. or its affiliates. All Rights Reserved. # This file is licensed to you under the AWS Customer Agreement (the "License"). # You may not use this file except in compliance with the License. # A copy of the License is located at http://aws.amazon.com/agreement/ . # This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or implied. # See the License for the specific language governing permissions and limitations under the License. from botocore.vendored import requests import json SUCCESS = "SUCCESS" FAILED = "FAILED" def send(event, context, responseStatus, responseData, physicalResourceId=None): responseUrl = event['ResponseURL'] print(responseUrl) responseBody = {} responseBody['Status'] = responseStatus responseBody['Reason'] = 'See the details in CloudWatch Log Stream: ' + context.log_stream_name responseBody['PhysicalResourceId'] = physicalResourceId or context.log_stream_name responseBody['StackId'] = event['StackId'] responseBody['RequestId'] = event['RequestId'] responseBody['LogicalResourceId'] = event['LogicalResourceId'] responseBody['Data'] = responseData json_responseBody = json.dumps(responseBody) print("Response body:\n" + json_responseBody) headers = { 'content-type' : '', 'content-length' : str(len(json_responseBody)) } try: response = requests.put(responseUrl, data=json_responseBody, headers=headers) print("Status code: " + response.reason) except Exception as e: print("send(..) failed executing requests.put(..): " + str(e))

python2.7 環境の応答モジュールのソースコードは次の通りです。

Copy
# Copyright 2016 Amazon Web Services, Inc. or its affiliates. All Rights Reserved. # This file is licensed to you under the AWS Customer Agreement (the "License"). # You may not use this file except in compliance with the License. # A copy of the License is located at http://aws.amazon.com/agreement/ . # This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or implied. # See the License for the specific language governing permissions and limitations under the License. from botocore.vendored import requests import json SUCCESS = "SUCCESS" FAILED = "FAILED" def send(event, context, responseStatus, responseData, physicalResourceId): responseUrl = event['ResponseURL'] print responseUrl responseBody = {} responseBody['Status'] = responseStatus responseBody['Reason'] = 'See the details in CloudWatch Log Stream: ' + context.log_stream_name responseBody['PhysicalResourceId'] = physicalResourceId or context.log_stream_name responseBody['StackId'] = event['StackId'] responseBody['RequestId'] = event['RequestId'] responseBody['LogicalResourceId'] = event['LogicalResourceId'] responseBody['Data'] = responseData json_responseBody = json.dumps(responseBody) print "Response body:\n" + json_responseBody headers = { 'content-type' : '', 'content-length' : str(len(json_responseBody)) } try: response = requests.put(responseUrl, data=json_responseBody, headers=headers) print "Status code: " + response.reason except Exception as e: print "send(..) failed executing requests.put(..): " + str(e)