はじめに
ECSを用いたDockerでRailsのデータベース更新する場合、どうやってデータベース更新をすればいいのか悩むことになった。
色々と調べた結果、ECSのRunTaskでデータベース更新を行う企業が多いと判明。
RunTaskをAWS Lambdaで実現するためにはどうすれば良いのかを纏める。
ECS RunTaskとは
ECSでDockerコンテナを動作させている。
これはDockerfileで指定したコマンドが動作している。
Dockerコンテナに対して単発で実行できるのが特徴!
構成
- AWS Lambda(Python 3.8)
- Elastic Container Service (ECS)
前提
ECSですでにDockerやEC2が立ち上がっている前提とする。
ECS情報
- クラスター名:
cluster-name
- タスク定義:
task-definition-family
RunTaskでbundle exec rails routesを実行する
import json
import boto3
ecs = boto3.client('ecs')
def lambda_handler(event, context):
# ECSタスクの実行(単発)
response = ecs.run_task(
cluster='cluster-name',
taskDefinition='task-definition-family',
launchType='EC2',
overrides={
'containerOverrides': [
{
'name': 'container_name',
'command': ["bundle","exec","rails", "routes"],
'memory': 64
}
]
}
)
# エラーの検知
print(response)
failures = response['failures']
if len(failures) != 0:
print(failures)
return {
'statusCode': 500,
'body': json.dumps('NG!')
}
# 正常終了
return {
'statusCode': 200,
'body': json.dumps('OK!')
}
説明
参考:ECS RunTask
run_taskのパラメータ
- cluster: ECSのクラスター名を指定する
- launchType: EC2で起動するかFargateで起動するかを指定する
- taskDefinition: 実行するタスク定義を指定(デフォルトでlatest)
- overrides: 上書きするコンテナ情報を設定する
- containerOverrides
- name: コンテナ名
- command: Dockerコマンドに上書きするコマンド
- memory: Dockerのメモリー
- containerOverrides
上記以外のパラメータ以外はboto3の公式を参照。
まとめ
ECS RunTaskをAWS Lambdaで実行できる様にすることでCodePipelineと組み合わせたりCodeDeploy→SNSと組み合わせることもできてアーキテクチャの自由度が増すのでおすすめ!