AWS SAM/CloudFormationのテンプレートでDynamoDBテーブル名をLambdaの環境変数に設定するには?
photo credit: SurfaceWarriors 190711-N-WI365-2119 via photopin (license)
AWS SAM/CloudFormationのテンプレートで定義されるDynamoDBのテーブル名を、同じくテンプレート内に定義したLambda関数の環境変数に設定する方法です。
技術評論社
売り上げランキング: 1,406
はじめに
SAM/CloudFormationのテンプレートで、テーブル名を指定せずにDynamoDBのテーブルリソースを定義すると、サーバーレスアプリの初回デプロイ時に自動的に命名されます。
このテーブル名には、SAMのアプリ名やリソース名に加えて、デプロイ時にハッシュみたいな一意なIDが使われますので、Lambdaの実装時には不明です。
テンプレートでは、DynamoDBのテーブルリソースを参照することで、まだ作成されていないテーブル名をLambdaの環境変数に設定できます。 Lambda関数では、テーブル名を環境変数から取得すればOKですね。
ということで、その書き方を以下で説明いたします。
テンプレートでLambdaの環境変数を設定する
テンプレートでLambda関数の環境変数を宣言するには、リソースの Properties/Environment/Variables
に、 <環境変数名>: <環境変数の値>
と記述します。
例ではリソースTypeが AWS::Serverless::Function となっていますが、AWS::Lambda::Function でも同じはず。
template.yaml
Resources: #サーバーレス関数の定義(API Gateway REST API+Lambda Function) MyFunction: Type: AWS::Serverless::Function Properties: Environment: #環境変数の宣言 Variables: <環境変数名>: <環境変数の値>
環境変数にDynamoDBテーブル名を設定する
Lambdaの環境変数にDynamoDBのテーブル名を設定するには、<環境変数の値>
に !Ref <DyanamoDBリソース名>
とします。
※ DynamoDBリソースでテーブル名をProperties/TableName
で明示的に指定していても同様に参照可能です。
template.yaml
Resources: #サーバーレス関数の定義(API Gateway REST API+Lambda Function) MyFunction: Type: AWS::Serverless::Function Properties: Environment: Variables: #↓DynamoDBテーブルのテーブル名を参照 TableName: !Ref DynamoDBTable ・ ・ ・ #DynamoDBテーブルリソースの宣言 DynamoDBTable: Type: AWS::DynamoDB::Table Properties: ・ ・ ・
デプロイするとLambda関数の設定で、こう(↓)なります。
おまけ:Lambda関数実行時に環境変数を参照する
Node.js の Lambda で実行時に<環境変数の値>
を参照するには process.env["<環境変数名>"]
とします。
const tableName = process.env["TableName"];
Pythonならば、import os
でosモジュールをインポートして os.environ['<環境変数名>']
です。
import os tableName = os.environ['TableName'];