はじめに
Re:Q Techブログをご覧いただきありがとうございます。 クラウド&ネットワーク技術統括部のR.Wです 先日、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 handlersource/var/runtime/"$(echo$_HANDLER|cut-d.-f1).sh"
# ProcessingwhiletruedoHEADERS="$(mktemp)"# Get an event. The HTTP request will block until one is receivedEVENT_DATA=$(curl-sS-LD"$HEADERS""http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next")
# Extract request ID by scraping response headers received aboveREQUEST_ID=$(grep-FiLambda-Runtime-Aws-Request-Id"$HEADERS"|tr-d'[:space:]'|cut-d:-f2)
# Run the handler function from the scriptRESPONSE=$($(echo"$_HANDLER"|cut-d.-f2) "$EVENT_DATA")
# Send the responsecurl"http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response"-d"$RESPONSE"done
function handler () {EVENT_DATA=$1echo "$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コンソールから「関数の作成」を選択。 「コンテナイメージ」を選択し、先ほどプッシュしたイメージを指定します。 
Lambda関数を作成できたので動作確認をします。

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




