CloudFormationでコンソールからのリソースインポートに失敗した

# 概要
CloudFormation(以下CFn)で管理しているAurora MySQLを[ブルー/グリーンデプロイ](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/blue-green-deployments-overview.html)にて手動でアップグレードを実施しました。
再びCFn管理にする際、コンソールからリソースをインポートしようとしたところ問題が発生したため、その問題の内容と実施したことを記載します。

:::note warn
この記事は2024/9/18の内容であり、現在問題は解消している可能性があります。
:::

# 問題
新しいAurora MySQLバージョンでクラスターとインスタンスをCFn管理にする際には下記ドキュメントを参考にコンソールよりリソースのインポートを実行しました。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resource-import-resolve-drift.html

ところが、テンプレートの指定をして`次へ`をクリックしたところ、下記エラーが表示されインポートできませんでした。

:::note alert
次のリソースタイプは、リソースのインポートではサポートされていません: AWS::RDS::DBCluster,AWS::RDS::DBInstance,AWS::RDS::DBInstance
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2509379/99209730-9cf7-bfc8-6deb-87b957178424.png)

`詳細はこちら`に書かれているリソースタイプサポートを見ても、クラスターとインスタンスはインポートに対応している旨が書かれており、原因がわからなかったためAWSサポートへ問い合わせることにしました。

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resource-import-supported-resources.html?icmpid=docs_cfn_console

# AWSサポートへ問い合わせ

AWSサポートへ問い合わせたところ、下記回答が返ってきました。
コンソールからのインポートでは、インポート先のスタックでConditionがfalseとなるリソースが存在している場合、リソースのインポートに失敗する場合があるとのことでした。
修正対応中とのことで今後解消する可能性がありますが、現在はCLIからインポートすることで解決できるか試してみることにしました。

> ご共有いただきました情報をもとにお調べいたしました結果、現在の CloudFormation コンソールの動作では、インポート先のスタックで Condition が false となるリソースが存在している場合、リソースのインポートに失敗する場合があることを確認いたしました。
この度は AWS 側の問題によりお客様にご不便とご心配をおかけし、誠に申し訳ございません。
現在 AWS ではこの問題を認識し、修正作業を進めております。
ご不便をお掛けしております上で誠に恐れ入りますが、対応の時期など詳細について当方からお約束出来ない旨、ご理解賜りたく存じます。
> 
> 上記の問題は CloudFormation コンソールの問題であり、お手数ではございますが、AWS CLI よりインポートすることで問題が解消するかお試しいただけますでしょうか。

# CLIからCFnインポートを実施

CLIからのCFnインポートは下記ドキュメントを参考に実施しました。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resource-import-existing-stack.html#resource-import-existing-stack-cli

1.CFnインポートを行うために必要なパラメータ情報をget-template-summaryで取得する。
```bash
$ aws cloudformation get-template-summary --template-body file://<Template file>.yaml --query 'ResourceIdentifierSummaries' > ResourcesToImport.json
```
```json: ResourcesToImport.json(抜粋)
[
    {
        "ResourceType": "AWS::RDS::DBCluster",
        "LogicalResourceIds": [
            "DBClusterZozoID"
        ],
        "ResourceIdentifiers": [
            "DBClusterIdentifier"
        ]
    },
    {
        "ResourceType": "AWS::RDS::DBInstance",
        "LogicalResourceIds": [
            "DBInstanceZozoID",
            "DBInstanceZozoIDSecond"
        ],
        "ResourceIdentifiers": [
            "DBInstanceIdentifier"
        ]
    }
]
```

2.上記で取得したパラメータ情報をベースに、インポート対象の識別子を追記して書き換える。
```json: ResourcesToImport.json
[
    {
        "ResourceType": "AWS::RDS::DBCluster",
        "LogicalResourceId": "DBClusterZozoID",
        "ResourceIdentifier": {
            "DBClusterIdentifier": "<Cluster Name>"
        }
    },
    {
        "ResourceType": "AWS::RDS::DBInstance",
        "LogicalResourceId": "DBInstanceZozoID",
        "ResourceIdentifier": {
            "DBInstanceIdentifier": "<Instance Name>"
        }
    },
    {
        "ResourceType": "AWS::RDS::DBInstance",
        "LogicalResourceId": "DBInstanceZozoIDSecond",
        "ResourceIdentifier": {
            "DBInstanceIdentifier": "<Instance Name>"
        }
    }
]
```
3.インポート用の変更セットを作成する。
```bash
$ aws cloudformation create-change-set \
    --stack-name <Stack Name> --change-set-name <Change Set Name> \
    --change-set-type IMPORT \
    --template-body file://<Template file>.yaml \
    --resources-to-import file://ResourcesToImport.json \
    --parameters file://<Parameters file> \
```
変更セットの内容を見ると、アクションがImportとなっていることが確認できます。
置換がTrueとなっていますが特に問題ありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2509379/df13d408-e89a-c416-2138-4fdad3d7c3d4.png)

4.変更セットを実行してインポートする。
イベントよりステータスが`IMPORT_COMPLETE`になれば完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2509379/c9816cf6-9a8e-0ea8-eda3-f8bbcd7d5cef.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2509379/0cd88945-e0e0-5c60-9b98-d12576bfec2c.png)

これにより、新しいAurora MySQLバージョンでクラスターとインスタンスをCFn管理とすることができました。

# まとめ
CFnのコンソールからリソースをインポートしようとしたところ、インポート先のスタックでConditionがfalseとなるリソースが存在している場合、リソースのインポートに失敗する問題が発生しました。
修正対応中とのことで今後解消する可能性がありますが、現在はCLIからインポートすることで解消しました。
ちなみに、CFn管理しているリソースは、ブルー/グリーンデプロイ含めてスタック外で変更することを推奨しておらず、CFnとして動作を保証していないようなのでご留意ください。

同じように困っている人の助けになれば幸いです。