📝
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