0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ECSタスク作成、停止スクリプトの環境ごとの使い分け例

Posted at

contents

code Buildやcircleciで実行する、ECSのタスク定義作成、停止スクリプトサンプル。
例えば、dev(開発)環境であれば、ecsを問答無用で更新、停止。
本番環境であればタスク定義のみ更新し、リリース判断時にecsのblue green deploymentなどの使い分けをする場合を想定

対象者

CICDに興味がある、code Buildの実行イメージを掴みたい人

ECSタスク定義作成スクリプト makeNewECSTaskDefinition.sh

bash ./.circleci/makeNewECSTaskDefinition.sh --SERVICE_NAME ${SERVICE_NAME_WEB} --PORT_NUM "hoge" --CPU_VOLUME "2048" --MEMORY_VOLUME "4096" --IMAGE_TAG_NAME $CIRCLE_SHA1 --ENVIRONMENT_NAME ${ENVIRONMENT_NAME} --ENVIRONMENT_FULL_NAME ${ENVIRONMENT_FULL_NAME} --AWS_ACCOUNT_ID ${AWS_ACCOUNT_ID}

makeNewECSTaskDefinition.sh

#!bin/bash

# shの使用方法説明関数
function usage() {
    cat <<EOS
  Usage: $0 [REQUIRED OPTIONS]
  [REQUIRED OPTIONS]
    --IMAGE_TAG_NAME                  : IMAGE_TAG_NAME
    --ENVIRONMENT_FULL_NAME           : ENVIRONMENT_FULL_NAME
    --AWS_ACCOUNT_ID                  : AWS_ACCOUNT_ID
    --ENVIRONMENT_NAME                : ENVIRONMENT_NAME
    --SERVICE_NAME                    : SERVICE_NAME
    --PORT_NUM                        : PORT_NUM
    --CPU_VOLUME                      : CPU_VOLUME
    --MEMORY_VOLUME                   : MEMORY_VOLUME
EOS
    exit 1
}

# 引数から変数への格納部分 --** という引数を明示するために必要
ARGS=($@)
for ((i = 0; i < ${#ARGS[@]}; i++)); do
    case "${ARGS[$i]}" in
    "--IMAGE_TAG_NAME")
        i=$(expr $i + 1)
        readonly IMAGE_TAG_NAME="${ARGS[$i]}"
        ;;
    "--ENVIRONMENT_FULL_NAME")
        i=$(expr $i + 1)
        readonly ENVIRONMENT_FULL_NAME="${ARGS[$i]}"
        ;;
    "--AWS_ACCOUNT_ID")
        i=$(expr $i + 1)
        readonly AWS_ACCOUNT_ID="${ARGS[$i]}"
        ;;
    "--ENVIRONMENT_NAME")
        i=$(expr $i + 1)
        readonly ENVIRONMENT_NAME="${ARGS[$i]}"
        ;;
    "--SERVICE_NAME")
        i=$(expr $i + 1)
        readonly SERVICE_NAME="${ARGS[$i]}"
        ;;
    "--PORT_NUM")
        i=$(expr $i + 1)
        readonly PORT_NUM="${ARGS[$i]}"
        ;;
    "--CPU_VOLUME")
        i=$(expr $i + 1)
        readonly CPU_VOLUME="${ARGS[$i]}"
        ;;
    "--MEMORY_VOLUME")
        i=$(expr $i + 1)
        readonly MEMORY_VOLUME="${ARGS[$i]}"
        ;;
    *)
        usage
        ;;
    esac
done

# 引数をチェック。必要な引数がない場合は使用方法を説明
if [ -z "${IMAGE_TAG_NAME}" -o -z "${ENVIRONMENT_FULL_NAME}" -o -z "${AWS_ACCOUNT_ID}" -o -z "${ENVIRONMENT_NAME}" -o -z "${SERVICE_NAME}" -o -z "${PORT_NUM}" -o -z "${CPU_VOLUME}" -o -z "${MEMORY_VOLUME}" ]; then
    usage
fi
#jqのinstall箇所
JQ_URL="https://circle-downloads.s3.amazonaws.com/circleci-images/cache/linux-amd64/jq-latest"
sudo curl --silent --show-error --location --fail --retry 3 --output /usr/bin/jq $JQ_URL
sudo chmod +x /usr/bin/jq

# 環境変数設定部分
readonly ECR_DOMAIN="${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com"
readonly ECS_CLUSTER_NAME="sample-${ENVIRONMENT_NAME}-cluster"
readonly ECS_SERVICE_NAME="sample-${ENVIRONMENT_NAME}-${SERVICE_NAME}"
readonly ECS_ROLE_NAME="sample-${ENVIRONMENT_NAME}-rehouse-web"

