AWS リソースを手動作成後に CloudFormation で管理する方法

## はじめに
皆さんこんにちは、asmgです。今回は、手動で作成したAWSリソースをCloudFormation (以下、cfnと呼びます) の機能`「リソースのインポート」`を使って、簡単にcfnで管理できるようにする方法についてまとめたいと思います。


## 手動で作ったAWS リソースをcfn管理したくなった背景
自分のチームでは基本的にAWSのリソースは、cfnでリソースを管理しています。しかし、開発時に手動で作った環境はcfnでは管理されていません。

ただこの状態だと、AWSリソースが何らかの理由で壊してしまった時に復旧できなくなってしまうので簡単に手動で作った環境をcfnに移行する方法を検討していました。

本記事では、CloudFormationの`「リソースのインポート」`機能を利用してcfn管理にする方法を使ってcfn管理をしてみました。

ref: [スタックへの既存リソースのインポート](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resource-import-existing-stack.html)

## 手動で作ったリソースをcfn管理するまでの手順
本記事では、Amazon SQSを例に解説していこうと思います。

### 1, 手動で作ったAmazon SQSの情報をもとにAmazon SQSのcfnテンプレートを作成する。
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3536373336302f39643266383037632d653766612d616136632d336436612d3232316163613233373338612e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567360/51bc6e29-aff1-b23a-3b24-112a4f6d9eab.png)


上記の情報をもとにAmazon SQSのテンプレートを作成していきます。

```yaml:template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  TestSqs:
    Type: 'AWS::SQS::Queue'
    DeletionPolicy: Retain
    Properties:
      QueueName: test-sqs
      VisibilityTimeout: 30
      MaximumMessageSize: 2048
      # MaximumMessageSize
      # 256KB * 8bit = 2048B
      MessageRetentionPeriod: 345600
      # MessageRetentionPeriod
      # 345600/1440 = 240
      # 240/60 = 4 days
      ReceiveMessageWaitTimeSeconds: 0

```
<b>Amazon SQS のcfnテンプレートを作成する際のtips</b>

:::note info
* VisibilityTimeout
  * コンソール上だと、デフォルトの可視性タイムアウトを指しています。

* MaximumMessageSize
  * コンソール上だと、最大のメッセージサイズを指しています。
    * <b>※ここの表記はバイトなので今回の場合、KBをBに変換しています。</b>

* MessageRetentionPeriod
  * コンソール上だと、メッセージの保存期間を指しています。
    * <b>※ここの表記は秒数になるので今回の場合、日数を秒数に変換しています。</b>

各パラメータの詳細については以下のドキュメントを参考にしてください。
ref: [AWS::SQS::Queue](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queue.html)
:::

### 2, 作成したAmazon SQSのcfnテンプレートをもとにリソースをimportする

#### (1) CloudFormationを開いて既存のリソースを使用(リソースをインポート)を押します。

![スクリーンショット 2023-02-28 17.55.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567360/9116595b-9168-3768-b2b1-afcc8af3b097.png)

#### (2) リソースを識別ページに飛ぶので次へに進みます。
![スクリーンショット 2023-02-28 17.41.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567360/c50b1b56-a6b1-b823-5346-c040fc8de148.png)

#### (3) テンプレートの指定ページに飛ぶので(1)で作ったtemplateをアップロードして次へ進みます。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3536373336302f66363464313562662d363932662d383937622d333731302d3935613730663737393963322e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567360/af782991-078a-0e9a-ceb6-ae3072a85c26.png)


※アップロードの方法はS3にアップロードしておく方法とテンプレートファイルのアップロードの２種類の方法がありますが、私の環境ではcfnをs3等で管理しているわけではなくgithubのリポジトリで管理しているのでs3からアップロードではなく手動でテンプレートファイルをアップロードしています。

#### (4) インポートするリソースを選択するページに移動するので今回インポートするSQSのQueueURLを入力して次へ進みます。

![スクリーンショット 2023-02-28 18.03.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567360/5e5d802e-b47b-201d-2c54-cc41d9b5bdea.png)
※Amazon SQSのQueueURLは、Amazon SQSのコンソールのURLの部分にあります。

#### (5) スタックの詳細を指定ページに移動するのでスタック名を入力します。
![スクリーンショット 2023-03-03 14.57.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567360/cb640e88-0140-ac58-2397-18ed0d620af8.png)


ここで定義するスタックの名前は今後cfnで管理するリソースのスタック名になるのでリソースを識別できる名前にするのが良いと思います。

#### (6) 最後にスタックの詳細を確認してリソースをインポートを押します。
![スクリーンショット 2023-02-28 18.08.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567360/96c9db9d-ca82-5753-d57d-92eed4d5338e.png)

変更点を確認してインポートされるリソースで間違っていないかを確認してインポートを押す必要があります。

## 3, Amazon SQSリソースがcfnでインポートされているかを確認する。
cfnのコンソールを確認するとimportされていることが確認できます。
![スクリーンショット 2023-02-28 18.11.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567360/414b6d8e-f253-6a31-3e14-b68213793580.png)

該当スタック名のステータスが`IMPORT_COMPLETE`になっていればimportが成功していますので、(1)で作ったテンプレートをもとにcfn管理をすることができるようになります。

## まとめ
CloudFormationの既存リソースのimportを行うことで、手動で作成したAWSリソースをcfn管理することができました。

今回はAmazon SQSを用いてimportを行いましたが、もし他の手動で作成したリソースをcfnで管理したいと考えている場合にはこの方法を使ってみると良いと思います。

既存リソースのimportが行えるリソースを以下にまとめておきたいと思いますので参考にしてください。

ref: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resource-import-supported-resources.html

## 参考情報
https://dev.classmethod.jp/articles/cloudformation-import-existing-resources/