Repository navigation
AWS Backend Setup
本マニュアルは、本ソフトにおけるバックエンドの AWS 連携機能について、概要・アーキテクチャ・必要な AWS リソース・環境変数・ローカル/本番でのセットアップ手順・トラブルシューティングを説明します。
対象読者: AWS(S3 / DynamoDB / AWS Batch / Lambda / API Gateway)と Terraform の基本操作ができる開発者・インフラ担当者を想定しています。
- 概要とアーキテクチャ
- 前提条件
- 必要な AWS リソースと要件
- バックエンド環境変数一覧
- ローカル開発環境から AWS リソースを利用する手順
- 接続テストとトラブルシューティング
- AWS Batch (Worker) の CPU / GPU 設定切り替え
- IAM ポリシーの最小構成
- ワーカーイメージのビルドと ECR への push
このページから参照するソースコード・インフラ定義は、いずれも GitHub リポジトリ
matsuolab/lecture_subtitle_translatorのmainブランチを指します。
バックエンドの動作モードを aws に設定すると、Web API と文字起こし処理(Worker)が分離された非同期分散型アーキテクチャに切り替わります。
flowchart TD
Client["クライアント (Tauri / Web)"]
APIGW["HTTP API Gateway"]
Lambda["Lambda Managed API<br/>(backend.lambda_handler.handler)"]
S3Input["S3 Input Bucket<br/>(音声・動画アップロード)"]
S3Result["S3 Result Bucket<br/>(結果JSON格納)"]
DynamoDB["DynamoDB Jobs Table<br/>(ステータス台帳)"]
SecretsManager["AWS Secrets Manager<br/>(Bearerトークン)"]
BatchQueue["AWS Batch Job Queue"]
BatchEnv["AWS Batch Compute Environment"]
Worker["WhisperX Worker (EC2 Container)<br/>(backend.aws_worker)"]
%% 1. アップロード & ジョブ作成
Client -->|"1. 接続確認 & アップロード要求"| APIGW
APIGW --> Lambda
Lambda -->|"2. 署名付きURL生成"| Client
Client -->|"3. 音声ファイルPUT"| S3Input
Client -->|"4. ジョブ開始リクエスト"| APIGW
Lambda -->|"5. ジョブ初期データ登録"| DynamoDB
Lambda -->|"6. ジョブ投入 (submit_job)"| BatchQueue
%% 2. ジョブ実行
BatchQueue --> BatchEnv
BatchEnv -->|"7. ジョブ実行"| Worker
Worker -->|"8. 音声ダウンロード"| S3Input
Worker -->|"9. ステータス更新 (running)"| DynamoDB
Worker -->|"10. 処理実行 (WhisperX)"| Worker
Worker -->|"11. 結果JSONアップロード"| S3Result
Worker -->|"12. ステータス更新 (success/failed)"| DynamoDB
%% 3. 結果取得
Client -->|"13. ポーリング (状態確認)"| APIGW
Lambda -->|"14. ジョブ状態読み込み"| DynamoDB
Client -->|"15. 完了検知 -> 結果取得"| APIGW
Lambda -->|"16. 結果JSON読み込み"| S3Result
Lambda -->|"17. 結果返却"| Client
%% その他
Lambda -.->|"認証トークン取得"| SecretsManager
本マニュアルは「Terraform で AWS インフラが既に展開済み」であることを前提に、その利用方法を説明します。インフラ未展開の場合は、先に Terraform を適用してください。
| ツール | 用途 |
|---|---|
| AWS CLI v2 | 認証情報の設定・各種確認 |
| Terraform | インフラの構築(infra/terraform/aws_dev/) |
| Python 3.13 + venv | バックエンド API のローカル実行 |
| Docker | WhisperX Worker コンテナのビルド・ECR push |
variables.tf のうち デフォルト値がない変数は terraform apply 時に必ず指定する必要があります。
| 変数名 | 内容 |
|---|---|
private_subnet_ids |
AWS Batch / Lambda を配置するプライベートサブネット ID のリスト |
batch_security_group_ids |
Batch コンピュート環境に付与するセキュリティグループ ID のリスト |
budget_alert_email |
コストアラート(Budgets / Cost Anomaly Detection)の通知先メールアドレス |
managed_service_bearer_token |
Secrets Manager に格納する Bearer トークン(sensitive) |
リージョン・インスタンスタイプ・ライフサイクル日数などその他の変数はデフォルト値を持ちます。詳細は
variables.tfを参照してください。
インフラ定義ファイル main.tf に基づく、必要な AWS リソースの要件です。
-
入力用バケット (
MANAGED_SERVICE_AWS_INPUT_BUCKET)-
CORS 設定: ブラウザ(Web / dev)から Presigned URL 経由で直接
PUTアップロードできるようにするため、以下の CORS 許可が必要です。- 許可するオリジン:
http://127.0.0.1:5173,http://localhost:5173,http://tauri.localhost,https://tauri.localhost - 許可するメソッド:
PUT,GET,HEAD - 許可するヘッダー:
* - 露出するヘッダー:
ETag - キャッシュ時間 (
max_age_seconds):300
- 許可するオリジン:
-
[!NOTE] S3 は
tauri://localhostを CORS オリジンとして受け付けません。そのため macOS / Linux の Tauri アプリでは、ブラウザのfetch(CORS 対象)ではなく Rust 側の HTTP クライアント(tauriFetch)経由で S3 に直接 PUT します。この経路はOriginヘッダーを送らず CORS の対象外となるため、S3 CORS にtauri://localhostを含める必要はありません(pipelineClient.ts参照)。 -
ライフサイクル: アップロードされた音声ファイルは一時ファイルであるため、1日後に自動削除するように構成します(
s3_input_expiration_days = 1)。
-
CORS 設定: ブラウザ(Web / dev)から Presigned URL 経由で直接
-
結果出力用バケット (
MANAGED_SERVICE_AWS_RESULT_BUCKET)-
ライフサイクル: コスト削減のため、30日後に低頻度アクセスストレージ(
STANDARD_IA)へ移行し(s3_result_transition_days = 30)、120日後に自動削除します(s3_result_expiration_days = 120)。
-
ライフサイクル: コスト削減のため、30日後に低頻度アクセスストレージ(
-
プライマリキー:
job_id(文字列 /S) -
課金モード:
PAY_PER_REQUEST(オンデマンド)。 -
レコードのスキーマ: アプリケーション側から以下のキーが読み書きされます。
-
job_id(S, Hash Key) -
status(S):queued->running->success/failed -
current_step(S): 進捗ステップ (例:queued,transcribe) -
completed_steps(L): 完了したステップのリスト -
source_name(S): 入力元のファイル名 -
input_key(S): S3上の入力ファイルキー -
workflow(S): 使用したワークフロー名 -
batch_job_id(S): AWS Batch のジョブID -
result_key(S): S3上の結果JSONキー (成功時) -
error(S): エラーログ (失敗時) -
created_at/updated_at(S): UTCタイムスタンプ(YYYY-MM-DDTHH:MM:SSZ)
-
- 認証モードが
bearer_tokenに設定されている場合、API Gateway 経由のリクエストを検証するための静的トークンをシークレット値として安全に保管します。
- WhisperX 実行環境をコンテナ化した Docker イメージを格納します。
-
[!IMPORTANT] イメージは自動ではビルドされません。 Terraform は空の ECR リポジトリを作成するだけで、ワーカーイメージのビルドと push は手動で行う必要があります(§9 ワーカーイメージのビルドと ECR への push 参照)。イメージを push する前に Batch ジョブを実行すると、イメージを pull できずに失敗します。
-
ライフサイクルポリシー:
-
untagged(タグなし)イメージは1日後に自動削除。 - リポジトリに保持するタグ付きイメージは最大
ecr_keep_image_count件(デフォルト 5件)に制限し、ストレージコストを抑制します。
-
-
Compute Environment (計算環境): 以下の 3つ を定義しています。
-
*-gpu: GPU スポット(g4dn.xlarge/SPOT_CAPACITY_OPTIMIZED)。 -
*-gpu-ondemand: GPU オンデマンド(g4dn.xlarge/BEST_FIT_PROGRESSIVE)。 -
*-cpu-ondemand: CPU オンデマンド(フォールバック用)。batch_include_cpu_fallback = trueのときのみキューに組み込まれます。GPU Quota 制限時の経路確認テスト用途として、m7i.xlargeなどの CPU インスタンスを定義可能。 - いずれも Fargate ではなく EC2 計算環境です。理由は、WhisperX のベースコンテナイメージが大きいため、EC2 の ECS コンテナエージェントによるキャッシュ(
ECS_IMAGE_PULL_BEHAVIOR = prefer-cached)を有効にして、2回目以降のジョブ起動(コンテナプル時間)を高速化するためです。
-
-
Job Queue (ジョブキュー):
- 投入されたジョブの待機列。計算環境を優先順位付きでマッピングします: ① GPU オンデマンド → ② GPU スポット →(任意)③ CPU オンデマンド(フォールバック)。
-
Job Definition (ジョブ定義):
- プラットフォーム:
EC2 - 実行コマンド:
["python", "-m", "backend.aws_worker"] - 各種 WhisperX 動作用環境変数を設定(§7 参照)。
- プラットフォーム:
バックエンドが AWS 連携モードで動作する際に必要な環境変数の一覧です。設定の解決ロジックは backend/managed/settings.py を参照してください。
| 環境変数名 | 設定値の例 | 説明 |
|---|---|---|
MANAGED_SERVICE_BACKEND |
aws |
バックエンドの動作モードを AWS 連携に指定。 |
AWS_REGION |
ap-northeast-1 |
AWS リソースが配置されているリージョン。AWS_DEFAULT_REGION でも代替可。 |
MANAGED_SERVICE_AWS_INPUT_BUCKET |
matsuo-subtitle-pipeline-dev-input |
アップロード用 S3 バケット名。 |
MANAGED_SERVICE_AWS_RESULT_BUCKET |
matsuo-subtitle-pipeline-dev-result |
結果保存用 S3 バケット名。 |
MANAGED_SERVICE_AWS_JOBS_TABLE |
matsuo-subtitle-pipeline-dev-jobs |
ジョブ状態を保存する DynamoDB テーブル名。 |
MANAGED_SERVICE_AWS_BATCH_JOB_QUEUE |
matsuo-subtitle-pipeline-dev-queue |
ジョブを投入する AWS Batch のジョブキュー名。 |
MANAGED_SERVICE_AWS_BATCH_JOB_DEFINITION |
matsuo-subtitle-pipeline-dev-worker |
実行する AWS Batch のジョブ定義名。 |
| 環境変数名 | デフォルト値 | 説明 |
|---|---|---|
MANAGED_SERVICE_AWS_INPUT_PREFIX |
input-audio/ |
S3 入力バケット内のフォルダプレフィックス。 |
MANAGED_SERVICE_AWS_RESULT_PREFIX |
results/ |
S3 結果バケット内のフォルダプレフィックス。 |
MANAGED_SERVICE_AUTH_MODE |
none |
認証方式。none または bearer_token。 |
MANAGED_SERVICE_BEARER_TOKEN |
(なし) |
auth_mode が bearer_token 時の静的なトークン文字列(テスト・直書き用)。 |
MANAGED_SERVICE_BEARER_TOKEN_SECRET_NAME |
(なし) | Secrets Manager から Bearer トークンを取得する場合のシークレット名。 |
MANAGED_SERVICE_AWS_JOB_PAYLOAD_ENV |
AWS_MANAGED_JOB_PAYLOAD |
AWS Batch コンテナにジョブデータを引き渡す環境変数名。⚠ 後述の注意参照。 |
MANAGED_SERVICE_MAX_UPLOAD_SIZE_BYTES |
5368709120 (5GB) |
最大アップロードサイズ(バイト)。 |
Warning
MANAGED_SERVICE_AWS_JOB_PAYLOAD_ENV は実質的に変更不可です。
ジョブを投入する API 側(aws_adapter.py)はこの設定に従いますが、
受け取る Worker 側(aws_worker.py)は環境変数名 AWS_MANAGED_JOB_PAYLOAD をハードコードしています。
デフォルト値から変更すると Worker がペイロードを読めずに失敗するため、既定値のまま使用してください。
AWS 上に Terraform でインフラが展開されていれば、ローカルの Python 開発環境から AWS 上の S3・DynamoDB・AWS Batch をターゲットにしてデバッグできます。
ローカルマシンに AWS CLI をインストールし、適切な権限(§8 IAM ポリシーの最小構成 を参照)を持つ IAM ユーザーまたはロールの認証情報をセットアップします。
# 認証プロファイルを作成(例: dev プロファイル)
aws configure --profile devプロジェクトのルートまたはバックエンド実行環境に、以下の環境変数を設定した .env ファイルを作成するか、シェルにエクスポートします。
# AWS 接続用の認証プロファイル指定
export AWS_PROFILE=dev
# バックエンドを AWS 連携モードに設定
export MANAGED_SERVICE_BACKEND=aws
export AWS_REGION=ap-northeast-1
# Terraform 適用後に生成された AWS リソース名を指定
export MANAGED_SERVICE_AWS_INPUT_BUCKET=matsuo-subtitle-pipeline-dev-input
export MANAGED_SERVICE_AWS_RESULT_BUCKET=matsuo-subtitle-pipeline-dev-result
export MANAGED_SERVICE_AWS_JOBS_TABLE=matsuo-subtitle-pipeline-dev-jobs
export MANAGED_SERVICE_AWS_BATCH_JOB_QUEUE=matsuo-subtitle-pipeline-dev-queue
export MANAGED_SERVICE_AWS_BATCH_JOB_DEFINITION=matsuo-subtitle-pipeline-dev-worker
# 認証設定(開発時は none 推奨)
export MANAGED_SERVICE_AUTH_MODE=none環境変数を読み込ませた状態で、バックエンド API サーバーを起動します。
# venv が有効な状態で実行
python -m uvicorn backend.api:app --reload --port 8000起動後、ブラウザで http://localhost:8000/docs (Swagger UI) にアクセスし、AWS 連携 API の動作を確認できます。
バックエンド API には、AWS リソースへの接続・アクセス権限を診断する専用エンドポイントが実装されています(backend/api.py)。
| メソッド・パス | 用途 |
|---|---|
GET /health |
プロセスの死活確認({"status":"ok"})。 |
GET /v1/service-config |
サービス設定(バージョン・認証モード等)の取得。checks は含みません。 |
GET /v1/connection-check |
AWS リソースへの接続・権限診断。下記の checks 付き JSON を返します。 |
auth_mode = bearer_tokenの場合は、上記/v1/*エンドポイントへのリクエストにAuthorization: Bearer <token>ヘッダーが必要です。
GET /v1/connection-check を実行します。内部では以下のチェックが上から順に実行され、接続の可否を判定します(aws_adapter.py の check_connection)。
# 内部の診断ロジック (aws_adapter.py)
s3.head_bucket(Bucket=input_bucket) # 入力バケットへのアクセス権確認
s3.head_bucket(Bucket=result_bucket) # 結果バケットへのアクセス権確認
ddb.describe_table(TableName=jobs_table) # DynamoDB テーブルの存在確認
batch.describe_job_queues(...) # ジョブキューの状態 (ENABLED かつ VALID か)
batch.describe_job_definitions(...) # ジョブ定義の存在 (ACTIVE か)返却される JSON レスポンス例:
{
"service": "subtitle-managed-service",
"version": "0.3.0",
"auth": { "mode": "none" },
"upload": { "strategy": "s3-presigned-put", "max_size_bytes": 5368709120 },
"jobs": { "workflow": "managed_transcript_v1" },
"ok": true,
"checks": [
{ "name": "input_bucket", "ok": true, "detail": "matsuo-subtitle-pipeline-dev-input" },
{ "name": "result_bucket", "ok": true, "detail": "matsuo-subtitle-pipeline-dev-result" },
{ "name": "jobs_table", "ok": true, "detail": "matsuo-subtitle-pipeline-dev-jobs" },
{ "name": "batch_job_queue", "ok": true, "detail": "matsuo-subtitle-pipeline-dev-queue" },
{ "name": "batch_job_definition", "ok": true, "detail": "matsuo-subtitle-pipeline-dev-worker" }
]
}"ok": false が返ってきた場合の確認ポイント(失敗したチェックは checks[].ok = false と detail の例外内容で特定できます):
| 失敗したチェック | 主な原因 | 対策 |
|---|---|---|
input_bucket / result_bucket
|
1. バケット名が環境変数と不一致 2. IAM の S3 操作権限不足 |
・S3 バケット名を確認 ・ポリシーに s3:ListBucket(head_bucket に必要)/ s3:GetObject / s3:PutObject が含まれているか確認 |
jobs_table |
1. テーブル名が不一致 2. IAM の DynamoDB 操作権限不足 |
・DynamoDB テーブル名を確認 ・ポリシーに dynamodb:DescribeTable が含まれているか確認 |
batch_job_queue |
1. キューが存在しない 2. キューのステータスが ENABLED 以外3. キューが VALID 以外(計算環境の紐付けエラーなど) |
・AWS Batch 管理画面でキューの状態を確認 ・ひもづく Compute Environment の状態をチェック |
batch_job_definition |
1. 指定された名前のジョブ定義がない 2. ジョブ定義が ACTIVE 状態ではない |
・ジョブ定義名が正しいか、最新のリビジョンが ACTIVE になっているか確認 |
AWS Batch のコンテナ上で動作する WhisperX worker(aws_worker.py)は、環境変数によって CPU 処理と GPU 処理を切り替えられます。
GPU quota の申請中などで、一時的に CPU 動作で経路確認テストを行う場合は、AWS Batch のジョブ定義(Job Definition)で以下の環境変数を書き換えます。
| 環境変数名 | GPU モード (本番推奨) | CPU モード (暫定テスト用) | 説明 |
|---|---|---|---|
WHISPERX_DEVICE |
cuda |
cpu |
実行する演算デバイス。 |
WHISPERX_COMPUTE_TYPE |
float16 |
int8 |
演算精度。CPU モード時は int8 必須。 |
WHISPERX_BATCH_SIZE |
4 (または 8) |
1 |
並列処理バッチサイズ。CPU 時は負荷軽減のため 1 を推奨。 |
Terraform で構築する際は、variables.tf の以下の変数を terraform.tfvars などで上書きして適用します。
# CPU フォールバックテスト時の設定例 (terraform.tfvars)
batch_include_cpu_fallback = true # CPU 計算環境をキューに組み込む
batch_instance_types = ["m7i.xlarge"] # CPU インスタンス
batch_ec2_image_type = "ECS_AL2023" # GPU 用 NVIDIA AMI から非 GPU AMI へ変更
batch_gpu_count = 0
whisperx_device = "cpu"
whisperx_compute_type = "int8"
whisperx_batch_size = 1Note
batch_ec2_image_type のデフォルトは ECS_AL2023_NVIDIA(GPU 用)です。CPU インスタンスを使う場合は、上記のように非 GPU の AMI タイプへ変更してください。変更しないと NVIDIA ドライバ込みの不要なイメージで起動します。
API (Lambda) および Worker (Batch Job) が動作するために必要な IAM ポリシーの定義です。実体は main.tf の aws_iam_role_policy で管理されています。
API の受付、S3 Presigned URL 発行、AWS Batch へのジョブ送信、状態管理に必要な権限です。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::<INPUT_BUCKET_NAME>/*",
"arn:aws:s3:::<RESULT_BUCKET_NAME>/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::<INPUT_BUCKET_NAME>",
"arn:aws:s3:::<RESULT_BUCKET_NAME>"
]
},
{
"Effect": "Allow",
"Action": [
"dynamodb:DescribeTable",
"dynamodb:GetItem",
"dynamodb:PutItem",
"dynamodb:UpdateItem"
],
"Resource": "arn:aws:dynamodb:<REGION>:<ACCOUNT_ID>:table/<JOBS_TABLE_NAME>"
},
{
"Effect": "Allow",
"Action": [
"batch:DescribeJobDefinitions",
"batch:DescribeJobQueues",
"batch:SubmitJob"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue"
],
"Resource": "arn:aws:secretsmanager:<REGION>:<ACCOUNT_ID>:secret:<SECRET_NAME>"
}
]
}コンテナが音声ファイルをダウンロードし、結果をアップロードし、進捗を更新するために必要な権限です。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::<INPUT_BUCKET_NAME>/*",
"arn:aws:s3:::<RESULT_BUCKET_NAME>/*"
]
},
{
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:UpdateItem"
],
"Resource": "arn:aws:dynamodb:<REGION>:<ACCOUNT_ID>:table/<JOBS_TABLE_NAME>"
}
]
}Note
現状の Worker(aws_worker.py)が実際に使用する DynamoDB 操作は UpdateItem のみです。上記ポリシーは Terraform 定義に合わせて GetItem も含めていますが、より厳密に絞る場合は dynamodb:UpdateItem のみでも動作します。
Important
ジョブコンテナにアタッチする IAM ロールには、上記の「B. Worker 用ポリシー」を設定した jobRoleArn を指定してください。ECR からコンテナイメージを取得するために使用される executionRoleArn (ECSTaskExecutionRole) とは別のロールになります。
WhisperX ワーカーのコンテナイメージは CI などで自動ビルドされません。AWS バックエンド環境を構築・運用する担当者(管理者)が、ビルドして ECR に push する必要があります。Terraform で ECR リポジトリを作成した後、かつ Batch ジョブを初めて実行する前に実施してください。
ビルド場所には次の2通りがあります。どちらか一方を実施すれば構いません。
- 方法A: ローカルマシンでビルド — 手元に Docker があれば手軽。ただし大型イメージの pull / push で回線・ディスクを消費します。
- 方法B: EC2 インスタンス上でビルド(大型イメージ向け・推奨) — AWS 内で完結するため、ECR への push が高速かつ安定。ローカルのディスク/回線を圧迫しません。
Note
ベースイメージ ghcr.io/jim60105/whisperx:large-v3-ja(Dockerfile)は GPU 向けで large-v3 モデルを同梱しているため非常に大きいです。ビルド環境には十分なディスク容量(数十 GB 規模)を用意してください。
なお、イメージ自体の ビルドに GPU は不要です(パッケージングのみ)。WHISPERX_DEVICE などの実行時挙動は Batch のジョブ定義の環境変数で上書きされるため、CPU フォールバック(§7)でも同一イメージを使えます。
どちらの方法でも、以下の変数を使います。
ACCOUNT_ID=<your-account-id>
REGION=ap-northeast-1
REPO=matsuo-subtitle-pipeline-dev-worker # = <project_name>-<environment>-worker
ECR=${ACCOUNT_ID}.dkr.ecr.${REGION}.amazonaws.com# 1. ECR ログイン
aws ecr get-login-password --region ${REGION} --profile dev \
| docker login --username AWS --password-stdin ${ECR}
# 2. ビルド(Dockerfile が COPY backend ... を行うため、ビルドコンテキストはリポジトリルート)
docker build \
--platform linux/amd64 \
-f infra/docker/aws_batch_worker/Dockerfile \
-t ${ECR}/${REPO}:latest \
.
# 3. push
docker push ${ECR}/${REPO}:latestNote
Batch の EC2 インスタンス(g4dn.xlarge 等)は amd64 です。Apple Silicon など arm64 マシンでビルドする場合は --platform linux/amd64 の指定が必須です。
AWS 内でビルドするため、ECR への push が同一リージョン内で完結します。ローカルの回線・ディスクを使いません。
ビルド用 EC2 の要件:
- アーキテクチャ: x86_64 (amd64)。Batch 実行環境と同じため
--platform指定が不要。GPU は不要なので汎用インスタンス(例:c6i.xlarge/m6i.xlarge)で十分。 - ルート EBS: 大型イメージに備え 十分な容量(例: gp3 100 GB 以上)。
- IAM インスタンスプロファイル: ECR への push 権限(
ecr:GetAuthorizationToken〔Resource:*〕, および対象リポジトリへのecr:BatchCheckLayerAvailability/ecr:InitiateLayerUpload/ecr:UploadLayerPart/ecr:CompleteLayerUpload/ecr:PutImage)。これを付与しておけば、インスタンス上では--profile指定なしで認証されます。
# ── EC2 インスタンスへ SSH / Session Manager で接続後 ──
# 1. Docker と git を導入(Amazon Linux 2023 の例)
sudo dnf install -y docker git
sudo systemctl enable --now docker
# 2. リポジトリを取得(プライベートリポジトリの場合は認証情報が必要)
git clone https://github.com/matsuolab/lecture_subtitle_translator.git
cd lecture_subtitle_translator
# 3. ECR ログイン(インスタンスプロファイルの権限で認証)
aws ecr get-login-password --region ${REGION} \
| sudo docker login --username AWS --password-stdin ${ECR}
# 4. ビルド(amd64 ネイティブのため --platform は不要)
sudo docker build \
-f infra/docker/aws_batch_worker/Dockerfile \
-t ${ECR}/${REPO}:latest \
.
# 5. push
sudo docker push ${ECR}/${REPO}:latestImportant
ビルド用 EC2 は push が終わったら停止または削除してください。起動したままだと課金が継続します。
main.tf のジョブ定義は、変数 batch_worker_image_reference でイメージを指定します。
-
:latestを使う場合:batch_worker_image_referenceを空のままにすると、<ECRリポジトリURL>:latestが自動的に参照されます。 -
digest 固定で運用する場合(再現性重視・推奨): push 後に digest を取得し、
terraform.tfvarsに貼り付けます。
# push したイメージの digest を取得
aws ecr describe-images --repository-name ${REPO} --region ${REGION} --profile dev \
--image-ids imageTag=latest --query 'imageDetails[0].imageDigest' --output text# terraform.tfvars (digest 固定の例)
batch_worker_image_reference = "<ACCOUNT_ID>.dkr.ecr.ap-northeast-1.amazonaws.com/matsuo-subtitle-pipeline-dev-worker@sha256:<digest>"Note
backend/ のコードや backend/requirements.txt を変更した場合は、ワーカーイメージにも反映するため再ビルド・再 push が必要です。digest 固定運用の場合は、新しい digest を terraform.tfvars に反映して terraform apply してください。