やりたいこと
今回は2つのアカウントでTerraformのCICDパイプラインの構築を行います。
「構築にわざわざ2つにアカウントを分ける必要はないのでは?」と思われる方もいるかも知れませんが、分けた理由として下記を実現するために2つに分けることにしました。
Repositoryアカウント(一つ):ソースコードの一元管理(CodeCommitのリポジトリ)
productアカウント(複数):複数環境への展開
概要
基本は参考記事1.2.をベースとして作成しています。
【ポイント】
-
Gitのプッシュ先のCodeCommitのブランチとEventBridgeのイベント検出
例)masterブランチにプッシュされたらEventBridgeが検出し、本番環境のパイプラインを動作させ、同様にdevブランチにプッシュされたら試験環境のパイプラインを動作させる。 -
CodeBuild2つと承認プロセスを設け、それぞれTerraformのコマンドを実行し、
リソース作成予定の結果を見てリソース展開有無を判断する。 - terraform plan:リソース作成予定のものをチェック
- terraform apply:リソースの展開
ハンズオン
■Cfnテンプレート
→Github:terraform-cicd
→Github:terraform-cicd
前準備
-
RepositoryアカウントにCodeCommitリポジトリを用意する。
Cfnテンプレートで作成してしまっても良かったのですが、業務ベースで既にリポジトリやファイル等用意されていることを想定してテンプレートに含めませんでした。
また、Githubに格納している下記ファイルをリポジトリに格納する。
・config.tf
・s3.tf
・buildspec-apply.yml
・buildspec-plan.yml -
KMSキーを作成する。
Cfnテンプレートで何度もキー作成・削除をすると作成した分だけ、キーの料金が発生してしまうため事前に用意します。
(CfnテンプレートではKMSの部分はコメントアウトしています。)
CICDパイプライン作成
-
productアカウント:01_prepare.ymlを実行する
【作成リソース】
・CodePipelineのIAMロール(サービスロール)
・CodeBuildのIAMロール(サービスロール)
・S3バケット:アーティファクト格納用
・SNSトピック
キーポリシーを編集する。
[REPOSITORYACCOUNTID]:repositoryアカウントIDを入力
[PRODUCTACCOUNTID]:productアカウントIDを入力
[BUILDROLE]:出力されたCodeBuildRole名を入力
[KMSADMINUSER]:KMSキーを管理しているIAMユーザを入力(作成時に入力済み)
これでKMSキーを他アカウント、指定IAMロールで使用可能となります。
-
repositoryアカウント:02_repository-settingを実行する
【作成リソース】
・CloudwatchEventのIAMロール
・CodeCommitのIAMロール
・CloudwatchEventRule
-
productアカウント:03_pipeline.ymlを実行する
【作成リソース】
・CloudwatchEventのIAMロール
・CloudwatchEventRule
・CodeBuild(terraform plan用とterraform apply用)
・CodePipeline
動作確認
まとめ
今回はTerraformのCICDパイプライン環境を作成してみました。
クロスアカウントのパイプラインでEventBridgeを挟んだ構成となり、一つのアカウント内で作成するときと比べて、ひと工夫(IAM、KMSの権限委譲など)必要で少し構築に時間がかかかりました。ただしっかりとどのリソースがどの権限を利用するのか確認していけたので更にIAM周りの知識の深掘りができたと思います。
クロスアカウントのパイプラインでEventBridgeを挟んだ構成となり、一つのアカウント内で作成するときと比べて、ひと工夫(IAM、KMSの権限委譲など)必要で少し構築に時間がかかかりました。ただしっかりとどのリソースがどの権限を利用するのか確認していけたので更にIAM周りの知識の深掘りができたと思います。
現場でもTerraformを使う機会が増えてきているので、今回の構築をベースに今後もインフラのソース管理を積極的に行っていきたいと思います。
個人的にCfnテンプレートで書くことが多いので、今後はTerraformも書いていきたい!
以上です。
個人的にCfnテンプレートで書くことが多いので、今後はTerraformも書いていきたい!
以上です。
0 件のコメント:
コメントを投稿