[アップデート]Amazon CodeCatalyst にTerraform用のアクションが追加されました

2023.11.15

CodeCatalysのActionsにTerraformテンプレートををAWSアカウントにデプロイするActionが追加されました。

Amazon CodeCatalyst now supports Terraform

何が嬉しい?

  • 少ない記述でTerraform CI/CD用のワークフローを作成できるようになった

CodeCatalystワークフローで、terraformのCI/CDを作るにはこれまではワークフローの作り込みが必要でした。 (Github ActionsのActionsがCodeCatalystのワークフロー内で使えるため、そこまで大変ではないかもしれませんが)

今回追加されたActionsを利用することで、少ない記述でTerraform CI/CD用のワークフローを作成できるようになりました。

Community | Bootstrapping your Terraform automation with Amazon CodeCatalyst

やってみた

CodeCatalystプロジェクト・リポジトリ作成

terraform-actions-sampleという名前でプロジェクトを作成します。

プロジェクト内にリポジトリを作成します。リポジトリ名は同様に、terraform-actions-sampleとします。

Terraformのファイルを置くため、.gitignoreはTerraformとします。

Terraformバックエンド用のリソース用意(S3 + DynamoDB)

以下のCloudFormationを使って、Terraformバックエンド用のリソースを作成します。

CloudFormaitonのスタック名とS3バケット名やDynamoDBテーブル名は任意のもので問題ありません。

CloudFormationテンプレート
AWSTemplateFormatVersion: "2010-09-09"
Description: S3 & DynamoDB for Terraform Backend

Parameters:
  Name:
    Description: |
      Name of the S3 bucket, DynamoDB table;
      Defaults to "terraform-state-AWS_ACCOUNT_ID"
    Default: ""
    Type: String

Conditions:
  GenerateNames: !Equals [!Ref Name, ""]

Resources:
#------------------------------------------------------------------------------#
# S3
#------------------------------------------------------------------------------#
  StateBucket:
    Type: AWS::S3::Bucket
    DeletionPolicy: Retain
    UpdateReplacePolicy: Retain
    Properties:
      BucketName: !If
      - GenerateNames
      - !Sub "terraform-state-${AWS::AccountId}"
      - !Ref Name
      PublicAccessBlockConfiguration:
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true
      LifecycleConfiguration:
        Rules:
        - Id: ExpireOldVersions
          NoncurrentVersionExpirationInDays: 90
          Status: Enabled
      VersioningConfiguration:
        Status: Enabled
      BucketEncryption:
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: "AES256"
#------------------------------------------------------------------------------#
# DynamoDB
#------------------------------------------------------------------------------#
  LockTable:
    Type: AWS::DynamoDB::Table
    Properties:
      TableName: !Ref StateBucket
      ProvisionedThroughput:
        ReadCapacityUnits: 1
        WriteCapacityUnits: 1
      AttributeDefinitions:
        - AttributeName: "LockID"
          AttributeType: "S"
      KeySchema:
        - AttributeName: "LockID"
          KeyType: "HASH"

tfファイルの用意

Dev Environment(Cloud9)を作成して、Cloud9を開きます。

Cloud9のコマンドラインコンソールを開いて、作成したリポジトリ配下に移動します。

$ cd terraform-actions-sample
$ touch main.tf

main.tfは以下の内容で用意します。置き換えが必要な箇所は修正してください。 (regionはどこでも問題ありません。)

main.tf

terraform {
  backend "s3" {
    bucket = "<Stateファイルのバケット名>" # 置き換えが必要
    key    = "terraform.tfstate"
    region = "us-west-2"
    dynamodb_table = "<lock用のdynamodbテーブル名>" # 置き換えが必要
  }
}

provider "aws" {
  region = "us-west-2"
}

resource "aws_vpc" "main" {
  cidr_block       = "10.0.0.0/16"
  instance_tenancy = "default"

  tags = {
    Name = "codecatalyst-terraform-ations"
  }
}

AWS認証情報をセットして、planが可能か確認します。

