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)でした。