📝
Lambda でコンテナイメージから AWS CLI を実行してみた
前提
- コンテナイメージ作成環境は Cloud9
- ECR リポジトリは作成済み
- Lambda 実行ロール作成済み
- AdministratorAccess 権限を付与
01. コンテナイメージの作成
まずは作業用のディレクトリを作成して移動します。
$ mkdir test
$ cd test
構成は以下の通りです。
lambda-aws-cli/
│
├── Dockerfile
├── app.py
├── requirements.txt
Dockerfile
FROM amazon/aws-lambda-python:3.9
# システムパッケージの更新とAWS CLIのインストール
RUN yum update -y && \
yum install -y unzip && \
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \
unzip awscliv2.zip && \
./aws/install && \
rm -rf awscliv2.zip aws && \
yum clean all
# アプリケーションディレクトリの作成
WORKDIR /var/task
# 必要なPythonパッケージのインストール
COPY requirements.txt .
RUN pip install -r requirements.txt
# Lambda関数コードのコピー
COPY app.py .
# Lambda関数のハンドラを設定
CMD ["app.lambda_handler"]
requirements.txt
boto3==1.26.0
app.py
import json
import subprocess
import os
def lambda_handler(event, context):
try:
# AWS CLI コマンドを実行
# 例: S3バケットの一覧を取得
command = event.get('command', 'aws s3 ls')
# サブプロセスでコマンドを実行
process = subprocess.Popen(
command,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
stdout, stderr = process.communicate()
# 結果を返す
return {
'statusCode': 200,
'body': json.dumps({
'command': command,
'stdout': stdout.decode('utf-8'),
'stderr': stderr.decode('utf-8'),
'exitCode': process.returncode
})
}
except Exception as e:
return {
'statusCode': 500,
'body': json.dumps({
'error': str(e)
})
}
ECR のプッシュコマンドを実行します。
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 012345678901.dkr.ecr.ap-northeast-1.amazonaws.com
$ docker build -t test .
$ docker tag test:latest 012345678901.dkr.ecr.ap-northeast-1.amazonaws.com/test:latest
$ docker push 012345678901.dkr.ecr.ap-northeast-1.amazonaws.com/test:latest
02. Lambda 関数の作成
上記 ECR のイメージを指定して Lambda 関数を作成します。
作成後、テストイベントに以下の JSON を定義して実行します。
{
"command": "aws s3 ls"
}
以下のような結果が出力されれば成功です。
bucket-name0x
にはアカウント内の S3 バケット名が入ります。
{
"statusCode": 200,
"body": "{\"command\": \"aws s3 ls\", \"stdout\": \"2025-02-11 02:00:37 bucket-name01\\n2024-11-09 02:44:22 bucket-name02\\n2025-05-27 06:34:36 bucket-name03\\n2025-05-27 06:34:36 bucket-name04\\n2024-11-12 11:49:41 bucket-name05\\n2024-11-30 06:54:50 bucket-name06\\n2024-11-09 09:40:48 bucket-name07\\n2024-11-09 10:33:51 bucket-name08\\n\", \"stderr\": \"\", \"exitCode\": 0}"
}
まとめ
今回は Lambda でコンテナイメージから AWS CLI を実行してみました。
どなたかの参考になれば幸いです。
Discussion