export AWS_ACCESS_KEY_ID=<AWSアクセスキー>
$ export AWS_SECRET_ACCESS_KEY=<AWSシークレットアクセスキー>
$ export AWS_SESSION_TOKEN=<AWSセッショントークン>
$ terraform init
$ terraform plan

用意できたら、リポジトリにPushします。

$ git add .
$ git commit -m "add: tf file"
$ git push origin HEAD

パイプライン用のIAMロールの作成

パイプライン用のIAMロールを用意します。

以下のファイルを用意して、AWS CLIでIAMロールを作成します。

assume_role_policy.json

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "codecatalyst.amazonaws.com",
          "codecatalyst-runner.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
$ aws iam create-role --role-name codecatalyst-terraform-actions --assume-role-policy-document file://assume_role_policy.json
$ aws iam attach-role-policy --role-name codecatalyst-terraform-actions --policy-arn arn:aws:iam::aws:policy/AdministratorAccess

作成したIAMロールをCodeCatalystで利用できるように設定します。

CodeCatalystのSpace -> Settings > AWS Accounts -> AWSアカウントID->Manage roles AWS Management Consoleの順番に選択します。

作成したIAMロールを選択して、追加します。

Environmentを作成

CI/CD -> Environments->Create environmentを選択します。

名前と接続するAWS Accountを選択して、Environmentを作成します。

Terraform用ワークフローの作成

CodeCatalystのコンソールに戻り、Projectterraform-actions-sampleを選択します。

CI/CD -> Workflows-> Create workflowの順に選択します。

以下を設定して、ワークフローを作成します。

Actionsを選択して、Terraformで検索すると今回のアップデートで追加されたTerraform Community Editionのワークフローがでてくるため、これを選択します。

以下のように必要な設定を行います。

.codecatalyst/workflows/teraform-plan.yaml

Name: teraform-plan
SchemaVersion: "1.0"

# Optional - Set automatic triggers.
Triggers:
  - Type: Push
    Branches:
        - main
Actions:
  TerraformPlan:
    # Identifies the action. Do not modify this value.
    Identifier: codecatalyst-labs/provision-with-terraform-community@v1.0.0
    Environment:
      Name: dev
      Connections:
        - Name:<アカウントID>
          Role: codecatalyst-terraform-actions
    # Specifies the source and/or artifacts to pass to the action as input.
    Inputs:
      # Optional
      Sources:
        - WorkflowSource # This specifies that the action requires this Workflow as a source

    # Defines the action's properties.
    Configuration:
      # Required; type: string; description: The Terraform state table
      StateTable: <State Table>

      # Required; type: string; description: The Terraform state file
      StateKey: terraform.tfstate

      # Required; type: string; description: The S3 state bucket that hosts the Terraform state file for the deployment.
      StateBucket: <State Bucket>

      # Required; type: string; description: The AWS region for the deployment
      AWSRegion: us-west-2

      # Required; type: string; description: The Terraform version to be used by the action
      TerraformVersion: 1.6.1

      # Required; type: string; description: The Terraform operation mode, should be either plan or apply
      TerraformOperationMode: plan

Workflow編集画面からcommitします。

動作確認

Workflowファイルのcommitが完了すると、Workflow実行が行われます。

内容を確認してみると、Planが実行されていることが分かります。

おわりに

最初はAWSでTerraform CloudやGoogle CloudのInfrastructure Manager的なものを想像していました。

実際は、GitHub ActionsでいうところのActionが追加されたといった内容でした。

今回のアップデートでシンプルな記述でTerraformのPlanとApplyをCI/CD上で行えるようになりました。

AWSのサービスでCI/CDを完結させたい場合、有用だと思いました。

今回追加されたアクション「Terraform Community Edition」ですが、GitHubは見つけられませんでしたがアクションの選択画面からソースを取得することが可能です。

気になる方は中身を見てみるのも、面白いかもしれません。

以上、AWS事業本部の佐藤(@chari7311)でした。