# タスク定義のパラメータに関して、IMAGE_TAG_NAMEの情報を置換しデータを取得
TASK_JSON_DATA=$(cat << EOS | jq
{
  "containerDefinitions": [
    {
      "name": "${SERVICE_NAME}",
      "image": "${ECR_DOMAIN}/${SERVICE_NAME}:${IMAGE_TAG_NAME}",
      "cpu": 0,
      "portMappings": [
        {
          "containerPort": ${PORT_NUM},
          "hostPort": ${PORT_NUM},
          "protocol": "tcp"
        }
      ],
      "essential": true,
      "environment": [],
      "secrets": [{	
        "valueFrom": "google-map-api-key",
        "name": "GOOGLE_MAP_API_KEY"
        }
      ],
      "mountPoints": [],
      "volumesFrom": [],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/${ECS_ROLE_NAME}",
          "awslogs-region": "ap-northeast-1",
          "awslogs-stream-prefix": "ecs"
        }
      },
      "healthCheck": {
        "command": [
          "CMD-SHELL",
          "curl -f http://localhost:${PORT_NUM}/healthcheck || exit 1"
        ],
        "interval": 30,
        "timeout": 8,
        "retries": 3,
        "startPeriod": 240
      }
    }
  ],
  "family": "${ECS_SERVICE_NAME}",
  "taskRoleArn": "arn:aws:iam::${AWS_ACCOUNT_ID}:role/${ECS_ROLE_NAME}-task-role",
  "executionRoleArn": "arn:aws:iam::${AWS_ACCOUNT_ID}:role/${ECS_ROLE_NAME}-task-role",
  "networkMode": "awsvpc",
  "volumes": [],
  "placementConstraints": [],
  "requiresCompatibilities": ["FARGATE"],
  "cpu": "${CPU_VOLUME}",
  "memory": "${MEMORY_VOLUME}"
}
EOS
)

# aws cliで使用するため一度ファイル出力
echo "$TASK_JSON_DATA" > .circleci/TASK_JSON_DATA.json

# aws cliでタスク登録
aws ecs register-task-definition --family ${ECS_SERVICE_NAME} --cli-input-json fileb://.circleci/TASK_JSON_DATA.json


ECSタスク停止スクリプト stopECSTasks.sh

bash ./.circleci/stopECSTasks.sh --CLUSTER_NAME ${ECS_CLUSTER_NAME} --SERVICE_NAME sample-${ENVIRONMENT_NAME}-${SERVICE_NAME_WEB}

stopECSTasks.sh

#!bin/bash

# shの使用方法説明関数
function usage() {
    cat <<EOS
  Usage: $0 [REQUIRED OPTIONS]
  [REQUIRED OPTIONS]
    --CLUSTER_NAME                  : CLUSTER_NAME
    --SERVICE_NAME                  : SERVICE_NAME
EOS
    exit 1
}

# 引数から変数への格納部分 --** という引数を明示するために必要
ARGS=($@)
for ((i = 0; i < ${#ARGS[@]}; i++)); do
    case "${ARGS[$i]}" in
    "--CLUSTER_NAME")
        i=$(expr $i + 1)
        readonly CLUSTER_NAME="${ARGS[$i]}"
        ;;
    "--SERVICE_NAME")
        i=$(expr $i + 1)
        readonly SERVICE_NAME="${ARGS[$i]}"
        ;;
    *)
        usage
        ;;
    esac
done

# 引数をチェック。必要な引数がない場合は使用方法を説明
# 停止する条件を絞るためのクラスター名とサービス名(マッチしたタスクを停止する)
if [ -z "${CLUSTER_NAME}" -o -z "${SERVICE_NAME}" ]; then
    usage
fi

#jqのinstall箇所
JQ_URL="https://circle-downloads.s3.amazonaws.com/circleci-images/cache/linux-amd64/jq-latest"
sudo curl --silent --show-error --location --fail --retry 3 --output /usr/bin/jq $JQ_URL
sudo chmod +x /usr/bin/jq

#停止するタスク情報を上記の変数名から取得
json_data=$(aws ecs list-tasks --cluster ${CLUSTER_NAME} --query "taskArns" --service-name ${SERVICE_NAME})
json_length=`echo ${json_data} | jq length`

for i in `seq 0 $(expr ${json_length} - 1)`
do
    #アカウントに紐付き、該当するタスクの名前を全て取得
    taskname=`echo ${json_data} | jq .[${i}] | sed "s/\"//g"`
    echo ${taskname}
    #タスク消去、apiの戻り値を消去するために--query 'noResponse'を設定
    aws ecs stop-task --cluster ${CLUSTER_NAME} --task ${taskname} --query 'noResponse'
done

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?