AWS CodePipelineでCodeCommitからCodeBuildして成果物をS3に配置する環境をCloudFormationで作る

f:id:akagoma:20220212231714p:plain

はじめに

前回、GitlabとAWS CodeCommitを連携して、GitlabからCodeCommitにミラーリングする環境をCloudFormationで構築した。

blog.akagoma.com

今回は、CodeCommitからCodeBuildでビルドを実施し、成果物をS3にデプロイする環境をCloudFormationで構築する。

なぜCloudFormationを使うのか?という話もあるが、前回の記事の通り属人化を防ぐことに目的がある。

CodePipelineの作成

全体の流れとしては、「CodePipelineがCodeCommitからソースを取得し、CodeBuildに渡してビルドをして、S3にアップロードする」というフローになる。

f:id:akagoma:20211211101516p:plain

GitlabからCodeCommitまでは前回作成したので、続きとしてCodePipelineを作成する。

CodePipelineの作成

CodeBuildの作成

今回のCodeBuildはPipelineの一部として作成する。なのでArtifactsのTypeにはCODEPIPELINEを指定する。同様にソースの受け取りもPipelineから受け取るので、SourceのTypeもCODEPIPELINEを指定する。

ビルド環境はEnvironmentにて指定する。ここは適当に決める。

SourceのBuildSpecにはビルド時にやることを記載するが、汎用性を持たせるためにパラメータでリポジトリ内のファイルを指定するようにした。

CodePipelineの作成

今回のCodePipelineは上図の通り、「CodePipelineがCodeCommitからソースを取得し、CodeBuildに渡してビルドをして、S3にアップロードする」の流れなので、その流れをStagesに記載する。

  • CodeCommitからソースを取得

取得するリポジトリ(CodeCommit)とブランチ(パラメータ)を指定する。

  • CodeBuildでビルド

CodeBuildを作成しているのでそれを指定する。

  • S3にアップロードする

アップロード先のバケット名、オブジェクトのキーを指定する。

ObjectKeyに変数を何も設定しないと、Pipelineが動作するたびにファイルを上書きしてしまう。もしそれが嫌な場合は、対策としてObjectKeyに{datetime}や{uuid}を仕込むことをおすすめする。

(buildspecで、post_buildやbuildの過程で好きなファイル構造になるようにファイル移動してからdiscard-paths: noとすることでも対応できる気がする。未確認。)

今回はartifacts/アプリケーション名/ビルド日時/の下にファイルを配置するようにした。

CodeBuildのIAMロール/IAMポリシーの作成

CodeBuildのRoleを作成する。
許可するのは以下
  • CloudWatchLogs
    • ビルド中のログが吐き出されるため、CloudWatchLogsの権限が必要だった。
      • ARNはarn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/codebuild/{CodeBuild名}になる。
  • S3
    • 一時ファイル置き場として利用される。
    • CodePipelineがCodeCommitから取得したソースの取得や、CodeBuildがビルド結果を置いたりするので必要だった。

CodePipelineのIAMロール/IAMポリシーの作成

次にCodePipelineのRoleを作成する。

許可するのは以下

  • CodeCommit
    • ソースの取得のために必要。
    • ARNはCodeCommitのARNを指定する。
  • CodeBuild
    • ビルドの実施のために必要。
    • ARNは後ほど作成するCodeBuildのARNを指定する。
  • S3
    • 成果物をリリースするために必要。
    • ここではパラメータとして出力先S3を指定する。

感想

年末年始でバタバタしていたせいで、作業が遅れてしまった。

CloudFormationを使うメリットとしては、画面ポチポチで勝手に作られてるサービスを詳細に知ることができることにある気がした。

Copyright (C) 2021 akagoma. All Rights Reserved.