contents

AWS CodeDeploy、AWS CodeBuild 、Fargate、Auroraを用いた、
blue green デプロイ環境、およびフローイメージ図
また、stg環境、dev環境、prod環境などでデプロイメントを使い分けるための参考に

対象者

CodeDeployを用いた環境構築を一旦一例でざっくり掴みたい方
環境で同一のスクリプトを使ってみる参考に

イメージ

codeDeployのデプロイ処理開始例(updateProdECSService.shは後述)

bash ./scripts/updateProdECSService.sh --ENVIRONMENT_NAME prod --AWS_ACCOUNT_ID
hoge --SERVICE_NAME hoge --PORT_NUM hoge --TASK_REVISION_NUM hoge
hoge

script例:updateProdECSService.sh

# 本番環境のECSサービスをcodedeployで更新するための処理

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


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

# 引数をチェック。必要な引数がない場合は使用方法を説明
if [ -z "${ENVIRONMENT_NAME}" -o -z "${AWS_ACCOUNT_ID}" -o -z "${SERVICE_NAME}" -o -z "${PORT_NUM}" -o -z "${TASK_REVISION_NUM}" ]; then
    usage
fi

readonly ECS_CLUSTER_NAME="sample-${ENVIRONMENT_NAME}-cluster"
readonly ECS_SERVICE_NAME="sample-${ENVIRONMENT_NAME}-${SERVICE_NAME}"

readonly APPLICATION_NAME="AppECS-${ECS_CLUSTER_NAME}-${ECS_SERVICE_NAME}"
readonly DEPLOYMENT_G_NAME="DgpECS-${ECS_CLUSTER_NAME}-${ECS_SERVICE_NAME}"

TASK_JSON_DATA=$(cat << EOS | jq
{"revisionType": "AppSpecContent", "appSpecContent": {"content": "{\"version\": 1, \"Resources\": [{\"TargetService\": {\"Type\": \"AWS::ECS::Service\",  \"Properties\": {\"TaskDefinition\": \"arn:aws:ecs:ap-northeast-1:${AWS_ACCOUNT_ID}:task-definition/${ECS_SERVICE_NAME}:${TASK_REVISION_NUM}\", \"LoadBalancerInfo\": {\"ContainerName\": \"${SERVICE_NAME}\", \"ContainerPort\": ${PORT_NUM}}}}}]}"}}
EOS
)

# codeDeployのデプロイ処理開始
aws deploy create-deployment --application-name "${APPLICATION_NAME}" --deployment-group-name "${DEPLOYMENT_G_NAME}" --revision "${TASK_JSON_DATA}"

補足:

フロントアプリに関して、
テストポートへのアクセスに関して、フロント及びバックエンドサーバーもテスト用のものにアクセスしたい場合があると思う、そういった場合はもしaxiosなどを使っていたらaxios.tsなどを変更してあげる必要がある。
e.g. hostNameを見て向き先やポート番号、プロトコルを修正するなど