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に入りました。
資料はGitHubにて既に公開されていました。
最終的には下記の図のようになります。
前提
一番最初に思わず「?」となってしまうことがありました。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がやっている強みが出てますね。
CodePipeline
はいやっとパイプラインで統合できます。
これはGUIで作成していきます。これは本当に要求されるまま一つ一つ設定していくだけでした。
その後は本番用にdeployment-groupを作成し、Manual Judgmentを組み込みました。
感想
CodeStarというのを使えばこれらが一発ででき出来上がるというので、そちらも試してみたくなりました。普通に使い勝手が良かったような印象はあります。EC2へのデプロイだったので、ECSやEKSで使いますか?と言われると首を捻ってしまうかもです。