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の用意が必要です。
以上、どなたかの参考になれば幸いです。
[関連記事]
参考
GitHub - bioerrorlog/terraform-examples: My terraform example projects.