【CodePipeline+Terraform】クロスアカウントCI/CDパイプラインの実装

2022年4月27日水曜日

AWS CloudFormation CodeBuild CodeCommit CodePipeline Terraform

t f B! P L

やりたいこと

今回は2つのアカウントでTerraformのCICDパイプラインの構築を行います。
「構築にわざわざ2つにアカウントを分ける必要はないのでは?」と思われる方もいるかも知れませんが、分けた理由として下記を実現するために2つに分けることにしました。
Repositoryアカウント(一つ):ソースコードの一元管理(CodeCommitのリポジトリ)
productアカウント(複数):複数環境への展開

概要


上記で構成することで、一つのRepositoryアカウントから複数のProductアカウントへ展開可能となります。今回はProductアカウント一つで実施します。

基本は参考記事1.2.をベースとして作成しています。

【ポイント】
  • Gitのプッシュ先のCodeCommitのブランチとEventBridgeのイベント検出
    例)masterブランチにプッシュされたらEventBridgeが検出し、本番環境のパイプラインを動作させ、同様にdevブランチにプッシュされたら試験環境のパイプラインを動作させる。
  • CodeBuild2つと承認プロセスを設け、それぞれTerraformのコマンドを実行し、
    リソース作成予定の結果を見てリソース展開有無を判断する。
    • terraform plan:リソース作成予定のものをチェック
    • terraform apply:リソースの展開

ハンズオン

それでは、ハンズオンです。

※資料にGoogleスライドを使用していますが、文字が見づらいため「︙」ボタンを押して「全画面表示に変更」で確認頂きたいと思います。Escで全画面表示解除です。

■Cfnテンプレート
→Github:terraform-cicd

前準備

  1. RepositoryアカウントにCodeCommitリポジトリを用意する。
    Cfnテンプレートで作成してしまっても良かったのですが、業務ベースで既にリポジトリやファイル等用意されていることを想定してテンプレートに含めませんでした。
    また、Githubに格納している下記ファイルをリポジトリに格納する。
    ・config.tf
    ・s3.tf
    ・buildspec-apply.yml
    ・buildspec-plan.yml
  2. KMSキーを作成する。
    Cfnテンプレートで何度もキー作成・削除をすると作成した分だけ、キーの料金が発生してしまうため事前に用意します。
    (CfnテンプレートではKMSの部分はコメントアウトしています。)

CICDパイプライン作成

  1. productアカウント:01_prepare.ymlを実行する
    【作成リソース】
    ・CodePipelineのIAMロール(サービスロール)
    ・CodeBuildのIAMロール(サービスロール)
    ・S3バケット:アーティファクト格納用
    ・SNSトピック

    キーポリシーを編集する。

    [REPOSITORYACCOUNTID]:repositoryアカウントIDを入力
    [PRODUCTACCOUNTID]:productアカウントIDを入力
    [BUILDROLE]:出力されたCodeBuildRole名を入力
    [KMSADMINUSER]:KMSキーを管理しているIAMユーザを入力(作成時に入力済み)
    これでKMSキーを他アカウント、指定IAMロールで使用可能となります。

  2. repositoryアカウント:02_repository-settingを実行する
    【作成リソース】
    ・CloudwatchEventのIAMロール
    ・CodeCommitのIAMロール
    ・CloudwatchEventRule

  3. productアカウント:03_pipeline.ymlを実行する
    【作成リソース】
    ・CloudwatchEventのIAMロール
    ・CloudwatchEventRule
    ・CodeBuild(terraform plan用とterraform apply用)
    ・CodePipeline

動作確認


まとめ

今回はTerraformのCICDパイプライン環境を作成してみました。
クロスアカウントのパイプラインでEventBridgeを挟んだ構成となり、一つのアカウント内で作成するときと比べて、ひと工夫(IAM、KMSの権限委譲など)必要で少し構築に時間がかかかりました。ただしっかりとどのリソースがどの権限を利用するのか確認していけたので更にIAM周りの知識の深掘りができたと思います。

現場でもTerraformを使う機会が増えてきているので、今回の構築をベースに今後もインフラのソース管理を積極的に行っていきたいと思います。

個人的にCfnテンプレートで書くことが多いので、今後はTerraformも書いていきたい!

以上です。

参考記事 

  1. CodePipeline で簡単 Terraform CI/CD パイプラインの実装  
  2.  [ECS/Fargate] 別のAWSアカウントにあるCodeCommit Repository をソースとするCodePipelineをCloudFormationで構築してみた

使用サービス

  1. AWS CodePipeline
  2. Terraform 

このブログを検索

プロフィール

ミニマリストなエンジニア AWSエンジニアとして技術支援を行っています。 好きなAWSサービスはCloudFormation。 (2022/3)AWS11冠達成!

人気の投稿

アーカイブ

QooQ