1クール続けるブログ

とりあえず1クール続けるソフトウェアエンジニアの備忘録

【AWS Re:Inventレポート】DOP201-R2 - [REPEAT 2] DevOps essentials: Introductory workshop on CI/CD practices

DevOps essentials: Introductory workshop on CI/CD practices

米食べたい気持ちが最高潮に達してしまった3日目2つ目のワークショップです。 AWSのCodeシリーズを使ったWorkshopです。CodeBuild/CodeDeployは使ってみたほうがいいんだろうなとは昔から思っていたのですが、仕事に即活きるかとそうではないものだったため、ずっと手を出せずにいました。

Workshopの流れ

最初にDevOpsとは何かという説明から入りました。Shared Responsbilityのお話とかですね。実践するとどんな利益があるのか?頻度の高いDeliveryやReliabilityの向上に約立つなど基本的な内容が多かったように感じます。そこからCodeシリーズを使ってCI/CDはどのように実現できるかというざっくりとしてお話がありました。どのプロダクトがどのフェーズの役割を担っているか説明が終わった後に実際にWorkshopに入りました。

f:id:jrywm121:20191206034518p:plain

資料はGitHubにて既に公開されていました。

github.com

最終的には下記の図のようになります。

https://github.com/awslabs/aws-devops-essential/raw/master/img/CICD_DevOps_Demo.png

前提

一番最初に思わず「?」となってしまうことがありました。Prerequisitesとして、CodeCommitで構成するために必要な鍵を生成しろとあるんですが、Cloud9を使う場合には必要ありません。そして、その直後からCloud9を使います!はて?なぜ必要だったのかいまだに謎です。

起点はもちろんCodeCommitからになります。あまりガシガシとは使えていませんが、正直、GitHubやBitbucketにくらべ、物足りない印象は拭えませんでした。サンプルコードはJavaのようです。

CodeBuild

Codeシリーズで使用するRoleとS3バケットをCloudFormationで作成し、いざCodeBuildの登場です。
CodeBuildはProjectという単位でパイプライン群を分けていくようです。このプロジェクトでは、ソースとなるコードとアウトプットになるS3バケットが同じになるので、リポジトリと1対1で紐づくイメージを持っています。Jenkinsとかで言うところのパイプラインに相当すると認識です。また、実行する環境(Dockerイメージ)も共通となります。今回はJavaがインストールされたコンテナイメージを使用しています。
buildspec.yml というファイルを作成し、その中にビルド工程を宣言していくようです。実はJenkins以外のCI/CDをあまり使ったことが無いのですが、yamlで書くのはすごく今どきって感じがしますよね。GitHub ActionsやCircle CIがそうなので。
.artifact.filesで指定したものが最終的にzipに固めてS3にアップロードされます。

version: 0.1

phases:
  install:
    commands:
      - echo Nothing to do in the install phase...
  pre_build:
    commands:
      - echo Nothing to do in the pre_build phase...
  build:
    commands:
      - echo Build started on `date`
      - mvn install
  post_build:
    commands:
      - echo Build completed on `date`
artifacts:
  files:
    - target/javawebdemo.war
  discard-paths: no

CodeCommitの直下にあるbuildspec.yml を読み取るので、作成したファイルをgit pushして上げて、CLIからaws codebuild start-build --project-name devops-webapp-projectってな感じです。CloudWatch Eventをトリガーにすることも出来るようですね。マージとかを契機にするには、その辺を組み込まなきゃいけないのが若干手間に感じました。

CodeDeploy

EC2インスタンスVPCを作成するCloudFormationを展開させます。なおEC2のUserDataでCodeDeploy Agentがインストールされているそうです。
deployment-groupというのを作っていきます。Applicationという括りの中にあって、どうやら本番・検証などのステージごとに作るみたいです。今回はEC2のタグでフィルターを掛けてKey=Name,Value=DevWebApp01を1つのグループとしています。appspec.ymlというファイルでこちらは定義していきます。

version: 0.0
os: linux
files:
  - source: /target/javawebdemo.war
    destination: /tmp/codedeploy-deployment-staging-area/
  - source: /scripts/configure_http_port.xsl
    destination: /tmp/codedeploy-deployment-staging-area/
hooks:
  ApplicationStop:
    - location: scripts/stop_application
      timeout: 300
  BeforeInstall:
    - location: scripts/install_dependencies
      timeout: 300
  ApplicationStart:
    - location: scripts/write_codedeploy_config.sh
    - location: scripts/start_application
      timeout: 300
  ValidateService:
    - location: scripts/basic_health_check.sh

合わせてbuildspec.ymlを修正します。直でCodeDeployが指定できるのはいいですね。どっちもAWSがやっている強みが出てますね。

f:id:jrywm121:20191206120955p:plain

CodePipeline

はいやっとパイプラインで統合できます。
これはGUIで作成していきます。これは本当に要求されるまま一つ一つ設定していくだけでした。
その後は本番用にdeployment-groupを作成し、Manual Judgmentを組み込みました。

f:id:jrywm121:20191206122216p:plain

感想

CodeStarというのを使えばこれらが一発ででき出来上がるというので、そちらも試してみたくなりました。普通に使い勝手が良かったような印象はあります。EC2へのデプロイだったので、ECSやEKSで使いますか?と言われると首を捻ってしまうかもです。