TerraformでECRを管理している際に、リソースに変更がないにもかかわらず再作成が求められる場合があります。ECRリポジトリの再作成は、既存のイメージ削除や意図しない影響を引き起こすため、事前に差分が出るはずのない状態を確認した上で、state rm
とimport
を使って解決する方法を解説します。
前提条件の確認
ECRに差分が出る理由を確認するため、以下のようなログでECRの状態やTerraformの状態を確認します。これにより、差分が出るはずがない状態であることを確認します。
1. ECRのPlanのログ例
Terraformでplan
を実行した際のログを確認します。差分がないにも関わらず、create
アクションが出てしまう場合があります。
Planログ
# module.main.aws_ecr_repository.admin will be created
+ resource "aws_ecr_repository" "admin" {
+ arn = (known after apply)
+ id = (known after apply)
+ image_tag_mutability = "MUTABLE"
+ name = "dev-admin"
+ registry_id = (known after apply)
+ repository_url = (known after apply)
+ tags_all = (known after apply)
+ encryption_configuration {
+ encryption_type = "AES256"
+ kms_key = (known after apply)
}
+ image_scanning_configuration {
+ scan_on_push = false
}
}
上記のように、ECRの設定に変更がないにもかかわらず、リポジトリが再作成されようとしています。
2. Terraformのstateリストでリソースの確認
次に、terraform state list
コマンドで、Terraformが管理しているリソースの一覧を確認します。ECRリポジトリがすでにTerraformによって管理されているか確認します。
terraform state list
のログ例
terraform state list
module.main.aws_ecr_repository.admin
module.main.aws_ecr_repository.device_data
module.main.aws_ecr_repository.irregularity_detection_api
module.main.aws_ecr_repository.lambda_webadapter
3. Terraformの状態を詳細に確認
特定のECRリポジトリについて、terraform state show
コマンドを使用して、Terraformが認識しているリソースの状態を確認します。
terraform state show
のログ例
terraform state show module.main.aws_ecr_repository.admin
# module.main.aws_ecr_repository.admin:
resource "aws_ecr_repository" "admin" {
arn = "arn:aws:ecr:ap-northeast-1:123456789012:repository/dev-admin"
id = "dev-admin"
image_tag_mutability = "MUTABLE"
name = "dev-admin"
registry_id = "123456789012"
repository_url = "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/dev-admin"
tags = {}
tags_all = {}
encryption_configuration {
encryption_type = "AES256"
kms_key = null
}
image_scanning_configuration {
scan_on_push = false
}
}
4. AWS CLIでECRの状態を確認
AWS CLIを使用して、AWS側でECRリポジトリがどのような状態で存在しているか確認します。AWSとTerraformの状態が一致していることを確認することで、不要な再作成が発生しないことが期待できます。
AWS CLIでの確認例
aws ecr describe-repositories --repository-names dev-admin
{
"repositories": [
{
"repositoryArn": "arn:aws:ecr:ap-northeast-1:123456789012:repository/dev-admin",
"registryId": "123456789012",
"repositoryName": "dev-admin",
"repositoryUri": "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/dev-admin",
"createdAt": 1726562681.161,
"imageTagMutability": "MUTABLE",
"imageScanningConfiguration": {
"scanOnPush": false
},
"encryptionConfiguration": {
"encryptionType": "AES256"
}
}
]
}
解決手順
ECRリポジトリの設定がAWS側とTerraform側で一致しているにもかかわらず、差分が生じて再作成が発生する場合は、state rm
とimport
を使用して解決します。
1. TerraformのstateからECRリポジトリを一時的に削除
差分の解消に向けて、Terraformの管理状態からECRリポジトリを一時的に削除します。これにより、次のステップでAWS上の既存リポジトリを再インポートすることが可能になります。
terraform state rm
の実行例
terraform state rm module.main.aws_ecr_repository.admin
2. AWS上のECRリポジトリをTerraformに再インポート
削除したECRリポジトリをterraform import
を使って再度インポートします。これにより、Terraformの状態とAWSの実際の設定が同期され、不必要な差分が解消されます。
terraform import
の実行例
terraform import module.main.aws_ecr_repository.admin arn:aws:ecr:ap-northeast-1:123456789012:repository/dev-admin
他のECRリポジトリに対する対応
複数のECRリポジトリを管理している場合も同様の手順で、state rm
とimport
を用いて差分を解消できます。以下に複数のリポジトリに対するstate rm
とimport
の例を示します。
state rm
とimport
の例
terraform state rm module.main.aws_ecr_repository.device_data
terraform import module.main.aws_ecr_repository.device_data arn:aws:ecr:ap-northeast-1:123456789012:repository/dev-device-data
まとめ
以上の手順を通じて、TerraformでECRリポジトリの不要な再作成を防ぐことができました。state rm
とimport
を活用することで、TerraformとAWSの状態を一致させ、予期しないリソースの変更を防ぐことが可能です。この手順を覚えておくことで、ECRの管理がよりスムーズになります。