S3 バックエンドのリモート状態を使用して Terraform プロジェクトを高速化する


2021 年 8 月 6 日更新: Resource ファイルの s3_policy.json プロパティを抽象化しました.これは、以下のスクリプトがその置換を処理するためです. 🙂

リモート状態で Terraform を使用してインフラストラクチャを初期化するより迅速な方法があるかどうか疑問に思ったことはありませんか?私の頼りになるのは S3 backend ですが、手動で設定すると、作業を行うスクリプトを作成するよりも時間がかかる場合があります.

AWS 認証情報が既に設定されていると仮定すると、2 つのファイルを作成する必要があります.最初のファイルは、Terraform にアイテムを表示させ、Terraform の状態を取得および更新するための S3 ポリシーです.

当社の S3 ポリシー s3_policy.json :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:ListBucket",
      "Resource": "RESOURCE",
      "Principal": {
        "AWS": "ARN"
      }
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Resource": "RESOURCE/KEY",
      "Principal": {
        "AWS": "ARN"
      }
    }
  ]
}


したがって、 ARNRESOURCE 、および KEY について疑問に思っている場合でも、問題ありません.私たちのスクリプトは sed マジックを介してそれらを置き換えることでそれらを処理します.そのため、bash スクリプトでバケット名を変更する場合、ポリシー ファイルを更新する必要はありません. 😀

2 番目のファイルは実際の bash スクリプトです.たとえば tf-setup.sh とします (このファイルを実行できるように chmod +x を覚えておいてください!):

#!/bin/bash

# Create S3 Bucket
MY_ARN=$(aws iam get-user --query User.Arn --output text 2>/dev/null)
aws s3 mb "s3://tf-remote-bucket" --region "us-east-1"
sed -e "s/RESOURCE/arn:aws:s3:::tf-remote-bucket/g" -e "s/KEY/terraform.tfstate/g" -e "s|ARN|${MY_ARN}|g" "$(dirname "$0")/s3_policy.json" > new-policy.json
aws s3api put-bucket-policy --bucket "tf-remote-bucket" --policy file://new-policy.json
aws s3api put-bucket-versioning --bucket "tf-remote-bucket" --versioning-configuration Status=Enabled
rm new-policy.json

# Create DynamoDB Table
aws dynamodb create-table \
  --table-name "tf-lock-table" \
  --attribute-definitions AttributeName=LockID,AttributeType=S \
  --key-schema AttributeName=LockID,KeyType=HASH \
  --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 \
  --region "us-east-1"


それでは、 main.tf を構成しましょう.

terraform {
  required_version = ">= 1.0.0"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 3.29"
    }
  }

  backend "s3" {
    encrypt        = true
    bucket         = "tf-remote-bucket"
    dynamodb_table = "tf-lock-table"
    region         = "us-east-1"
    key            = "terraform.tfstate"
  }
}

provider "aws" {
  region = "us-east-1"
}

terraform init 出力:

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

terraform plan および terraform apply を実行するようにすべて設定されているはずです.これがツールボックスやパイプラインの便利なツールになることを願っています.ご不明な点や問題が発生した場合は、コメントでお知らせください.