銀の弾丸

プログラミングに関して、いろいろ書き残していければと思っております。

AWS SAM/CloudFormationのテンプレートでDynamoDBテーブル名をLambdaの環境変数に設定するには?

f:id:takamints:20191012145048j:plain
photo credit: SurfaceWarriors 190711-N-WI365-2119 via photopin (license)

AWS SAM/CloudFormationのテンプレートで定義されるDynamoDBのテーブル名を、同じくテンプレート内に定義したLambda関数の環境変数に設定する方法です。

WEB+DB PRESS Vol.113
WEB+DB PRESS Vol.113
posted with amazlet at 19.10.12
野田 奏 小原 一哉 西岡 忍 木村 奈美 澤田 剛 成瀬 允宣 松岡 幸一郎 藤井 謙士朗 井上 真史 山口 慶子 池田 拓司 小山 哲志 末永 恭正 久保田 祐史 鈴木 恭介 牧 大輔 笹田 耕一 松本 宏太 尾形 鉄次 はまちや2 竹原 渡辺 淳 岩井 良太 吉田 健太
技術評論社
売り上げランキング: 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関数の設定で、こう(↓)なります。

f:id:takamints:20191012220304p:plain

おまけ:Lambda関数実行時に環境変数を参照する

Node.js の Lambda で実行時に<環境変数の値>を参照するには process.env["<環境変数名>"] とします。

const tableName = process.env["TableName"];

f:id:takamints:20191012215355p:plain

Pythonならば、import os でosモジュールをインポートして os.environ['<環境変数名>'] です。

import os
tableName = os.environ['TableName'];

参考リンク

docs.aws.amazon.com

docs.aws.amazon.com