みなさん、こんにちは!
先日、Lambda上でS3操作のためにAWS CLIを実行しようとしたところ、コマンドが見つからずエラーになりました。
AWSのベースイメージを使用していれば当然入っているものだと思っていましたが、本当に最小限のランタイムしか含まれていないようです。
今回は、コンテナイメージ形式のカスタムランタイムを使用して、AWS CLIを自由に叩ける環境を構築する手順をまとめます。
1.ファイル準備
今回はLambda関数をコンテナイメージから作成します。
AWS公式のチュートリアルを参考に、カスタムランタイムに必要な bootstrap と、メイン処理を行う function.sh を作成します。
・bootstrap(ランタイムの初期化用ファイル) ※公式のものをそのまま使用します。
・function.sh(実際の処理) 動作確認のため、AWS CLIのバージョンを出力する処理を追加します。
参考:https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/runtimes-walkthrough.html
bootstrap
#!/bin/sh
set-euopipefail
# Initialization - load function handler
source/var/runtime/"$(echo$_HANDLER|cut-d.-f1).sh"
# Processing
whiletrue
do
HEADERS="$(mktemp)"
# Get an event. The HTTP request will block until one is received
EVENT_DATA=$(curl-sS-LD"$HEADERS""http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next")
# Extract request ID by scraping response headers received above
REQUEST_ID=$(grep-FiLambda-Runtime-Aws-Request-Id"$HEADERS"|tr-d'[:space:]'|cut-d:-f2)
# Run the handler function from the script
RESPONSE=$($(echo"$_HANDLER"|cut-d.-f2) "$EVENT_DATA")
# Send the response
curl"http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response"-d"$RESPONSE"
done
function.sh
function handler () {
EVENT_DATA=$1
echo "$EVENT_DATA" 1>&2;
#awscliバージョン確認
VERSION="$(aws --version)"
echo $VERSION 1>&2
RESPONSE="Echoing request: '$EVENT_DATA'"
echo $RESPONSE
}
2.Dockerfile作成
AWS CLIをカスタムランタイムで動かすための Dockerfile を作成します。aws-cliのインストールする工程もここで組み込みます。
Dockerfile
# 1. ベースイメージの指定
FROM public.ecr.aws/lambda/provided:latest
# 2. AWS CLIのインストール
RUN dnf install -y awscli
# 3. ファイルの配置
COPY bootstrap function.sh /var/runtime/
# 4. 実行権限の付与
RUN chmod +x /var/runtime/bootstrap /var/runtime/function.sh
# 5. エントリポイントの設定
CMD [ "function.handler" ]
3.ECRへイメージをプッシュ
cloudshellの適用なディレクトリに準備したファイルをアップロードします。

リポジトリの「プッシュコマンドの表示」からイメージプッシュまでのコマンドが表示されるため、その通りに実行する。

4.Lambda関数作成
Lambdaコンソールから「関数の作成」を選択。 「コンテナイメージ」を選択し、先ほどプッシュしたイメージを指定します。

ログを確認するとawscliのバージョンが出力されていますね。

まとめ
以上がカスタムランタイム(コンテナ)でAWS CLIを動かす方法でした。標準のイメージに必要なツールが足りない場合でも、このようにDockerfileをカスタマイズすることで、自由度の高い実行環境を構築できます。

