Lambda レイヤーにライブラリを追加する ( AWS CLI 編)

概要

Lambda から AWS CLI コマンドを利用できるようにするため、Lambda レイヤーに AWS CLI を追加します。
本記事では、デプロイパッケージの作成方法として 2 通り紹介します。

Lambda レイヤーに AWS CLI を追加するためのデプロイパッケージ作成方法と手順

方法 1: AWS CLI のインストーラーを使ってデプロイパッケージ作成する

最終的なデプロイパッケージ( zip ファイルアーカイブ)のフォルダ構成
Copied!
.
└── bin
    ├── aws
    └── 省略(色々入ります)

作業用ディレクトリとレイヤーパスの作成

Copied!
mkdir ~/aws_cli_layer
cd ~/aws_cli_layer
mkdir aws-cli aws-bin bin

AWS CLI インストーラのダウンロードとインストール

bin ディレクトリに AWS CLI のバイナリーファイルなどを追加します。

Copied!
cd ~/aws_cli_layer

# wget もしくは curl いづれかのコマンドで AWS CLI のインストールファイルをダウンロードします。
wget https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip
curl -O https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip

# ファイルを解凍します。
unzip awscli-exe-linux-x86_64.zip

# 作業用ディレクトリにインストールします。
./aws/install -i ~/aws_cli_layer/aws-cli -b ~/aws_cli_layer/aws-bin

# aws コマンドのバイナリーファイルなどが入ったディレクトリの中身を全てコピーします。
cp -r ./aws-cli/v2/current/dist/* ./bin

デプロイパッケージ化 ( zip ファイルアーカイブ )

Copied!
cd ~/aws_cli_layer
zip -r9 aws_cli_layer.zip bin

方法 2: aws-lambda-layer-awscli リポジトリを使ってデプロイパッケージ作成する

以下の aws-lambda-layer-awscli という AWS 公式のリポジトリに AWS CLI を含めた Lambda レイヤーを作成するためのブランチがあります。
aws コマンドだけでなく、jq コマンドなども含まれています。

aws-lambda-layer-awscli リポジトリのクローンとデプロイパッケージ作成 ( zip ファイルアーカイブ )

Copied!
# aws-lambda-layer-awscli リポジトリのクローンします。
git clone https://github.com/aws-samples/aws-lambda-layer-awscli.git
cd aws-lambda-layer-awscli

# ブランチを awscli-v2-python37 に切り替えます。
git checkout awscli-v2-python37

# ビルドの実行をします。
# ビルドが完了すると、カレントディレクトリに layer.zip が作成されます。これがデプロイパッケージとなります。
make

Lambda レイヤーの作成

デプロイパッケージを使用した Lambda レイヤーの作成手順はこちらにまとめてあります。

動作確認

作成した Lambda レイヤーを使用する Lambda 関数を作成し、テスト実行してみます。
使用するカスタムランタイムはなんでもいいですが、本記事ではカスタムランタイムである Amazon Linux 2 を使用します。
特にエラーが発生せず、実行結果のログに AWS CLI のバージョンの表示と、指定した S3 バケットにファイルが転送されていれば成功です。

方法 1 で作成した Lambda レイヤーは Lambda の全てランタイムがサポートするディレクトリ構造のため、パスを指定しなくても aws コマンドが実行できます。
しかし、方法 2 で作成した Lambda レイヤーは Lambda のランタイムがサポートするディレクトリ構造で作成されていないため、aws コマンドの実行にはパスを含める必要があります。

方法 1 で作成した Lambda レイヤーの場合
Copied!
function handler () {
    EVENT_DATA=$1
    aws --version
    aws s3 cp ./bootstrap s3://xxxxxxxxxxxxxx
    RESPONSE="{\"statusCode\": 200, \"body\": \"Hello from Lambda!\"}"
    echo $RESPONSE
}
方法 2 で作成した Lambda レイヤーの場合
Copied!
function handler () {
    EVENT_DATA=$1
    /opt/awscli/aws --version
    /opt/awscli/aws s3 cp ./bootstrap s3://xxxxxxxxxxxxxx
    RESPONSE="{\"statusCode\": 200, \"body\": \"Hello from Lambda!\"}"
    echo $RESPONSE
}

実行結果

参考文献