継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

terraform-provider-aws v4.9.0 のリリースで破壊的な S3 の変更がなくなったと聞いたので試してみた

タダです.

terraform-provider-aws の v4 で S3 リソースの変更をどうやって行くかなと思っていた頃に v4.9.0 で S3 の破壊的変更がなくなったという話がでてきたので,試した内容をまとめていきます.

resource/aws_s3_bucket: The acceleration_status, acl, cors_rule, grant, lifecycle_rule, logging, object_lock_configuration.rule, policy, replication_configuration, request_payer, server_side_encryption_configuration, versioning, and website parameters are now Optional. Please refer to the documentation for details on drift detection and potential conflicts when configuring these parameters with the standalone aws_s3_bucket_* resources.

github.com

provider のバージョンを 4.9.0 にあげたときの挙動

v4.9.0 が出た時にドキュメントに下記の引用文が追記されていました.4.9.0以降に上げることが推奨されています.

Versions 4.0.0 through v4.8.0 of the AWS Provider introduce significant breaking changes to the aws_s3_bucket resource. See S3 Bucket Refactor for more details. We recommend upgrading to v4.9.0 or later of the AWS Provider instead, where only non-breaking changes and deprecation notices are introduced to the aws_s3_bucket. See Changes to S3 Bucket Drift Detection for additional considerations when upgrading to v4.9.0 or later.

それでは実際にどんな挙動になるかを確認していきます.プロバイダーの指定を ~> 4.9.0 に変更後,terraform init および terraform plan を実行してみました.以前の記事で書きましたが,S3 の破壊的変更によって terraform plan をするとエラーがでていたのがでてなくなりました! その分 Warning: Argument is deprecated という警告がでるようになりました.

terraform-aws-provider 指定箇所抜粋

terraform {
  required_version = ">= 1.0.0"

  backend "s3" {
    encrypt        = true
    bucket         = "hoge"
    key            = "hoge.tfstate"
    region         = "ap-northeast-1"
  }

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.9.0"
    }
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

terraform init および terraform plan の実行結果

$ terraform init
Initializing the backend...

Successfully configured the backend "s3"! Terraform will automatically
use this backend unless the backend configuration changes.

Initializing provider plugins...
- Reusing previous version of hashicorp/aws from the dependency lock file
- Installing hashicorp/aws v4.9.0...

- Installed hashicorp/aws v4.9.0 (signed by HashiCorp)

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
~中略~

No changes. Your infrastructure matches the configuration.

Your configuration already matches the changes detected above. If you'd like
to update the Terraform state to match, create and apply a refresh-only plan:
  terraform apply -refresh-only

Warning: Argument is deprecated

│   with aws_s3_bucket.v4_test,
│   on s3.tf line 9, in resource "aws_s3_bucket" "v4_test":
│    9: resource "aws_s3_bucket" "v4_test" {

│ Use the aws_s3_bucket_server_side_encryption_configuration resource instead

今回の変更に対する所感

v4.9.0 になったことで aws_s3_bucket リソースの変更を最悪行わなくてもプロバイダーバージョンのアップグレードを行えるようになったのですが,ドキュメントを見ると v5 になると aws_s3_bucket のパラメーターが削除されるためいずれにしても aws_s3_bucketで設定したパラメーターを分割せざるを得ないのだなと...暫定的な処置として v4.9.0 にあげた後でもリソース分割対応に向き合わなければなりません😇

  • acceleration_status
  • acl
  • cors_rule
  • grant
  • lifecycle_rule
  • logging
  • object_lock_configuration
  • policy
  • replication_configuration
  • request_payer
  • server_side_encryption_configuration
  • versioning
  • website

ドキュメント記載文

In the next major version, v5.0, the parameters listed below will be removed entirely from the aws_s3_bucket resource. For this reason, a deprecation notice is printed in the Terraform CLI for each of the parameters when used in a configuration.

registry.terraform.io

v4.9.0 にあげるための対応まとめ

v5 の事情を踏まえ業務で v4.9.0 にアップグレードしました.最後にその大まかな流れを備忘録としてまとめます.

  1. terraform-aws-provider を v4.9.0 にして terraform init で初期化
  2. tfrefactor で S3 バケットリソースを分割
  3. terraform plan で確認するとリソース分割した対象が差分として表示されるため,terraform import で差分を埋める

そして,その時に使った terraform import コマンド例です.

terraoform import コマンド例

$ terraform import aws_s3_bucket_acl.hoge hoge-bucket,private
$ terraform import aws_s3_bucket_lifecycle_configuration.hoge hoge-bucket
$ terraform import aws_s3_bucket_versioning.hoge hoge-bucket
$ terraform import aws_s3_bucket_cors_configuration.hoge hoge-bucket
$ terraform import aws_s3_bucket_server_side_encryption_configuration.hoge hoge-bucket
$ terraform import aws_s3_bucket_website_configuration.hoge hoge-bucket
$ terraform import aws_s3_bucket_request_payment_configuration.hoge hoge-bucket
$ terraform import aws_s3_bucket_replication_configuration.hoge hoge-bucket
$ terraform import aws_s3_bucket_policy.hoge hoge-bucket 
$ terraform import aws_s3_bucket_object_lock_configuration.hoge hoge-bucket
$ terraform import aws_s3_bucket_logging.hoge hoge-bucket

まとめ

terraform-provider-aws v4.9.0 の変更点とその影響,自分が実際にv4.9.0にアップグレードしたときの作業を簡単にまとめました.これまで業務で terraform-aws-provider をあげたことがなかったので,今回は勉強になりました.今度は v5 系が来るだろうと思うので情報収集や検証をしていければと思います.

関連記事

sadayoshi-tada.hatenablog.com

sadayoshi-tada.hatenablog.com