[レポート]AWSを利用したGitFlowの実装 #DOP202 #reinvent

本ブログはAWS re:Invent 2019のワークショップ『Implementing GitFLow with AWS tools』のレポートです。

現地でワークショップに参加はできていませんでしたが、ワークショップの資料が公開されていたので実際にやってみました。

セッション概要

Utilizing short-lived feature branches is the development method of choice for many teams. In this workshop, you learn how to use AWS tools to automate merge-and-release tasks. We cover high-level frameworks for how to implement GitFlow using AWS CodePipeline, AWS CodeCommit, AWS CodeBuild, and AWS CodeDeploy. You also get an opportunity to walk through a prebuilt example and examine how the framework can be adopted for individual use cases.

短命のフィーチャーブランチを利用することは、多くのチームにとって最適な開発方法です。このワークショップでは、AWSツールを使用してマージとリリースのタスクを自動化する方法を学びます。 AWS CodePipeline、AWS CodeCommit、AWS CodeBuild、AWS CodeDeployを使用してGitFlowを実装する方法のハイレベルなフレームワークについて説明します。また、事前に構築された例を確認し、個々のユースケースにフレームワークを採用する方法を検討する機会を得ることができます。

ワークショップ資料

スライド

ワークショップ

AWS DevOps Blog

GitFlowについて

GitFlowは、Gitの機能であるブランチを活用した開発ワークフローです。

GitFlow自体について詳しく知りたい方は、弊社ブログを御覧ください。

レポート

ワークショップのゴール

  • master/developブランチのためのCodePipelineをCloudFormationで自動作成できるようにする
  • ブランチ毎の環境をCloudFormationで自動作成できるようにする
  • CodeCommitのトリガーとLambdaを使って、featureブランチのためのCodePipelineを自動作成・削除できるようにする
  • CodeCommit, CodeBuild, CodePipelineを使って、Elastic Beanstalkアプリケーションをデプロイできるようにする

ワークショップ概要

このワークショップでは、AWS CodePipeline、AWS CodeCommit、AWS CodeBuildを使用して、GitFlowでElastic Beanstalkアプリケーションを実装する方法について学びます。

最初にmasterブランチ用のElastic Beanstalkアプリケーションを構築し、developブランチ、featureブランチが作られた際には自動で各ブランチのCI/CD環境を 含めたElastic Beanstalkアプリケーションを自動作成できるようにしていきます。

(※画像引用:https://gitflow-codetools.workshop.aws/)

Prerequisites(前提条件)

最初にワークショップの資料を見ながら、このワークショップを実施するために必要なAWSアカウント、Cloud9、CodeCommit(Gitリポジトリ)を準備していきます。

  • AWSアカウントの作成
  • ワークスペースの作成
    • Cloud9の構築
  • Gitの設定
    • ユーザー名・E-mailの設定
    • Credential Helperの設定
    • gitflowのインストール
    • CodeCommitの作成&サンプルコードのリポジトリ登録

Master Branch(masterブランチ環境の構築)

まずはメインとなるmasterブランチ環境を、Elastic Beanstalkで構築していきます。

  • Elastic Beanstalkアプリケーションの構築
  • masterブランチ環境の構築

ここで、masterブランチ環境のElastic Beanstalkアプリケーション(Node.js)を、CodeCommit, CodeBuild, CodePipelineでデプロイする環境を構築します。

注意点があります。Elastic Beanstalkアプリケーション(Node.js)のプラットフォームバージョンが2020/01/21に上がっています。

そのため、ワークショップの手順どおり実施すると、Elastic Beanstalkアプリケーションの構築時に失敗します。

この問題はCloudFormationテンプレートである gitflow-workshop/envcreate.yaml39行目SolutionStackNameのバージョンを、 v4.13.0 に変更してからCloudFormationスタックを作成することで解決できます。

Lambda(環境を自動構築するLambdaの作成)

次に、Gitリポジトリにブランチが作成されたときにCodePipelineとElastic Beanstalkアプリケーションを自動作成するLambdaを作っていきます。

  • Lambda作成
  • AWS CodeCommitトリガーの設定

ここでも注意点があります。前章と同様に、Elastic Beanstalkアプリケーション(Node.js)のプラットフォームバージョンが2020/01/21に上がっていることに起因します。

ブランチ作成時に、Lambdaのプログラム内でCloudFormationを利用してElastic Beanstalkアプリケーションを構築していますが、プラットフォームバージョンが古いため構築に失敗します。

この問題を解決するため、プラットフォームバージョンを上げたCloudFormationテンプレートを作成いたしました。
構築したLambdagitflow-workshop-create-pipeline )のコード28行目を、次のCloudFormationテンプレートを参照するように修正して保存してください。

  • https://s3-ap-northeast-1.amazonaws.com/kitano.yuichi/reinvent2019-dop202/envcreate.yaml

Develop Branch(developブランチ環境の構築)

次に、実際にdevelopブランチを作成してdevelopブランチ環境が自動作成できることを確認します。

  • developブランチの作成
  • developブランチ環境の構築

developブランチをGitリポジトリにpushしてしばらくすると、Elastic Beanstalkアプリケーションが構築できます。

構築したElastic BeanstalkアプリケーションのURLにアクセスすると、次のような画面が表示されて、デプロイが成功していることがわかります。

Feature Branch(featureブランチ環境の構築)

次に、git-flowツールを使ってfeatureブランチを作って機能変更を実施し、自動でElastic Beanstalkアプリケーションを構築して動作確認します。

動作に問題が無ければ、featureブランチをdevelopブランチにマージし、featureブランチ用の環境を自動削除するという一連の流れを確認していきます。

  • featureブランチ環境の構築
  • featureブランチ作業の終了

featureブランチをGitリポジトリにpushしてしばらくすると、Elastic Beanstalkアプリケーションが構築できます。

構築したfeatureブランチ環境のElastic BeanstalkアプリケーションのURLにアクセスすると、バックグランウドカラーの変更が反映されており、デプロイが成功していることがわかります。

問題ないことが確認できたので、git-flowツールを使ってfeatureブランチ作業を終了します。その後、featureブランチは不要となるのでGitリポジトリ(CodeCommit)から削除すると、自動でfeatureブランチ環境が削除されていきます。

これで、ワークショップは終了です。

Clean Up

ワークショップが終わったら、無駄にお金がかからないよう次のリソースを削除しておきましょう。

  • develop & masterブランチ環境の削除
  • featureブランチ環境の削除
  • Lambdaファンクションの削除
  • Elastic Beanstalkアプリケーションの削除
  • CodeCommitリポジトリの削除
  • Cloud9の削除

ちなみに、CloudFormationスタックの gitflow-eb-app でS3バケットを作成しており、ビルドファイル等が保存されています。
リソースを削除する際にはS3バケットを空にするのを忘れないようにしましょう。S3バケットにファイルが残っていると、CloudFormationスタックの削除に失敗します。

感想

AWSのCodeシリーズ(CodePipeline, CodeCommit, CodeBuild)を使って、GitFlowでの開発を体験できました。

検証環境とfetureブランチ環境が自動で構築でき、システム動作を確かめることができるのは、システム開発にすごい役立つと思います。