Terraform AWS Provider v5 にアップグレード
概要
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
というツールを利用してバージョンの変更を行ないました。
下記のコマンドを実行することで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_parameter
のoverwrite
が廃止となるため警告されています。
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