はじめに
ソリューションアーキテクトプロフェッショナルの勉強をしていて、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つのスタックにまとめる
以下のテンプレートを使います。
AWSTemplateFormatVersion: 2010-09-09
Resources:
Heroine:
Type: AWS::IAM::User
DeletionPolicy: Retain
Fiancee:
Type: AWS::IAM::User
DeletionPolicy: Retain
コンソールから
「既存のリソースを使用(リソースのインポート))」を選択します。
「リソースを識別」は特に入力がないので遷移し、「テンプレートの指定」では先のファイルを指定します。
「リソースを識別」で、事前準備で作成したリソースの情報を設定します。
「リソースをインポート」で開始します。ステータスは「IMPORT_IN_PROGRESS」でした。
正常に取り込まれると、「IMPORT_COMPLETE」になりました。
CLIから作成したリソースが、スタックのリソースとして取り込まれました。
CLIから
同様のことをCLIで行います。
設定ファイル作成
最初に、どのインポートリソースに何をあてがうのか、の設定を行います。
以下のコマンドで、テンプレートファイルから、必要な部分を抽出してファイルに書き出します。
aws cloudformation get-template-summary --template-body file://createPair.yaml --query 'ResourceIdentifierSummaries' > ResourcesToImport.json
[
{
"ResourceType": "AWS::IAM::User",
"LogicalResourceIds": [
"Heroine",
"Fiancee"
],
"ResourceIdentifiers": [
"UserName"
]
}
]
これを、以下のように加工します。配列を辞書型にしたり、複数形のsを消して単数形にしていたり、ちょっとわかりづらい変更点があります。
[
{
"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
変更セットを実行するため、以下のコマンドを流します。
aws cloudformation execute-change-set \
--stack-name $STACKNAME --change-set-name $CHANGESETNAME
成功するとスタックに組み込まれました。
既にあるスタックに組み込む
以下を参考にします。
ここでは作成済みのCloudFormationスタックに、CLIで作成したリソースを取り込みます。
事前準備
作成済みのスタックを用意するため、以下のスタックを作成します。
AWSTemplateFormatVersion: 2010-09-09
Resources:
Heroine:
Type: AWS::IAM::User
Properties:
UserName: 'Anisphia'
以下のコマンドでリソースを作ります。これを先のスタックに取り込みます。
aws iam create-user --user-name Euphyllia
取り込む
以下のテンプレートを使います。
AWSTemplateFormatVersion: 2010-09-09
Resources:
Heroine:
Type: AWS::IAM::User
Properties:
UserName: 'Anisphia'
Fiancee:
Type: AWS::IAM::User
DeletionPolicy: Retain
コンソールから
対象のスタックを選択して、「スタックへのリソースのインポート」をクリックします。
「リソースを識別」は特に入力がないので遷移し、「テンプレートの指定」では先のファイルを指定します。
「リソースを識別」では、追加分のリソースについて指定できますので、CLIから作成したリソースを入力します。
CLIから
設定ファイル作成
取り込むリソースに何をあてがうのか、の設定用ファイルを作成します。
先と同様、テンプレートファイルから、必要な部分を抽出してファイルに書き出します。
aws cloudformation get-template-summary --template-body file://addFiancee.yaml --query 'ResourceIdentifierSummaries' > ResourcesToImport.json
[
{
"ResourceType": "AWS::IAM::User",
"LogicalResourceIds": [
"Heroine",
"Fiancee"
],
"ResourceIdentifiers": [
"UserName"
]
}
]
今回はリソースを1つ追加するので、定義は1つになります。
[
{
"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
おわりに
今回はCloudFormationのresource importを実際に使ってみました。
運用中に、CloudFormation外で作成したリソースを、既存のスタックとまとめたいということはあるかと思いますので、そういう際に使っていこうと思います。