BioErrorLog Tech Blog

試行錯誤の記録

Terraform backend(S3/DynamoDB)をCloudFormationでデプロイする

Terraformのstateを格納するbackend(S3/DynamoDB)を構築する、CloudFormationテンプレートの備忘録です。

はじめに

Terraformのstateを格納するbackend自身をどのように構築するか、はちょっとした考慮ポイントですね。

Terraform自身で実装すると少し厄介(そのTerraformのstateはどう管理するの?問題が発生する)なので、何かしらTerraform以外の手段で構築するのも手です。

AWSであれば、CloudFormationで構築するのが選択肢の一つになるでしょう。

今回は、Terraform backendを構築するCloudFormationテンプレートを備忘録にメモします。

Terraform backendを構築するCloudFormationテンプレート

実装例こちらです。 (GitHubに置いたコードはこちら)

AWSTemplateFormatVersion: '2010-09-09'
Description: 'Create S3 and DynamoDB resources for Terraform backend'
Parameters:
  ResourceNamePrefix:
    Type: String
    Description: 'The prefix for the resource names (S3 bucket and DynamoDB table)'
    Default: 'demo'

Resources:
  TerraformStateBucket:
    Type: 'AWS::S3::Bucket'
    Properties:
      BucketName: !Sub '${ResourceNamePrefix}-${AWS::AccountId}-terraform-state'
      VersioningConfiguration:
        Status: 'Enabled'
      LifecycleConfiguration:
        Rules:
        - Id: ExpireNoncurrentVersions
          NoncurrentVersionExpirationInDays: 90
          Status: Enabled
      BucketEncryption:
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: 'AES256'
      AccessControl: 'Private'
      PublicAccessBlockConfiguration:
        BlockPublicAcls: true
        IgnorePublicAcls: true
        BlockPublicPolicy: true
        RestrictPublicBuckets: true

  DynamoDBLockTable:
    Type: 'AWS::DynamoDB::Table'
    Properties:
      TableName: !Sub '${ResourceNamePrefix}-terraform-lock'
      AttributeDefinitions:
        - AttributeName: 'LockID'
          AttributeType: 'S'
      KeySchema:
        - AttributeName: 'LockID'
          KeyType: 'HASH'
      BillingMode: 'PAY_PER_REQUEST'

Outputs:
  TerraformStateBucketName:
    Description: 'The name of the S3 bucket for storing Terraform state files'
    Value: !Ref TerraformStateBucket

  DynamoDBLockTableName:
    Description: 'The name of the DynamoDB table for Terraform state locking'
    Value: !Ref DynamoDBLockTable

なるべくシンプルな形で構成しました。

S3:

  • デフォルト暗号化 (SSE-S3)
  • バージョニング有効
  • ブロックパブリックアクセス有効

DynamoDB:

  • 必要なスキーマ構成
  • PAY_PER_REQUESTでの課金体系


ここを出発点にして、要件に応じて機能を加えていくのが良いでしょう。

例:

  • S3をCMKで暗号化
  • バケットポリシーによるアクセス制御/クロスアカウントアクセス許可
  • etc...

おわりに

Terraform backendを構築するCloudFormationテンプレートの実装例をメモしました。

Terraform Cloudとかを利用すればこの辺りも自動で用意できるのかも知れませんが、個人的にはまだOSSとしてしか利用したことがないのでbackendの用意が必要です。

以上、どなたかの参考になれば幸いです。

[関連記事]

www.bioerrorlog.work

www.bioerrorlog.work

www.bioerrorlog.work

参考

GitHub - thoughtbot/cloudformation-terraform-state-backend: Cloudformation template to create Terraform state S3 backend

GitHub - tiborhercz/tf-state-backend-s3-cloudformation: CloudFormation template to provision a state backend for Terraform

GitHub - bioerrorlog/terraform-examples: My terraform example projects.