使いどころさん
- migrationやDB初期化など
- ECSにて1発のみスクリプトを流し込みたい場合は、aws ecsコマンドのサブオプションである
run-task
を使う必要がある -
rnn-task
はいわば、タスクを手動で起動するイメージ-
docker run
とか、kubectl run
とかで初期化したりしますよねそれと同じイメージかな
-
- ECSの場合、kubernetesにはある
init_container
をサイドカーで用意することはできなさそう- これはちゃんと調べていないけれど、サービスの中で一つでもコンテナが落ちるとサービス全体が落ちてしまう
- それを許容するようなパラメータもあったかもしれない
やりかた
- ローカルで
aws ecr run-task
を実行すればよい - それをterraformでやろうとすると
local-exec
を使うことでローカルのコマンドを実行することができる
例
-
triggers
は指定しているパラメータが変更されると、本リソースが実行されるという意味になる- そのため、クラスタやタスク定義が更新されたらこのリソースも実行される
- そもそも、クラスタが起動していないと実行できないスクリプトなので、
depends_on
をつけている
resource "null_resource" "init_db" {
triggers = {
cluster_arn = aws_ecs_cluster.vamdemic_ecs_cluster.arn
task_definition_arn = aws_ecs_task_definition.vamdemic_db_init_task.arn
}
provisioner "local-exec" {
command = <<EOT
aws ecs run-task \
--region $AWS_DEFAULT_REGION \
--profile $PROFILE \
--launch-type FARGATE \
--network-configuration "awsvpcConfiguration={subnets=[$SUBNET_ID],securityGroups=[$SECURITY_GROUP_ID],assignPublicIp=ENABLED}" \
--cluster $CLUSTER_NAME \
--task-definition $TASK_NAME
EOT
interpreter = ["/bin/bash", "-c"]
environment = {
AWS_DEFAULT_REGION = "ap-northeast-1"
PROFILE = "aws-vamdemic-dev"
SUBNET_ID = tolist(data.aws_subnet_ids.private.ids)[0],
SECURITY_GROUP_ID = aws_security_group.vamdemic_sg_ecs.id
CLUSTER_NAME = aws_ecs_cluster.vamdemic_ecs_cluster.name
TASK_NAME = aws_ecs_task_definition.vamdemic_db_init_task.family
}
}
depends_on = [
aws_ecs_cluster.vamdemic_ecs_cluster,
aws_ecs_task_definition.vamdemic_db_init_task
]
}
シェル
#!/bin/bash
PROFILE="aws-vamdemic-dev"
AWS_DEFAULT_REGION="ap-northeast-1"
SUBNET_ID="subnet-00000000000000000"
SECURITY_GROUP_ID="sg-00000000000000000"
CLUSTER_NAME="vamdemic-dev-user01-ecs-cluster"
TASK_NAME="vamdemic-dev-user01-init-db-definition"
aws ecs run-task \
--region ${AWS_DEFAULT_REGION} \
--profile ${PROFILE} \
--launch-type FARGATE \
--network-configuration "awsvpcConfiguration={subnets=[${SUBNET_ID}],securityGroups=[${SECURITY_GROUP_ID}],assignPublicIp=ENABLED}" \
--cluster ${CLUSTER_NAME} \
--task-definition ${TASK_NAME}