📝

Lambda でコンテナイメージから Amplify CLI を実行してみた

に公開

前提

  • コンテナイメージ作成環境は Cloud9
  • ECR リポジトリは作成済み
  • Lambda 実行ロール作成済み
    • AdministratorAccess 権限を付与

01. コンテナイメージの作成

まずは作業用のディレクトリを作成して移動します。

$ mkdir test
$ cd test

構成は以下の通りです。

lambda-amplify-cli/

├── Dockerfile
├── index.js
├── package.json
Dockerfile
FROM public.ecr.aws/lambda/nodejs:20

# 必要なツールをインストール
RUN dnf update -y && \
    dnf install -y git python3 gcc-c++ make && \
    npm install -g @aws-amplify/cli

# 作業ディレクトリを設定
WORKDIR /var/task

# /tmp ディレクトリに書き込み権限を確保
RUN mkdir -p /tmp/amplify-home && \
    chmod -R 777 /tmp/amplify-home

# Lambda 関数のコードをコピー
COPY index.js package.json ./

# 依存関係をインストール
RUN npm install

# Lambda ハンドラーを設定
CMD [ "index.handler" ]
package.json
{
  "name": "amplify-lambda",
  "version": "1.0.0",
  "description": "Lambda で Amplify CLI を実行する",
  "main": "index.js",
  "dependencies": {},
  "engines": {
    "node": ">=20.0.0"
  }
}
index.js
const { execSync } = require('child_process');
const fs = require('fs');
const path = require('path');

exports.handler = async (event) => {
    console.log('イベント受信:', JSON.stringify(event));
    
    try {
        // 書き込み可能なディレクトリを作成して HOME 環境変数を設定
        const tmpHomeDir = '/tmp/amplify-home';
        if (!fs.existsSync(tmpHomeDir)) {
            fs.mkdirSync(tmpHomeDir, { recursive: true });
        }
        
        // Node.js バージョンを確認
        const nodeVersion = process.version;
        console.log(`Node.js バージョン: ${nodeVersion}`);
        
        // Amplify CLI コマンドを実行(HOME ディレクトリを設定)
        const command = event.command || 'amplify --version';
        console.log(`実行コマンド: ${command}`);
        
        const output = execSync(command, { 
            env: { ...process.env, HOME: tmpHomeDir },
            encoding: 'utf8'
        });
        console.log('コマンド出力:', output);
        
        return {
            statusCode: 200,
            body: JSON.stringify({
                nodeVersion,
                command,
                output,
                homeDir: tmpHomeDir
            })
        };
    } catch (error) {
        console.error('エラー発生:', error);
        return {
            statusCode: 500,
            body: JSON.stringify({
                error: error.message,
                stack: error.stack
            })
        };
    }
};

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": "amplify --version"
}

以下のような結果が出力されれば成功です。
bucket-name0x にはアカウント内の S3 バケット名が入ります。

2025-05-30T04:53:50.714Z	8a857b08-acf7-486f-9fe2-acf87c04f5ca	INFO	イベント受信: {"command":"amplify --version"}
2025-05-30T04:53:50.724Z	8a857b08-acf7-486f-9fe2-acf87c04f5ca	INFO	Node.js バージョン: v20.19.0
2025-05-30T04:53:50.724Z	8a857b08-acf7-486f-9fe2-acf87c04f5ca	INFO	実行コマンド: amplify --version
2025-05-30T04:54:19.517Z	8a857b08-acf7-486f-9fe2-acf87c04f5ca	INFO	コマンド出力: Downloading release from https://package.cli.amplify.aws/13.0.1/amplify-pkg-linux-x64.tgz
amplify has been installed!
13.0.1
13.0.1

まとめ

今回は Lambda でコンテナイメージから Amplify CLI を実行してみました。
どなたかの参考になれば幸いです。

Discussion