3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

CloudFormationのresource importを試してみた

Posted at

はじめに

ソリューションアーキテクトプロフェッショナルの勉強をしていて、CloudFormationのリソースインポートが気になったので、公式を参考に手を動かしてみました。

概要

  • resource importは、次の2つができる
    • CloudFormationスタックのリソースとして紐づいていないリソースを、新しいCloudFormationスタックのリソースにできる
    • 既にあるCloudFormationスタックに、どのスタックにも含まれていないリソースを取り込める
      • 同時に既存スタックの変更・削除はできない

紐づいていないリソースをスタックにまとめる

以下を参考にしました。

ここでは、CLIでつくった2つのリソースを、1つのスタックにまとめます。

事前準備

以下の2つのIAMユーザを作成します。

aws iam create-user --user-name Anisphia
aws iam create-user --user-name Euphyllia

1つのスタックにまとめる

以下のテンプレートを使います。

createPair.yaml
AWSTemplateFormatVersion: 2010-09-09

Resources:
  Heroine:
    Type: AWS::IAM::User
    DeletionPolicy: Retain

  Fiancee:
    Type: AWS::IAM::User
    DeletionPolicy: Retain

コンソールから

「既存のリソースを使用(リソースのインポート))」を選択します。
image.png

「リソースを識別」は特に入力がないので遷移し、「テンプレートの指定」では先のファイルを指定します。

「リソースを識別」で、事前準備で作成したリソースの情報を設定します。
image.png

「スタックの詳細を指定」でスタック名を設定します。
image.png

「リソースをインポート」で開始します。ステータスは「IMPORT_IN_PROGRESS」でした。
image.png

正常に取り込まれると、「IMPORT_COMPLETE」になりました。
image.png

CLIから作成したリソースが、スタックのリソースとして取り込まれました。
image.png

CLIから

同様のことをCLIで行います。

設定ファイル作成

最初に、どのインポートリソースに何をあてがうのか、の設定を行います。

以下のコマンドで、テンプレートファイルから、必要な部分を抽出してファイルに書き出します。

aws cloudformation get-template-summary --template-body file://createPair.yaml --query 'ResourceIdentifierSummaries' > ResourcesToImport.json
ResourcesToImport.json
[
    {
        "ResourceType": "AWS::IAM::User",
        "LogicalResourceIds": [
            "Heroine",
            "Fiancee"
        ],
        "ResourceIdentifiers": [
            "UserName"
        ]
    }
]

これを、以下のように加工します。配列を辞書型にしたり、複数形のsを消して単数形にしていたり、ちょっとわかりづらい変更点があります。

ResourcesToImport.json
[
    {
        "ResourceType": "AWS::IAM::User",
        "LogicalResourceId": "Heroine",
        "ResourceIdentifier": {
            "UserName":"Anisphia"
        }
    }
    ,
    {
        "ResourceType": "AWS::IAM::User",
        "LogicalResourceId": "Fiancee",
        "ResourceIdentifier": {
            "UserName":"Euphyllia"
        }
    }
]

作成

引数に与える文字列を変数に格納します。

STACKNAME="createPair" && echo $STACKNAME
CHANGESETNAME="changeset-${STACKNAME}" && echo $CHANGESETNAME

先ほど作成したファイルを指定して、変更セットを作成します。IAMユーザを作成する例ですので--capabilities CAPABILITY_NAMED_IAMがあります。

aws cloudformation create-change-set \
    --stack-name $STACKNAME --change-set-name $CHANGESETNAME \
    --change-set-type IMPORT \
    --resources-to-import file://ResourcesToImport.json \
    --template-body file://createPair.yaml \
    --capabilities CAPABILITY_NAMED_IAM

変更セットの詳細は、以下のコマンドで確認できます。

aws cloudformation describe-change-set \
    --stack-name $STACKNAME --change-set-name $CHANGESETNAME

ステータスは以下のようになっていました。
image.png

変更セットを実行するため、以下のコマンドを流します。

aws cloudformation execute-change-set \
    --stack-name $STACKNAME --change-set-name $CHANGESETNAME

image.png

成功するとスタックに組み込まれました。

image.png

既にあるスタックに組み込む

以下を参考にします。

ここでは作成済みのCloudFormationスタックに、CLIで作成したリソースを取り込みます。

事前準備

作成済みのスタックを用意するため、以下のスタックを作成します。

createHeroine.yaml
AWSTemplateFormatVersion: 2010-09-09

Resources:
  Heroine:
    Type: AWS::IAM::User
    Properties:
      UserName: 'Anisphia'

image.png

以下のコマンドでリソースを作ります。これを先のスタックに取り込みます。

aws iam create-user --user-name Euphyllia

取り込む

以下のテンプレートを使います。

addFiancee.yaml
AWSTemplateFormatVersion: 2010-09-09

Resources:
  Heroine:
    Type: AWS::IAM::User
    Properties:
      UserName: 'Anisphia'

  Fiancee:
    Type: AWS::IAM::User
    DeletionPolicy: Retain

コンソールから

対象のスタックを選択して、「スタックへのリソースのインポート」をクリックします。
image.png

「リソースを識別」は特に入力がないので遷移し、「テンプレートの指定」では先のファイルを指定します。

「リソースを識別」では、追加分のリソースについて指定できますので、CLIから作成したリソースを入力します。
image.png

あとは「リソースをインポート」で実行されます。
image.png

完了すると、取り込まれました。
image.png

CLIから

設定ファイル作成

取り込むリソースに何をあてがうのか、の設定用ファイルを作成します。

先と同様、テンプレートファイルから、必要な部分を抽出してファイルに書き出します。

aws cloudformation get-template-summary --template-body file://addFiancee.yaml --query 'ResourceIdentifierSummaries' > ResourcesToImport.json
ResourcesToImport.json
[
    {
        "ResourceType": "AWS::IAM::User",
        "LogicalResourceIds": [
            "Heroine",
            "Fiancee"
        ],
        "ResourceIdentifiers": [
            "UserName"
        ]
    }
]

今回はリソースを1つ追加するので、定義は1つになります。

ResourcesToImport.json
[
    {
        "ResourceType": "AWS::IAM::User",
        "LogicalResourceId": "Fiancee",
        "ResourceIdentifier": {
            "UserName":"Euphyllia"
        }
    }
]

作成

使う文字列を変数に格納します。

STACKNAME="createHeroine" && echo $STACKNAME
CHANGESETNAME="changeset-${STACKNAME}" && echo $CHANGESETNAME

変更セットを作成します。

aws cloudformation create-change-set \
    --stack-name $STACKNAME --change-set-name $CHANGESETNAME \
    --change-set-type IMPORT \
    --resources-to-import file://ResourcesToImport.json \
    --template-body file://addFiancee.yaml  \
    --capabilities CAPABILITY_NAMED_IAM

中身を確認します。

aws cloudformation describe-change-set \
    --stack-name $STACKNAME --change-set-name $CHANGESETNAME

問題なければ、実行します。

aws cloudformation execute-change-set \
    --stack-name $STACKNAME --change-set-name $CHANGESETNAME

image.png

正常に組み込まれました。
image.png

おわりに

今回はCloudFormationのresource importを実際に使ってみました。

運用中に、CloudFormation外で作成したリソースを、既存のスタックとまとめたいということはあるかと思いますので、そういう際に使っていこうと思います。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?