はじめに
IaCの有用性については様々なところで言われてはいるものの、手動で作成したリソースがすでにあると中途半端にIaCをしてもなぁ……と敬遠されがちなところがあるかと思います。
そう思って、既存のリソースをコード管理する方法がないかを調べていたところ、CloudFormationのインポート機能を使えば、既存リソースもコード管理下に置けることがわかりました。
この記事はCloudFormationのインポート機能をテストしたときの備忘録になります。
0. 準備
まずはAWSコンソール上で手動でリソースを作成します。
今回は、Security Groupを作成しました。
設定としてはこんな感じです。
1. 作成したSecurity Groupと同じ内容のテンプレートを作成する
test.yaml
を作成して以下を記述して保存します。
AWSTemplateFormatVersion: "2010-09-09"
Resources:
SecurityGroup:
Type: "AWS::EC2::SecurityGroup"
Properties:
GroupDescription: "test"
GroupName: "test"
VpcId: sg-hoge # 実際のVPCを記述してください。
SecurityGroupIngress:
-
CidrIp: "0.0.0.0/0"
FromPort: 80
IpProtocol: "tcp"
ToPort: 80
UpdateReplacePolicy: Retain
DeletionPolicy: Retain
インポート機能を使用する際には、必ずDeletionPolicy
を「Retain」にしないといけないので注意してください。
また、UpdateReplacePolicy
も未設定の場合は、CloudFormationの設定に上書きされる可能性があるので、安全のため「Retain」を設定することをオススメします。
Former2のススメ
なお、作成したテンプレートと実際のリソースが同じかどうかは、Former2を使用して確認するのがいいです。
Former2を用いると、AWS上に実際に展開されているリソースをCloudFormationやTerraformなどのインフラコードに変換してくれます。
2. Securiy Groupをインポート
test.yaml
を用いて、CloudFormationにインポートする
CloudFormationコンソールから「既存のリソースを使用(リソースをインポート)」をクリック
「テンプレートファイルのアップロード」を選択し、test.yaml
をアップロードする。
終わったら「次へ」ボタンをクリック
「識別子の値」に今回作成したSecurityGroupのIDを入力する
完了したら「次へ」ボタンをクリック
一番下の「変更」で、アクションが「Import」になっていることを確認してください。
問題がなければ「リソースをインポート」をクリックします。
実行したスタックを見て、ステータスが「IMPORT_COMPLETE」になれば完了です。
3. インポートしたSecurity GroupをCloudFormationを用いて更新する。
作成したtest.yaml
を以下のように修正します。
AWSTemplateFormatVersion: "2010-09-09"
Resources:
SecurityGroup:
Type: "AWS::EC2::SecurityGroup"
Properties:
GroupDescription: "test"
GroupName: "test"
VpcId: sg-hoge # 実際のVPCを記述してください。
SecurityGroupIngress:
-
CidrIp: "0.0.0.0/0"
FromPort: 80
IpProtocol: "tcp"
ToPort: 80
-
CidrIp: "0.0.0.0/0"
FromPort: 443
IpProtocol: "tcp"
ToPort: 443
UpdateReplacePolicy: Delete
DeletionPolicy: Retain
セキュリティグループのインバウンドに新たにHTTPSを追加しています。
UpdateReplacePolicy
が「Retain」のままだと更新が適応されないので注意してください。
CloudFormationコンソールから先ほど実行したスタックを更新します。
「既存テンプレートを置き換える」を選択し、「テンプレートファイルのアップロード」で修正したtest.yaml
をアップロードします。
完了したら「次へ」ボタンをクリックします。
変更セットのプレビューで、セキュリティグループのアクションが「Modify」になっていることを確認します。
確認して問題がなければ「スタックの更新」をクリックします。
実行したスタックを見て、ステータスが「UPDATE_COMPLETE」になれば更新は完了しています。
更新したセキュリティグループをAWSコンソール上から確認します。
インバウンドルールが追加されていれば、確認完了です。
注意点
インポート機能については一部のリソースについてはサポートしていません。
例えばApplication Load Balancer のターゲットグループは2021年6月時点ではサポートされていません。
サポートされているリソースについては以下を参考にしてください。