1
0

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 3 years have passed since last update.

Gitへのプッシュをトリガーに、自動でBlue/Greenデプロイを行う

Posted at

目次

  1. 背景
  2. 前提
  3. CodePipelineでSorceを作る(ECR+S3)
  4. Blue/Greenデプロイに必要なリソースを作成
  5. デプロイをしてみる

背景

前回記事 ECR・ECSを使用して、Blue/Greenデプロイを行う

Blue/Greenデプロイには成功しましたよっと。
前回までの状態だと、「ECRへのプッシュ」から「Blue/Greenデプロイ」までにコンソールでぽちぽちやらなきゃいけなかったので、そこを自動化していこうと思う。
俺、これが成功したらインフラは中断してアプリの開発の続きをやるんだ…(遠い目)

失敗したケース

やろうとしていたこと

  1. ビルド用サーバーでNuxtビルド
  2. ビルドしたファイルを元に手動でDockerイメージ作成
  3. 作成したDockerイメージをECRにプッシュ
  4. ECRへのプッシュをトリガーにデプロイ開始

参考にしたもの

ECRへのPushでECSをデプロイするだけのシンプルなCodePipelineを試す

結果

これを参考にしてみたけど、S3に格納したimagedefinitions.json(正確にはimagedefinitions.json.zip)を読み込んだところで、「jsonの形式としておかしいよ」的なエラーが出てこける。
何度見てもimagedefinitions.jsonの形式は間違っていないし、「UTF-8で保存しなきゃいけない」というルールも見逃していないし、謎が謎を呼ぶ感じに。
どなたか、原因に心当たりのある方は教えてください。(根本的な部分で何かを見落としている可能性は大きい、とは自覚しています)

問題点

色々と問題点がある。
 ①そもそも4がうまく動いてくれない
 ②1,2の手順を手動でやらなければいけない
 ③ソースコードの管理について何も考えていない

特に③がやばい。
「ゆくゆくはGitで~」とか考えていたけど、もうGit食わず嫌い感が滲み出ている。
「ゆくゆくは」っていつやねん。

ちょっとやり方を変えてみる

「じゃあいつGit使い始めるの?」
「今でしょ!!!」
という茶番を頭に巡らせつつ、やり方を変えてみる。

  1. ビルド用サーバーでNuxtビルド
  2. ビルドしたファイルをCodeCommitへプッシュ
  3. CodeBuildでビルド
  4. CodeBuildの結果を元にデプロイ開始

参考

CodePipelineからECSにBlue/Greenデプロイする

概ねはこちらの参考記事を元にしましたが、何点か変更した点があるので記載しておきます。

CodeDeploy用の設定ファイルが読み込まれないことに対する修正

  • appspec.yaml
  • taskdef.json

これらのファイルは、参考記事だとリポジトリ直下に置いていて、
"Source"のステージで「SourceArtifact」として出力し、
"Deploy"のステージで入力しています。

ただこれだとこけました。

Exception while trying to read the task definition artifact file from: @@@@@  

どうやら、SourceArtifactのサイズが大きすぎたのが原因の様です。
CodeDeployでtask definitionが読み込めない時の対処法

とはいえ、NuxtのアプリだしSourceArtifactのサイズを下げることはできないし…
ということで、

  • appspec.yaml
  • taskdef.json

これらのファイルはzipで固めてS3上に置いて、別のArtifactとして出力することにしました。

具体的には、"Source"のステージにアクションを追加し、以下の様に設定。

設定項目 設定名
アクションプロバイダー S3
バケット 該当バケット名
S3オブジェクトキー 該当zipファイル名
出力アーティファクト S3OutArtifuct

当然"Deploy"ステージも編集して、両ファイルの入力元は「S3OutArtifuct」としました。

Dockerのビルド失敗に対する修正

何度もテストを繰り返していると、突然CodeBuildがこけました。

error pulling image configuration: toomanyrequests: Too Many Requests. Please see https://docs.docker.com/docker-hub/download-rate-limit/

「何もいじっていないのになぜ?」と思っていたら、どうやらDocker Hubのダウンロード回数制限なるものがあったらしい。

こちらの記事を参考に、buildspec.ymlにDockerへのログイン処理を追加しました。
“Too Many Requests.” でビルドが失敗する…。AWS CodeBuild で IP ガチャを回避するために Docker Hub ログインしよう!という話

Deployのステップ1のうち、installが終わらないことに対する修正

installの状態で終わらず、1時間のタイムアウトを迎える…。
AMIのロールか!?とか色々と見直してみたけど、一向に解決せず。
と思ったら、buildspec.ymlの記述が間違っていました…
宣言した環境変数名と、使用している環境変数名が違うっていう、ボーンヘッド中のボーンヘッド…

最終的に

上記の修正点だけ気をつければ、問題なくデプロイを実行することができました。
ひとまず、ようやくAWS周りのお仕事から解放された…
これを見た方々の自動デプロイが、スムーズにいくことを祈っています。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?