はじめに
以前に Layer を使って Lambda コンソールの AWS SDK の更新をなるだけコンソールを使って更新する方法を紹介しました(以前の記事は こちら )。今回は、同じ内容を AWS SAM を使って行いたいと思います。
開発環境を用意する
開発環境には AWS Cloud9 を利用しました。この後の作業を全く同じかたちで実行してみたい方は Cloud9 を用意してください。AWS CLI、SAM CLI が既に用意されているので、この後で必要な操作にたいして準備が必要ありません。Cloud9 の準備には Cloud9 環境を用意する を参照してください。
Lambda 関数を作成し、SAM でデプロイする
- 作業を行う work ディレクトリと、 Lambda 関数を格納する my-new-sdk-function2 ディレクトリを用意して、work ディレクトリに移動します。
mkdir -p work/my-new-sdk-function2
cd work
- Lambda 関数用の
my-new-sdk-function2.js
ファイルと、SAM テンプレートを記述するtemplate.yaml
ファイル、SAM CLI 設定用ファイルのsamconfig.toml
を用意します。
touch my-new-sdk-function2/my-new-sdk-function2.js
touch template.yaml
touch samconfig.toml
- my-new-sdk-function2 ディレクトリに
package.json
ファイルを用意します。
cd my-new-sdk-function2
npm init -y
- リストから "my-new-sdk-function2.js" を選択し、編集して保存します。
const AWS = require('aws-sdk');
exports.handler = async (event) => {
return AWS.VERSION;
};
- リストから "template.yaml" を選択します。SAM テンプレートとしてこのファイルを編集して保存します。
AWSTemplateFormatVersion: '2010-09-09' # テンプレートフォーマットの宣言、決まり文句。
Transform: AWS::Serverless-2016-10-31 # AWS SAM テンプレートファイルであることの宣言
Description: Making Lambda Layer # このテンプレートの説明
Resources:
CallVersionLambda: # リソースの論理名
Type: AWS::Serverless::Function
Properties:
FunctionName: my-new-sdk-function2
CodeUri: ./my-new-sdk-function2
Handler: my-new-sdk-function2.handler
PackageType: Zip
Runtime: nodejs12.x
Timeout: 5
MemorySize: 256
Resources には、"my-new-sdk-function2.js" が Lambda として実行されるように値を指定します。まずテンプレート内での名称を宣言します。ここでは CallVersionLambda
としました。次に Type は AWS::Serverless::Function
とします。Properties は、今回、Lambda Layer を使うので PackageType Zip
とし、それに伴い CodeUri , Handler を指定しました。
- "samconfig.toml" ファイルを選択し SAM CLI コマンドのデフォルトパラメータを設定します。バケット名は一意にする必要 ( バケットの制約と制限 - バケット命名規則 ) があるので、下で s3_bucket で指定したバケット名とは別の名前を指定してください。
version=0.1
[default.deploy.parameters]
stack_name = "my-new-sdk-function2"
s3_bucket = "my-new-sdk-function2"
s3_prefix = "call_version_lambda"
region = "ap-northeast-1"
confirm_changeset = true
capabilities = "CAPABILITY_IAM"
ここでは、 [default.deploy.parameters] により sum deploy
コマンドのパラメータ設定を宣言しています。
- "samconfig.toml" ファイルで s3_bucket に指定した S3 バケットを用意します。Cloud9 には AWS CLI が既に用意されているので、ターミナルから
aws s3 mb s3://<バケット名>
コマンドで S3 バケットを用意します。
aws s3 mb s3://my-new-sdk-function2
-
sam build
コマンドを実行してビルドします。
cd ~/environment/work
sam build
- ビルドが成功したら
sam deploy
コマンドを実行してデプロイします。
sam deploy
途中、changeset をデプロイするか聞かれるので y
を入力して Enter します。
最終的に "Successfully created/updated stack" と出力されたらデプロイの完了です。
- Lambda コンソールの関数ページを開くと "my-new-sdk-function2" 関数がデプロイされていることを確認できると思います。
現在の AWS SDK のバージョンを確認する
イベントを用意して、用意した Lambda 関数を呼び出します。
- 関数一覧から "my-new-sdk-function2" のリンクを選択し、Lambda コンソールの右上にある "テスト" をクリックします。
- "イベント名" に
MyNewSdkEvent2
と名付け、他はデフォルトのまま "作成" をクリックします。 - もう一度 "テスト" をクリックすると先ほどデプロイした Lambda 関数が実行されます。執筆時点では 2.804.0 でした。
SAM で Lambda Layer を作成する
- SAM テンプレートを編集して Layer の設定を追加します。
template.yaml
ファイルを開いて次の内容に変更してください。追加した部分は、CallVersionLambda リソースのプロパティ Layers と__SdkLayer__ リソースになります。
AWSTemplateFormatVersion: '2010-09-09' # テンプレートフォーマットの宣言、決まり文句。
Transform: AWS::Serverless-2016-10-31 # AWS SAM テンプレートファイルであることの宣言
Description: Making Lambda Layer # このテンプレートの説明
Resources:
CallVersionLambda: # リソースの論理名
Type: AWS::Serverless::Function
Properties:
FunctionName: my-new-sdk-function2
CodeUri: ./my-new-sdk-function2
Handler: my-new-sdk-function2.handler
PackageType: Zip
Runtime: nodejs12.x
Timeout: 5
MemorySize: 256
Layers: # 追加
- !Ref SdkLayer
SdkLayer: # 追加
Type: AWS::Serverless::LayerVersion
Properties:
Description: Newest AWS CDK
ContentUri: my-new-sdk-layer/
CompatibleRuntimes:
- nodejs12.x
Metadata:
BuildMethod: nodejs12.x # Required to have AWS SAM build this layer
CallVersionLambda リソースの Layers プロパティでは、!Ref
を使って Layer の宣言をしているリソース SdkLayer を参照させています。SdkLayer リソースでは Metadata 属性を追加して SAM CLI で Layer のビルド を指定しています。
- ContentUril で指定した Layer のパッケージを追加するディレクトリを作成します。
mkdir my-new-sdk-layer
- "my-new-sdk-layer" ディレクトリに
package.json
ファイルを用意し、最新の AWS SDK をインストールします。
cd my-new-sdk-layer
npm init -y
npm install aws-sdk
-
sam build
コマンドでビルドします。
cd ~/environment/work
sam build
- ビルドが成功したら
sam deploy
コマンドを実行してデプロイします。
sam deploy
途中、changeset の確認で Layer が追加されたことが分かります。確認の後、changeset をデプロイしましょう。
更新後の AWS SDK のバージョンを確認する
まえに用意した "MyNewSdkEvent2" を再度、実行します。Lambda コンソールの右上にある "テスト" をクリックしてください。関数コードペインから実行結果を確認すると更新されたことが確認できると思います。今回は 2.828.0 になりました。
以上です。