はじめに
前回、GitlabとAWS CodeCommitを連携して、GitlabからCodeCommitにミラーリングする環境をCloudFormationで構築した。
今回は、CodeCommitからCodeBuildでビルドを実施し、成果物をS3にデプロイする環境をCloudFormationで構築する。
なぜCloudFormationを使うのか?という話もあるが、前回の記事の通り属人化を防ぐことに目的がある。
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ポリシーの作成
-
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を使うメリットとしては、画面ポチポチで勝手に作られてるサービスを詳細に知ることができることにある気がした。