cfn-refactory
v0.0.9
Published
CloudFormation のリファクタリングを支援する簡易的なツールです。
Downloads
76
Readme
cfn-refactory
CloudFormation のリファクタリングを支援する簡易的なツールです。
[!CAUTION] これは実験的なプロジェクトです。本番環境での利用は想定されていません。
This is an experimental project. Not intended to use in production environment.
機能
generate-import-json
CloudFormation Resource Import で使用するためのJSONファイルを既存のCloudFormationスタックから生成します。
npx cfn-refactory generate-import-json MyStack --out MyStack.import.json
inject-policy
CloudFormation Resource Importの前提条件として必要な DeletionPolicy
をすべてのリソースに埋め込みます。
npx cfn-refactory inject-policy MyStack.json --out MyStack.retain.json
[!TIP] 対象のテンプレートはJSON形式である必要があります。YAMLからJSONへの変換には aws-cloudformation/rain が利用可能です。
rain fmt --json MyStack.yaml > MyStack.json
リファクタリングのシナリオ
2つのSQS Queueと1つのS3 BucketをもつStack1から、Stack2を新しく作成して2つのリソースを移動させる場合の手順はこのようになります。これは integ test に実装されており、 npm run integ
コマンドで再現することができます。
[!IMPORTANT] シナリオの実行には以下が必要です。
- aws-cloudformation/rain
- AWS CLI の認証情報が正しく設定されていること
- (準備) Stack1のテンプレート(YAML)を作成してデプロイする
rain deploy Stack1.before.yml Stack1
- サンプルテンプレート: Stack1.before.yml
- Stack1のすべてのスタックリソースを含む、インポート用のJSONを生成する
npx cfn-refactory generate-import-json Stack1 --out Stack1.import.json
- Stack1のテンプレート(YAML)をJSONに変換する
rain fmt --json Stack1.before.yml > Stack1.before.json
- Stack1のテンプレート(JSON)に含まれるすべてのリソースに
DeletionPolicy
を設定するnpx cfn-refactory inject-policy Stack1.before.json --out Stack1.retain.json
- Stack1をテンプレート(JSON)で更新して、
DeletionPolicy
を反映するrain deploy Stack1.retain.json Stack1
- Stack1のテンプレート(JSON)から移動させるリソースを削除する
- 手動操作。移動させないリソースの
DeletionPolicy
に変更がないなら、YAMLを編集してもよい - サンプルテンプレート: Stack1.after.yml
- 手動操作。移動させないリソースの
- Stack1をテンプレート(JSON)で更新して、移動させるリソースを削除する (
DELETE_SKIP
)rain deploy Stack1.after.yml Stack1
- インポート用のJSONから、移動させないリソースを削除する
- 手動操作
- Stack2のテンプレート(YAML)を作成して、変更セットを作成→実行する
- 下記コマンドを参照
- サンプルテンプレート: Stack2.yml
- Stack2のドリフト検出を実行する
aws cloudformation create-change-set \
--stack-name Stack2 \
--change-set-name ImportChangeSet \
--change-set-type IMPORT \
--resources-to-import file://Stack1.import.json \
--template-body file://Stack2.yml
aws cloudformation execute-change-set \
--stack-name Stack2 \
--change-set-name ImportChangeSet
[!TIP] 変更セットの
ChangeSetType: "IMPORT"
を使用してリソースインポートを行う場合、インポート以外のリソース操作は同時に行えません。
既存のスタックにインポートする場合、インポートするリソース以外に変更が発生しないことを確認してください。
Output
セクションなどの変更も許容されないため、インポートするリソースに依存する変更は、インポート完了後に再度スタックを更新してください。インポート以外のリソース操作を同時に行うには
ChangeSetType: "CREATE"
またはChangeSetType: "UPDATE"
とImportExistingResources
を組み合わせる必要があります。この場合はリソースに物理名の指定が必要となるため、物理名を指定したくない場合には使用できません。