LoginSignup
3
0

More than 1 year has passed since last update.

terraformで作ったECSで構築したタイミングで1発のみ初期化スクリプトを流し込みたいとき

Last updated at Posted at 2022-03-21

使いどころさん

  • 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}

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0