はじめに
Lambda でAWS のインスタンスを管理をさせたいとき awscli のインストールが必要になるので、これを利用できるようにする。
概要
- awscli を利用する EC2 のインスタンスと同じ OS を用意する (docker)
- docker container でawscli をインストールして zip でかためる
- zip にしたファイルを S3 に置く
- S3 に置いたファイルをLambda のレイヤーで 指定する
- Lamda の関数を用意して レイヤーを指定
- bootstrap, hello.sh を用意(編集)
awscli を利用して EC2 に接続する Access キーを用意する
# cat /var/lib/aws/aws_cli.key
アクセスキー
シークレットキー
ap-northeast-1 (ゾーン)
text
awscli をインストールする環境 (docker コンテナ) の用意
Amazon Linux 2023 でawscli を動作させたいので、このOSのdocker イメージで用意する。
インストール
# yum -y install docker
docker デーモン起動
# systemctl start docker
Amazon Linux 2023 のイメージをダウンロードしてコンテナを用意
# docker run -it --rm -v ./volume:/volume amazonlinux:2023 bash
bash-5.2# uname -a
Linux 4c1bfd43594e 6.1.109-118.189.amzn2023.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Sep 10 08:59:12 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
awscli コマンドの用意
docker コンテナで作業で必要なコマンドをインストール
bash-5.2# dnf -y install which zip
Amazon Linux 2023 repository 30 MB/s | 28 MB 00:00
Last metadata expiration check: 0:00:07 ago on Thu Oct 3 23:20:53 2024.
Dependencies resolved.
==========================================================================================================================
Package Architecture Version Repository Size
==========================================================================================================================
Installing:
which x86_64 2.21-26.amzn2023.0.2 amazonlinux 42 k
zip x86_64 3.0-28.amzn2023.0.2 amazonlinux 257 k
Installing dependencies:
unzip x86_64 6.0-57.amzn2023.0.2 amazonlinux 182 k
Transaction Summary
==========================================================================================================================
Install 3 Packages
Total download size: 481 k
Installed size: 1.1 M
Downloading Packages:
(1/3): which-2.21-26.amzn2023.0.2.x86_64.rpm 773 kB/s | 42 kB 00:00
(2/3): unzip-6.0-57.amzn2023.0.2.x86_64.rpm 2.7 MB/s | 182 kB 00:00
(3/3): zip-3.0-28.amzn2023.0.2.x86_64.rpm 3.6 MB/s | 257 kB 00:00
--------------------------------------------------------------------------------------------------------------------------
Total 920 kB/s | 481 kB 00:00
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : unzip-6.0-57.amzn2023.0.2.x86_64 1/3
Installing : zip-3.0-28.amzn2023.0.2.x86_64 2/3
Installing : which-2.21-26.amzn2023.0.2.x86_64 3/3
Running scriptlet: which-2.21-26.amzn2023.0.2.x86_64 3/3
Verifying : unzip-6.0-57.amzn2023.0.2.x86_64 1/3
Verifying : which-2.21-26.amzn2023.0.2.x86_64 2/3
Verifying : zip-3.0-28.amzn2023.0.2.x86_64 3/3
Installed:
unzip-6.0-57.amzn2023.0.2.x86_64 which-2.21-26.amzn2023.0.2.x86_64 zip-3.0-28.amzn2023.0.2.x86_64
Complete!
awscli のインストール
docker コンテナに awscli をインストール
bash-5.2# curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 62.9M 100 62.9M 0 0 113M 0 --:--:-- --:--:-- --:--:-- 113M
bash-5.2# unzip awscliv2.zip
:
:
inflating: aws/dist/docutils/parsers/rst/include/isocyr1.txt
inflating: aws/dist/docutils/parsers/rst/include/isotech.txt
inflating: aws/dist/docutils/parsers/rst/include/isomscr-wide.txt
inflating: aws/dist/docutils/parsers/rst/include/isoamsb.txt
inflating: aws/dist/docutils/parsers/rst/include/isolat2.txt
bash-5.2# ./aws/install
You can now run: /usr/local/bin/aws --version
bash-5.2# /usr/local/bin/aws --version
aws-cli/2.17.65 Python/3.12.6 Linux/6.1.109-118.189.amzn2023.x86_64 exe/x86_64.amzn.2023
EC2 にアクセスするキーを docker コンテナにコピー
docker コンテナでディレクトリを作成
bash-5.2# mkdir -p /var/lib/aws
他のターミナルなどから EC2 にアクセスするキー (/var/lib/aws/aws_cli.key) を docker コンテナにコピー
(ヒアドキュメントで読み込む)
# cat /var/lib/aws/aws_cli.key
アクセスキー
シークレットキー
ap-northeast-1
text
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4c1bfd43594e amazonlinux:2023 "bash" 26 minutes ago Up 26 minutes intelligent_stonebraker
# docker cp /var/lib/aws/aws_cli.key 4c1bfd43594e:/var/lib/aws
Successfully copied 2.05kB to 4c1bfd43594e:/var/lib/aws
awscli コマンドをかためる
aws コマンドの実体を探す
bash-5.2# ls -al /usr/local/bin/aws
lrwxrwxrwx. 1 root root 37 Oct 3 23:27 /usr/local/bin/aws -> /usr/local/aws-cli/v2/current/bin/aws
bash-5.2# ls -al /usr/local/aws-cli/v2/current/bin/aws
lrwxrwxrwx. 1 root root 11 Oct 3 23:27 /usr/local/aws-cli/v2/current/bin/aws -> ../dist/aws
bash-5.2# ls -al /usr/local/aws-cli/v2/current/dist/aws
-rwxr-xr-x. 1 root root 6525544 Oct 3 23:27 /usr/local/aws-cli/v2/current/dist/aws
awscli コマンドを Lambda の動作ディレクトリ (bin) に合わせてから、かためる
bash-5.2# cp -r /usr/local/aws-cli/v2/current/dist /volume/bin
bash-5.2# cd /volume
bash-5.2# zip -r awscli.zip bin
:
:
adding: bin/docutils/parsers/rst/include/isomscr-wide.txt (deflated 80%)
adding: bin/docutils/parsers/rst/include/isoamsb.txt (deflated 72%)
adding: bin/docutils/parsers/rst/include/isolat2.txt (deflated 84%)
adding: var/lib/aws/aws_cli.key (stored 0%)
bash-5.2# ls -al awscli.zip
-rw-r--r--. 1 root root 67580649 Oct 3 23:33 awscli.zip
docker コンテナから awscli.zip をコピー
S3 に置くファイルをホストOS にコピーする
# docker cp 4c1bfd43594e:/volume/awscli.zip ./awscli.zip
Successfully copied 67.6MB to /home/ec2-user/awscli.zip
# ls -al awscli.zip
-rw-r--r--. 1 root root 67580905 Oct 4 08:46 awscli.zip
awscli コマンドのファイル (awscli.zip) を S3 にアップロード
[バケットの作成] をクリックをして、新しいバケットを用意する。
[バケット名] に適当な名前を入れる
他の項目は特に変更せずに [バケットの作成] をクリック
汎用バケットが作成されるので、バケットの名前のリンクをクリックする。
[アップロード] をクリックしてアップロードページを表示する。
アップロードページで [ファイルを追加] で awscli.zip を選択する。
アップロードすると、進行中画面が出て、アップロード完了画面となる。
[オブジェクト] に awscli.zip が入る。
[オブジェクト] の awscli.zip をインクをすると詳細が出てくるので、この [オブジェクトURL] を覚えておく(どこかコピーしておく)
Lambda レイヤーを用意
Lambda の左メニューから [レイヤー] を選択をして [レイヤーの作成] をクリックする。
以下のレイヤーの設定をして、[作成] をする。
- [名前] は適当
- [Amazon S3 からファイルをアップロードする]を選択し、awscli.zip のオブジェクトURL を入力(コピペ)する
- 互換性のあるアーキテクチャは、awscli を用意した環境と同じ (だいたいは x86_64 だとは思うが)
- 互換性のあるランタイムのリストから、awscli を用意した OS (ここでは Amazon Linux 2023)
レイヤーが作成される
- 詳細画面
- 一覧画面
Lambda 関数を用意
左のメニューから [関数] をクリックして [関数の作成] をクリックする。
以下の関数の設定をして [関数の作成] をクリックする。
- [名前] は適当に入れる
- 互換性のあるアーキテクチャは、awscli を用意した環境と同じ (だいたいは x86_64 だとは思うが)
- [ランタイム]は動作させたい環境 (awscli を動作させたい環境なので Amazon Linux 2023)
関数が作成されるので、レイヤーを設定する
画面の下に行き [レイヤー] にある [レイヤーの追加] をクリックする。
関数にレイヤーを設定して [追加] をクリックする
自分で作ったレイヤーを選択する。
バージョンは利用するバージョンを選択する。
コードソードが出てくる
関数のコードを修正
ソースコードで以下の変更をして [deploy] をクリックする。
- bootstrap.sh.sample を bootstrap に名前を変更
- hello.sh.sample を hello.sh に名前を変更し aws --version と追加し実行してみる
Lambda 関数の実行タイムアウトを変更
デフォルトだと3秒なので、タイムアウト時間を延ばす
[設定] の [一般設定] にある [編集] をクリックする。
[タイムアウト] の設定でとりあえず5分にして [保存] をクリックする。
関数の実行
[テスト] をクリックする。
以下の画面で、[名前]を適当に入力し、他は変更せずに [保存] をクリックする。
[テスト] で [テスト] をクリックすると実行する。
だいたい20秒ぐらいで終了する。
Lambda でawscli を利用してEC2 のインスタンス一覧を表示する
EC2 へのアクセス権追加
実行ロールに EC2 の読み込み権限を付与しないと以下のようなエラーになる。
An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.
実行ロールの [ロール名]のリンクをクリック
IAM の [ロール]設定画面に移動するので、[許可ポリシー]で [許可を追加]をクリックする。
※)以下の設定ではすでに AmazonEC2ReadOnlyAccess の許可がされている
[ポリシーをアタッチ]を選択する。
ポリシーのなかから「AmazonEC2ReadOnlyAccess」を選択して[許可を追加]をクリックする。
awscli のコマンドを設定
[設定] の環境変数で以下の設定をしておく。
AWS の接続キーはホームディレクトリ (/home/xxxxx) に保存しようとするが、Lambda は /tmp 以外はリードオンリーのため、保存するキーのファイル位置を変更する。
- キー
** AWS_CONFIG_FILE - 値
** /tmp/.aws/config
[コード] に以下のように記載する
function handler () {
EVENT_DATA=$1
aws --version
echo AWS_CONFIG_FILE=$AWS_CONFIG_FILE
aws configure set アクセスキー シークレットキー
ls -al /tmp/.aws/
echo Display INstance ID List
aws ec2 describe-instances --query 'Reservations[].Instances[].{InstanceId:InstanceId}'
RESPONSE="{\"statusCode\": 200, \"body\": \"Hello from Lambda!\"}"
echo $RESPONSE
}
[テスト] で実行すると以下のようにインスタンスの一覧が出てくる