📝

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