1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AWS SAM を使って AWS Lambda Layer を作成する

Last updated at Posted at 2021-01-20

はじめに

以前に 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

ここまでで、以下のような構成になっていると思います。
Screenshot_2021-01-17 SampleCloud9 - AWS Cloud9.png

  • リストから "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 としました。次に TypeAWS::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 します。
Screenshot_2021-01-17 SampleCloud9 - AWS Cloud9(1).png
最終的に "Successfully created/updated stack" と出力されたらデプロイの完了です。

  • Lambda コンソールの関数ページを開くと "my-new-sdk-function2" 関数がデプロイされていることを確認できると思います。

Screenshot_2021-01-17 関数 - Lambda.png

現在の AWS SDK のバージョンを確認する

イベントを用意して、用意した Lambda 関数を呼び出します。

  1. 関数一覧から "my-new-sdk-function2" のリンクを選択し、Lambda コンソールの右上にある "テスト" をクリックします。
  2. "イベント名" に MyNewSdkEvent2 と名付け、他はデフォルトのまま "作成" をクリックします。
  3. もう一度 "テスト" をクリックすると先ほどデプロイした Lambda 関数が実行されます。執筆時点では 2.804.0 でした。

Screenshot_2021-01-17 my-new-sdk-function2 - Lambda.png

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

ここまでで、以下のような構成になっていると思います。
Screenshot_2021-01-17 SampleCloud9 - AWS Cloud9(3).png

  • sam build コマンドでビルドします。
cd ~/environment/work
sam build
  • ビルドが成功したら sam deploy コマンドを実行してデプロイします。
sam deploy

途中、changeset の確認で Layer が追加されたことが分かります。確認の後、changeset をデプロイしましょう。

Screenshot_2021-01-17 SampleCloud9 - AWS Cloud9(2).png

更新後の AWS SDK のバージョンを確認する

まえに用意した "MyNewSdkEvent2" を再度、実行します。Lambda コンソールの右上にある "テスト" をクリックしてください。関数コードペインから実行結果を確認すると更新されたことが確認できると思います。今回は 2.828.0 になりました。

Screenshot_2021-01-17 my-new-sdk-function2 - Lambda(1).png

以上です。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?