yikegaya’s blog

仕事関連(Webエンジニア)と資産運用について書いてます

Gitlab CIからのECSデプロイ

GItlabでコード管理してAWS ECSでインフラを構築しているプロジェクトのCI/CDを業務で作った。その中でデプロイについて考えたこと書いてみる。

AWS ECSのデプロイについてググるAWS Codeシリーズを使ったCI/CDの構築方法がよく出てくるが、、コード管理に一番メジャーなGithubではなくCI/CDの便利機能を売りにしているGItlabを使っていることを考えるとなるべくGitlabのCIでなるべく完結させてみたい気もする。

AWS Codeシリーズで構築する場合とGitlab CIに寄せる場合のざっくり2パターン考えた。

それぞれの作業を洗い出すとざっくりこんな感じ

AWS Codeシリーズで構築する場合に必要な作業

  • Codeシリーズの構築
    • CodeCommit、CodePipeline、CodeBuild、CodeDeployと一通りのCodeシリーズを構築する必要あり。
  • CloudWatch Event
    • ECRへのpushをCI/CD開始のトリガーにする場合はCloudWatch Eventの作成が必要(CodeCommitへの変更をトリガーにするなら不要)
  • S3
    • CodepipelineはSource→Build→Deployとステージが進んでいくがそれぞれのステージの実行結果をS3にartifactと呼ばれるzip圧縮されたファイルに書き出していく仕組みなのでS3バケットを作成する必要あり
  • IAM
    • コードシリーズやS3にIAMポリシー設定していく必要あり

今のプロジェクトではTerraformでインフラを作っているのでドラフト的にざっくり一通り書いてみたけど上記全部揃えようとすると結構なコード量になる。手作業でやってもいいけどそれはそれで大変

Gitlab CIに寄せた設計を構築する場合

  • Gitlab CIの実行に必要なサーバの設定
    • 今回はEC2をCI用のサーバとして用意した
      • EC2に必要なソフトウェアを入れていく(DockerとかAWS CLIとか)
    • GItlabとCI用サーバの接続設定
  • 実行する処理の定義
    • CIの設定ファイル(.gitlab-ci.yml)にdocker build〜pushまでのコマンドを記載する
  • 必要なAWSのサービス
    • AWS CodeシリーズはCodeDeployのみ追加する。Gitlab CIから「aws deploy create-deployment」コマンドを呼び出してCodeDeployを開始する
    • CodeDeployの実行にS3とIAMは準備必要

で、結局Gitlab CIで作った。.gitlab-ci.ymlでコマンド実行していく形

# ${CI_BUILD_REF_NAME}でブランチ名を指定して環境ごとにデプロイできるようにする
build-demo-app:
  stage: build
  script:
    - docker build demo-app:latest
    - docker push xxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/demo-app-${CI_BUILD_REF_NAME}:latest
 
deploy-demo-app:
  stage: deploy
  script:
    - aws deploy create-deployment --application-name demo-app-${CI_BUILD_REF_NAME} --cli-input-json file://deployment.json --region ap-northeast-1

Codeシリーズは構築するのにやること多くて大変そうだけど現時点でGitlab CIで作るケースより情報量多そうなのでその点はいいかも。