Lambda関数でAWS CLIを使用する

# はじめに

この記事では、AWS LambdaでAWS CLIを使用する手順についてまとめています。

# 対応方法

AWS Lambdaでは、ファイル書き込みが許可されているのは `/tmp` 配下のみです。
これはつまり、AWS Lambdaで実行するプログラムからはパッケージのインストールは行えないということを意味します。

そのため、対応方法としては、デプロイパッケージにまとめてしまうか、Lambdaレイヤーを使用するかになるかと思います。

今回の私のケースでは、AWS CLIは他の関数でも使用する可能性があることなどを踏まえて、Lambdaレイヤーを使用することにしました。
Lambdaレイヤーについての詳細な説明は、[AWS公式ドキュメント](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/chapter-layers.html)に譲ります。

# 対応手順

全体の流れとしては、Lambda関数で使用するOSのDockerコンテナでAWS CLIのzipファイルを作成し、そのzipファイルでLambdaレイヤーを作成するという流れになります。

## 1. Lambda関数のOSに対応したDockerコンテナを起動する

この記事では、Amazon Linux 2023を使用します。

```bash: local
# 任意の作業ディレクトリに移動
$ cd ~/Desktop
# Amazon Linux 2023のコンテナを起動
$ docker run -it --rm -v ./volume:/volume amazonlinux:2023 bash
```

後の作業で使用する `which` と `zip` を先にインストールしておきます。

```bash: container
$ dnf -y install which zip
```

## 2. コンテナ内でAWS CLIをインストール

AWS CLIのインストールについては、[AWS公式ドキュメントの手順（Linuxへのインストール方法）](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html)通りに行います。

```bash: container
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ ./aws/install
```

これで、AWS CLIが使用可能となります。

```bash: container
$ aws --version
```

## 3. AWS CLIをzipファイルにまとめる

では、コンテナ内にインストールされたAWS CLIを使用して、Lambdaレイヤーにアップロードするzipファイルを作成します。

`aws` コマンドのパスを確認すると、最終的には `/usr/local/aws-cli/v2/current/dist` に実行ファイルが格納されていることが分かります。

```bash: container
# まずは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ファイルを作成します。

```bash: container
# 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` をS３バケットにアップロードします。

![スクリーンショット 2024-07-29 14.15.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687813/55a9539e-aff5-4666-1c2b-1c133a7be07b.png)

そして、Lambdaレイヤーを作成します。

![スクリーンショット 2024-07-29 14.16.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687813/91347cd0-b173-7e57-2332-4aa4771c15b4.png)

## 5. Lambda関数にレイヤーを登録

ランタイムが `Amazon Linux 2023` のLambda関数を作成します。

![スクリーンショット 2024-07-29 14.21.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687813/0e57e4ef-8650-6404-cd37-4a3f326319f8.png)

作成したLambda関数に前の手順で作成したレイヤーを登録します。

![スクリーンショット 2024-07-29 14.22.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687813/64fa3aed-ba52-25c5-b8db-f13abb009f7b.png)

実行するスクリプトを編集して、`aws` コマンドが使用できることを確認します。
ここでは、`aws --version` を実行しています。

![スクリーンショット 2024-07-29 14.28.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687813/d06a8350-b91b-fa53-95f9-d97d548bd741.png)

テスト実行をして結果を確認すると、問題なくバージョンが出力されています。

![スクリーンショット 2024-07-29 14.28.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687813/0093af9c-d558-6141-0679-209d902498ae.png)

# 最後に

Lambdaレイヤーを用いて、Lambda関数でAWS CLIを使用するための手順をまとめました。
一点最後に補足として、この記事の内容は、とにかくAWS CLIを使用することだけを考えたものになっていますが、Lambda関数にはデプロイパッケージサイズの上限や、登録するレイヤー数の上限がありますので、他のパッケージも併せて使用する場合などは、このあたりも踏まえて、対応方法、Lambdaレイヤーの作り方等を検討する必要があると思います。

最後まで読んでいただきありがとうございました。
読んでいただいた方にとって何らかのプラスになっていれば嬉しいです。

# 参考ページ

- [AWS CLIのインストール手順](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html)
- [Lambdaレイヤーについて](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/chapter-layers.html)
- [Lambda関数の環境変数について](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-envvars.html#configuration-envvars-runtime)