Pocket

[AWS][Terraform][WordPress]ECS/Fargate + EFSでハマったこと

前回はECS/Fargate + EFSWordPressの構築でハマったことをブログしましたが、今回はStg、本番環境にデプロイできるように実装したのでブログします。答えを言ってしまうとCircleCIとAWS CodeBuildを組み合わせれば可能です。ちなみに自分はCodeBuildを触ったことがなかったので非常にお勉強になりました。まずはSystem Managerの設定から行いましょう。


System Managerの設定

GitHub専用の秘密鍵をSystem Managerに登録しておきます。後ほど設定するCodeBuildで環境変数として鍵を配置するためですね。

  • パラメータの作成

タイプは安全な文字列で上記のように設定してもらい、値は秘密鍵をペーストして作成すれば完了です。

AWS CodeBuildの設定

  • プロジェクトの設定/ソース

プロジェクトは何でも良いです。チェック項目は特にしません。EFSは既にリポジトリがマウントされている前提ですので、ソースプロバイダはGitHubのリポジトリを連携できますが、リリース時に何個もリポジトリがあるとCodeBuildのプロジェクトを作成しなければならなく、管理が雑多になってしまうため、1つのプロジェクトでかつCircleCIでデプロイメントできるようにしました。なので今回は設定しなくてOKとなります。

  • 環境

OSはAmazon Linux 2にしました。特権付与はEFSでマウント時にアクセス権限を付与しないとプロジェクトが作成されないので必ずチェックしましょう。追加設定ではVPCは各自設定してください。環境変数では先程System Managerで設定した秘密鍵をパラメータとして追加します。他にも環境変数としてgithubのメールアドレスとユーザー名も追加しましょう。ファイルシステムは識別子がEFS_1でIDは選択すると候補が出るので指定します。マウントポイントも忘れずに。

  • Buildspec

  • EFS 

BuildspecではGitHubの鍵を配置して、変数化したブランチをgit pullするだけになります。この変数化したBRANCHやRELEASE_PATHは後ほどCircleCIで使いますので後で説明します。ちなみに今回EFSの権限ですが、仮のadachinユーザーとしましょう。CodeBuildのAmazon Linux 2は初めにcodebuild-userでbuildをしますが、このホームディレクトリは以下のように/home配下ではありません。(なぜよ…)それにホームディレクトリの権限は何故かrootでしたので、そのままホームディレクトリに鍵を配置してもrootユーザーでgit pullされてしまうということがあったので、一旦codebuild-userを削除し、対象ユーザーを作成、鍵をコピー、sudoで対象ユーザーを指定しながらgit pullをすると対象ユーザで権限が揃うことができました。(ここは二日くらいハマった…)

あとはそのままログはCloudWatch Logsに飛ぶように設定してもらい、以下System Manager用のポリシーを作成したら上記のロールに設定してください。

  • build-id_rsa

以上でStg環境のAWS CodeBuildの設定は完了です。本番環境も同様に作成してください。


■デプロイの仕組み

まず、CircleCIの実装よりも前に上記で設定したCodebuid/Buildspecの環境変数について説明します。${BRANCH} は名前の通りブランチ名を指定する環境変数です。${RELEASE_PATH} はリポジトリ名(ディレクトリ先)となります。これを毎回CircleCIでリリースするためにはaws cliを使って、Codebuidの環境変数を上書きして実行すれば可能です。aws cliでの実行方法としては以下になります。

https://docs.aws.amazon.com/cli/latest/reference/codebuild/start-build.html

残りはCircleCIで実装すれば完了です。以下図を作ってみました。

 

・Stg環境はシェルスクリプトでCircleCIのAPIからブランチ名を引数として実行
 ・Dockerコンテナからaws cliでcodebuild実行
 ・特定のブランチにgit checkoutとgit pullでデプロイ完了
・本番環境はMasterマージでDockerコンテナからaws cliでcodebuild実行
 ・Masterブランチにgit checkoutとgit pullでデプロイ完了

CircleCIでAPIリリース方法は以下ブログ書いているので参考に。

[CircleCI][ECS/Fargate]API v2を使って気楽にステージング環境をデプロイさせる


CircleCI

  • .circleci/config.yml

aws-cliはOrbsでインストールしてクレデンシャルの設定をします。特に35行目でcodebuild用シェルのBRANCH_NAMEからCircleCIの環境変数であるブランチにsedで置換しています。これによって特定のブランチでもCodebuidの環境変数に上書きして、git pullがEFS上でできるようになり、リリースに繋がります。では早速テストしてみましょう!

  • stg-deploy.sh

  • deploy_codebuild.sh


Test

  • シェルでStgリリースする

  • CircleCI

  • Codebuild

ちゃんとStg環境がデプロイされてtest2.htmlファイルが追加されていました!本番環境はMasterマージすればOKなので以下試してみましたが問題なくデプロイされてました!


まとめ

危うく各リポジトリごとにCodebuidのプロジェクトを設定するところだった… そしてTerraform化すればヨカタ…

Codebuidはじめて触ってみましたが、かなり便利ですね。CircleCIと同じで何でもできそう。ただ、CircleCIのようにSSHデバッグができないのでひたすらlsしまくって確認してましたが、直接インスタンスにログインするというデバッグ方法があったというね…EFSでのリリース実現できてよかった!

Pocket


adachin

1989年生まれのSRE。ホスティングから大規模なアドテクなどのインフラエンジニアとして携わる。現在はサービスの信頼性向上、DevOps、可用性、レイテンシ、パフォーマンス、モニタリング、オブザーバビリティ、緊急対応、AWS/Azureでのインフラ構築、Docker開発環境の提供、Kubernetes保守、インフラコード化、新技術の検証、リファクタリング、セキュリティ強化などを担当している。個人事業主では数社サーバー保守とベンチャー企業のSREインフラコンサルティングやMENTAで未経験者にインフラのコーチング/コミュニティの運用を実施している。また、「脆弱性スキャナVuls」のOSS活動もしており、自称エバンジェリスト/技術広報/テクニカルサポート/コントリビュータでもある。

0件のコメント

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください