🍆

【AWS】TerraformでECRの差分解消!state rmとimportで再作成を防ぐ方法

2024/10/25に公開

TerraformでECRを管理している際に、リソースに変更がないにもかかわらず再作成が求められる場合があります。ECRリポジトリの再作成は、既存のイメージ削除や意図しない影響を引き起こすため、事前に差分が出るはずのない状態を確認した上で、state rmimportを使って解決する方法を解説します。

前提条件の確認

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 rmimportを使用して解決します。

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 rmimportを用いて差分を解消できます。以下に複数のリポジトリに対するstate rmimportの例を示します。

state rmimportの例

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 rmimportを活用することで、TerraformとAWSの状態を一致させ、予期しないリソースの変更を防ぐことが可能です。この手順を覚えておくことで、ECRの管理がよりスムーズになります。

GitHubで編集を提案

Discussion