🛠

Terraform AWS Provider v5 にアップグレード

2023/06/08に公開

概要

Terraform AWS Providerをversion 5にアップグレードした際の対応方法をまとめました。

友人(keitakn)と開発・運用しているサービスLGTMeowでアップグレード対応しています。
なお、v4.5.0からv5.1.0に変更しています。

ソースコード

実際にアップデートした際の変更内容はこちらのPRを参考にしてください。
手順は下記にて説明します。

前提

基本的に公式ドキュメントを参考にしています。
Terraform AWS Provider Version 5 Upgrade Guide | Guides | hashicorp/aws | Terraform Registry

ドキュメントにも記載されていますが、version 4.Xからアップグレードすることを前提としています。 version 3以下を利用中の方はversion 4へのアップグレードを先に行なってください。

version 3を利用の方はversion3からversion 4にのップグレードした際の記事もあるので、よろしければ参考にしてみてください。
Terraform AWS Provider v4 にアップグレード

手順

最新の4.Xのバージョンにアップグレード

ドキュメントにversion 5へのアップグレードの前に最新の4.Xのバージョンにアップグレードするようにと記載されています。

現時点での最新バージョンである 4.67.0にアップグレードします。

Before upgrading to version 5.0.0, upgrade to the most recent 4.X version of the provider and ensure that your environment successfully runs terraform plan. You should not see changes you don't expect or deprecation notices

Provider Version Configuration の更新

   terraform {
     required_version = "1.0.3"
   
     required_providers {
-      aws = "4.5.0"
+      aws = "4.67.0"
     }
   }

今回のプロジェクトでは、バージョンを指定しているrequired_providersが複数のファイルで指定されているため hcleditというツールを利用してバージョンの変更を行ないました。

minamijoyo/hcledit

下記のコマンドを実行することでrequired_providers.awsの値を変更できます。詳細についてはドキュメントを参考にしてください。

hcledit attribute set terraform.required_providers.aws '"4.67.0"'

lockfile の更新

.terraform.lock.hcl を更新します。作業ディレクトリで、下記のコマンドを実行してください。

terraform init --upgrade

terraform planの実行

terraform planが正常に実行されることを確認します。
もし想定外の差分やエラーが発生している場合、この時点で解消しておいてください。

5.Xのバージョンにアップグレード

Provider Version Configuration の更新

最新の4.Xへのアップグレード手順と同様にversion 5へのアップグレードを行ないます。

現時点での最新バージョンである 5.1.0にアップグレードします。

   terraform {
     required_version = "1.0.3"
   
     required_providers {
-      aws = "4.67.0"
+      aws = "5.1.0"
     }
   }

lockfile の更新

.terraform.lock.hcl を更新します。作業ディレクトリで、下記のコマンドを実行してください。

terraform init --upgrade

terraform planの実行

terraform planが正常に実行されることを確認します。
想定外の差分やエラーは発生しませんでしたが、以下のWarningが表示されました。

resource/aws_ssm_parameteroverwriteが廃止となるため警告されています。
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/guides/version-5-upgrade#resourceaws_ssm_parameter

No changes. Your infrastructure matches the configuration.

Terraform has compared your real infrastructure against your configuration and found
no differences, so no changes are needed.
╷
│ Warning: Argument is deprecated
│
│   with module.ecs.aws_ssm_parameter.db_hostname,
│   on ../../../../../modules/aws/ecs/ssm.tf line 5, in resource "aws_ssm_parameter" "db_hostname":
│    5:   overwrite = true
│
│ this attribute has been deprecated
│
│ (and 11 more similar warnings elsewhere)
╵

resource/aws_ssm_parameterのWarningの対応

resource/aws_ssm_parameterで指定しているoverwrite属性は廃止予定のため、リソースから削除します。

overwriteを削除しterraform applyを実行したところParameterAlreadyExistsエラーが発生しました。
エラーが表示されてはいますがterraform apply自体は実行できており、terraform planを実行しても差分は発生しないので問題なさそうです。

Terraform will perform the following actions:

  # module.migration.aws_ssm_parameter.db_hostname will be updated in-place
  ~ resource "aws_ssm_parameter" "db_hostname" {
        id        = "/stg/lgtm-cat/migration/DB_HOSTNAME"
        name      = "/stg/lgtm-cat/migration/DB_HOSTNAME"
      - overwrite = true -> null
        tags      = {}
        # (8 unchanged attributes hidden)
    }

Plan: 0 to add, 1 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

module.migration.aws_ssm_parameter.db_hostname: Modifying... [id=/stg/lgtm-cat/migration/DB_HOSTNAME]
╷
│ Error: updating SSM Parameter (/stg/lgtm-cat/migration/DB_HOSTNAME): ParameterAlreadyExists: The parameter already exists. To overwrite this value, set the overwrite option in the request to true.
│
│   with module.migration.aws_ssm_parameter.db_hostname,
│   on ../../../../../modules/aws/ecs-migration/ssm.tf line 1, in resource "aws_ssm_parameter" "db_hostname":1: resource "aws_ssm_parameter" "db_hostname" {
│
╵

以上でアップグレード作業は終了です。

最後に

今回のアップデート対応では、version 5で変更されたリソースをあまり利用していなかったこともあり作業自体はすぐに終わりました。 特に難しい点もなかったとは思いますが、参考になれば幸いです。

参考

Discussion