はじめに
この記事では、AWS LambdaでAWS CLIを使用する手順についてまとめています。
対応方法
AWS Lambdaでは、ファイル書き込みが許可されているのは /tmp
配下のみです。
これはつまり、AWS Lambdaで実行するプログラムからはパッケージのインストールは行えないということを意味します。
そのため、対応方法としては、デプロイパッケージにまとめてしまうか、Lambdaレイヤーを使用するかになるかと思います。
今回の私のケースでは、AWS CLIは他の関数でも使用する可能性があることなどを踏まえて、Lambdaレイヤーを使用することにしました。
Lambdaレイヤーについての詳細な説明は、AWS公式ドキュメントに譲ります。
対応手順
全体の流れとしては、Lambda関数で使用するOSのDockerコンテナでAWS CLIのzipファイルを作成し、そのzipファイルでLambdaレイヤーを作成するという流れになります。
1. Lambda関数のOSに対応したDockerコンテナを起動する
この記事では、Amazon Linux 2023を使用します。
# 任意の作業ディレクトリに移動
$ cd ~/Desktop
# Amazon Linux 2023のコンテナを起動
$ docker run -it --rm -v ./volume:/volume amazonlinux:2023 bash
後の作業で使用する which
と zip
を先にインストールしておきます。
$ dnf -y install which zip
2. コンテナ内でAWS CLIをインストール
AWS CLIのインストールについては、AWS公式ドキュメントの手順(Linuxへのインストール方法)通りに行います。
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ ./aws/install
これで、AWS CLIが使用可能となります。
$ aws --version
3. AWS CLIをzipファイルにまとめる
では、コンテナ内にインストールされたAWS CLIを使用して、Lambdaレイヤーにアップロードするzipファイルを作成します。
aws
コマンドのパスを確認すると、最終的には /usr/local/aws-cli/v2/current/dist
に実行ファイルが格納されていることが分かります。
# まずはawsコマンドのパスを確認
$ which aws
/usr/local/bin/aws
# 出力されたパスはシンボリックリンクです
$ ls -l /usr/local/bin/aws
lrwxrwxrwx 1 root root 37 Jul 29 04:32 /usr/local/bin/aws -> /usr/local/aws-cli/v2/current/bin/aws
# リンク先のパスを確認すると、こちらもシンボリックリンクになっています
$ ls -l /usr/local/aws-cli/v2/current/bin/aws
lrwxrwxrwx 1 root root 11 Jul 29 04:32 /usr/local/aws-cli/v2/current/bin/aws -> ../dist/aws
# さらにリンク先のパスを確認すると、実行ファイルを確認できました
$ ls -l /usr/local/aws-cli/v2/current/dist/aws
-rwxr-xr-x 1 root root 6753688 Jul 29 04:32 /usr/local/aws-cli/v2/current/dist/aws
この実行ファイルが格納されている dist
をzipファイルにまとめます。
Lambdaレイヤーは最終的にLambda関数内では、/opt
に展開され、実行パスは /opt/bin
になります。
実行パスを上書くことも可能ですが、今回はデフォルトの実行パスで動作するように、bin
に実行ファイルが格納されるようにzipファイルを作成します。
# docker runコマンドのオプションで指定したボリュームディレクトリにコピーします
$ cp -r /usr/local/aws-cli/v2/current/dist /volume/bin
# /volume に移動してzipファイルを作成します
$ cd /volume
$ zip -r awscli.zip bin
4. Lambdaレイヤー作成
Lambdaレイヤー作成画面でも表示されますが、アップロードするzipファイルが10MBを超える場合は、S3からのアップロードが推奨されています。
今回作成したzipファイルは10MBを超えていたため、S3を使用することにします。
まずはS3バケットにzipファイルをアップロードします。
先ほど作成した ~/Desktop/volume/awscli.zip
をS3バケットにアップロードします。
そして、Lambdaレイヤーを作成します。
5. Lambda関数にレイヤーを登録
ランタイムが Amazon Linux 2023
のLambda関数を作成します。
作成したLambda関数に前の手順で作成したレイヤーを登録します。
実行するスクリプトを編集して、aws
コマンドが使用できることを確認します。
ここでは、aws --version
を実行しています。
テスト実行をして結果を確認すると、問題なくバージョンが出力されています。
最後に
Lambdaレイヤーを用いて、Lambda関数でAWS CLIを使用するための手順をまとめました。
一点最後に補足として、この記事の内容は、とにかくAWS CLIを使用することだけを考えたものになっていますが、Lambda関数にはデプロイパッケージサイズの上限や、登録するレイヤー数の上限がありますので、他のパッケージも併せて使用する場合などは、このあたりも踏まえて、対応方法、Lambdaレイヤーの作り方等を検討する必要があると思います。
最後まで読んでいただきありがとうございました。
読んでいただいた方にとって何らかのプラスになっていれば嬉しいです。