LoginSignup
0
1

AWS CodeDeployを用いたblue green deploymentイメージおよびscript例

Last updated at Posted at 2023-05-24

contents

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

対象者

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

イメージ

image.png

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を見て向き先やポート番号、プロトコルを修正するなど

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