目的
aws-cliで行っていた処理を、Lambda関数で実行できるようにして、最終的にslackなどをトリガーにして、簡単に実行できる様にしたい。その前準備として、lambda関数でaws-cliを使えるように、lambdaレイヤーを使用して、lambda関数にaws-cliを追加するレイヤーを準備する。
結果
GithubのREADME.mdに従ってコマンドを実行するだけで、作成&デプロイがされます。
(git cloneしてデプロイするだけ)
仕組み
aws-cliはpythonスクリプトで実装されているため、pythonモジュールとしてインストールしたあと、該当するファイルをコピーする、実行環境が変わるため、awsスクリプトの先頭のシバンを#!/var/lang/bin/python
に書き換えて、あとはzipに固めてデプロイするだけで、lambda関数から使えるようになります。
この処理をスクリプトとして纏めると、下記になります。
#!/usr/bin/env bash
set -eu;
cd `dirname ${0}`;
rm -rf ./tmp;
mkdir ./tmp;
python3 -m venv ./tmp;
./tmp/bin/pip install awscli;
rm -rf ./lambda-layer;
mkdir lambda-layer;
cp ./tmp/bin/aws ./lambda-layer;
cp -r ./tmp/lib/python3.*/site-packages/* ./lambda-layer;
rm -rf ./tmp;
cat ./lambda-layer/aws |(rm ./lambda-layer/aws; sed '1s/.*/\#\!\/var\/lang\/bin\/python/' > ./lambda-layer/aws)
デプロイのawsコマンドは/opt/aws
に配置されており、Python3のランタイムを持つLambda関数に、該当するレイヤーを付けた後、下記のようにpythonからシェルコマンドとして使用できます。
import subprocess
subprocess.call('/opt/aws --version', shell=True)