【アップデート】ついに来た!CloudFormationで手動で作成したリソースをStackにインポート可能になりました
大栗です。
ついにCloudFormation以外で作成したリソースもCloudFormationの管理化にできるアップデートが来ました!!!長期的にCloudFormationで環境を管理すると辛くなってくる部分を解消できると思います。早速レポートします。
- New – Import Existing Resources into a CloudFormation Stack
- AWS CloudFormation Launches Resource Import
- Bringing Existing Resources Into CloudFormation Management
既存リソースのインポート
CloudFormationはInfrastructure as Codeを実現する良いサービスなのですが、緊急の場合などにどうしてもCloudFormationを使わずにCLIや手動でリソースを作成してしまうことがありCloudFormationによる環境の管理を挫折せざるを得なくなることがあります。今回のアップデートにより、別途作成したリソースをCloudFormationnスタックの管理に組み込めるようになります。
既存のリソースをスタックへ組み込む場合は、以下のような手順で行います。
- テンプレート上に既存リソースと同様の内容を追加する
-
- で変更したテンプレートと追加するリソースのIDを指定して、インポート操作を行う
- スタックに既存リソースが追加される
インポートは、新規でスタックを作成する事も、既存のスタックに追加することも可能です。
注意点
インポートするリソースは、テンプレート上でDeletionPolicy
をRetain
にする必要があります。
また、インポートできるものはドリフト検出ができるリソースのみです。具体的なリソースは以下のドキュメントで確認して下さい。
Resources that Support Import Operations
やってみた
以下のような流れで試してみます。リソースをスタックに追加して、最終的にCloudFormation経由で削除してみます。
- DynamoDBをCloudFormationを使わずに作成する
- DynamoDBをインポートしつつ新規にCloudFormationスタックを作成する
- EC2とSecurity GroupをCloudFormationを使わずに作成する
- EC2とSecurity Groupをインポートしつつ新規にCloudFormationスタックを作成する
- CloudFormationのDeletionPolicyを変更する
- CloudFormationと共にリソースを削除する
前提として、東京リージョンで実行しています。
DynamoDBをCloudFormationを使わずに作成する
まずDynamoDBを作成します。ここではAWS CLIで作成します。ここでは2個のテーブルを作成します。aws dynamodb create-table
コマンドで作成します。
$ aws dynamodb create-table \ > --region ap-northeast-1 \ > --attribute-definitions AttributeName=key,AttributeType=S \ > --table-name Service \ > --key-schema AttributeName=key,KeyType=HASH \ > --billing-mode PAY_PER_REQUEST { "TableDescription": { "TableArn": "arn:aws:dynamodb:ap-northeast-1:123456789012:table/Service", "AttributeDefinitions": [ { "AttributeName": "key", "AttributeType": "S" } ], "ProvisionedThroughput": { "NumberOfDecreasesToday": 0, "WriteCapacityUnits": 0, "ReadCapacityUnits": 0 }, "TableSizeBytes": 0, "TableName": "Service", "BillingModeSummary": { "BillingMode": "PAY_PER_REQUEST" }, "TableStatus": "CREATING", "TableId": "12345678-1234-1234-1234-123456789012", "KeySchema": [ { "KeyType": "HASH", "AttributeName": "key" } ], "ItemCount": 0, "CreationDateTime": 1573712546.942 } }
$ aws dynamodb create-table \ > --region ap-northeast-1 \ > --attribute-definitions AttributeName=key,AttributeType=S \ > --table-name Games \ > --key-schema AttributeName=key,KeyType=HASH \ > --billing-mode PAY_PER_REQUEST { "TableDescription": { "TableArn": "arn:aws:dynamodb:ap-northeast-1:123456789012:table/Games", "AttributeDefinitions": [ { "AttributeName": "key", "AttributeType": "S" } ], "ProvisionedThroughput": { "NumberOfDecreasesToday": 0, "WriteCapacityUnits": 0, "ReadCapacityUnits": 0 }, "TableSizeBytes": 0, "TableName": "Service", "BillingModeSummary": { "BillingMode": "PAY_PER_REQUEST" }, "TableStatus": "CREATING", "TableId": "12345678-1234-1234-1234-123456789012", "KeySchema": [ { "KeyType": "HASH", "AttributeName": "key" } ], "ItemCount": 0, "CreationDateTime": 1573712546.942 } }
DynamoDBをインポートしつつ新規にCloudFormationスタックを作成する
作成したDynamoDBと同じ内容のテンプレートを作成して、インポートします。
作成したDynamoDBと同様のテンプレートを用意します。
--- AWSTemplateFormatVersion: '2010-09-09' Description: Import test Resources: ServiceTable: Type: AWS::DynamoDB::Table DeletionPolicy: Retain Properties: TableName: Service AttributeDefinitions: - AttributeName: key AttributeType: S BillingMode: PAY_PER_REQUEST KeySchema: - AttributeName: key KeyType: HASH GamesTable: Type: AWS::DynamoDB::Table DeletionPolicy: Retain Properties: TableName: Games AttributeDefinitions: - AttributeName: key AttributeType: S BillingMode: PAY_PER_REQUEST KeySchema: - AttributeName: key KeyType: HASH
ここでCloudFormationのコンソールを開きます。スタックの作成
から既存のリソースを使用 (リソースをインポート)
をクリックします。
次へ
をクリックします。
用意したテンプレートをアップロードして次へ
をクリックします。
作成したDynamoDBのIDを以下の様に入力して次へ
をクリックします。
リソース論理ID | 識別子の値 |
---|---|
GamesTable | Games |
ServiceTable | Service |
スタックの名前
に任意の名前を入力して次へ
をクリックします。ここではImportStack
と入力しています。
一番下の変更
で、アクションがImport
になっていることを確認して、リソースをインポート
をクリックします。
少しすると、リソースがインポートされます。
スタック上でリソースが見えてます。
EC2とSecurity GroupをCloudFormationを使わずに作成する
次はEC2とSecurity Groupをスタックに追加するためにAW CLIで作成します。
Security Groupを作成します。
$ aws ec2 create-security-group \ --description cfn-import-test \ --group-name cfn-import-test \ --vpc-id vpc-abcdefgh { "GroupId": "sg-1234567890abcdefg" }
EC2を作成します。
$ aws ec2 run-instances --image-id ami-0064e711cbc7a825e \ --instance-type m5.large \ --subnet-id subnet-12345678 \ --security-group-ids sg-1234567890abcdefg \ { "Instances": [ { "Monitoring": { "State": "disabled" }, "PublicDnsName": "", "StateReason": { "Message": "pending", "Code": "pending" }, ・・・ } ], "ReservationId": "r-abcdefg1234567890", "Groups": [], "OwnerId": "123456789012" }
EC2とSecurity Groupをインポートしつつ新規にCloudFormationスタックを作成する
EC2とSecurity Groupを追加したテンプレートを用意します。
--- AWSTemplateFormatVersion: '2010-09-09' Description: Import test Parameters: VPCID: Type: String GROUPID: Type: String SUBNETID: Type: String Resources: ServiceTable: Type: AWS::DynamoDB::Table DeletionPolicy: Retain Properties: TableName: Service AttributeDefinitions: - AttributeName: key AttributeType: S BillingMode: PAY_PER_REQUEST KeySchema: - AttributeName: key KeyType: HASH GamesTable: Type: AWS::DynamoDB::Table DeletionPolicy: Retain Properties: TableName: Games AttributeDefinitions: - AttributeName: key AttributeType: S BillingMode: PAY_PER_REQUEST KeySchema: - AttributeName: key KeyType: HASH TestGroup: Type: AWS::EC2::SecurityGroup DeletionPolicy: Retain Properties: GroupDescription: cfn-import-test GroupName: cfn-import-test VpcId: !Ref VPCID TestInstance: Type: AWS::EC2::Instance DeletionPolicy: Retain Properties: ImageId: ami-0064e711cbc7a825e InstanceType: m5.large SecurityGroupIds: - !Ref GROUPID SubnetId: !Ref SUBNETID
ここでCloudFormationのコンソールを開きます。対象のスタックを選択して、スタックアクション
からスタックへのリソースのインポート
をクリックします。
次へ
をクリックします。
用意したテンプレートをアップロードして次へ
をクリックします。
作成したEC2のIDを以下の様に入力して次へ
をクリックします。
リソース論理ID | 識別子の値 |
---|---|
TestInstance | <作成したEC2のID> |
TestGroup | <作成したSecurity GroupのID> |
パラメータを入力して次へ
をクリックします。
リソース論理ID | 識別子の値 |
---|---|
GROUPID | <作成したSecurity GroupのID> |
SUBNETID | <EC2を配置したサブネットのID> |
VPCID | <作成したSecurity GroupのVPC> |
一番下の変更
で、アクションがImport
になっていることを確認して、リソースをインポート
をクリックします。
少しすると、リソースがインポートされます。
スタックを新規作成したときと同様に、スタック上でリソースが見えてます。
CloudFormationのDeletionPolicyを変更する
リソースを削除するために、DeletionPolicyを削除したテンプレートを用意します。
--- AWSTemplateFormatVersion: '2010-09-09' Description: Import test Parameters: VPCID: Type: String GROUPID: Type: String SUBNETID: Type: String Resources: ServiceTable: Type: AWS::DynamoDB::Table DeletionPolicy: Delete Properties: TableName: Service AttributeDefinitions: - AttributeName: key AttributeType: S BillingMode: PAY_PER_REQUEST KeySchema: - AttributeName: key KeyType: HASH GamesTable: Type: AWS::DynamoDB::Table DeletionPolicy: Delete Properties: TableName: Games AttributeDefinitions: - AttributeName: key AttributeType: S BillingMode: PAY_PER_REQUEST KeySchema: - AttributeName: key KeyType: HASH TestGroup: Type: AWS::EC2::SecurityGroup DeletionPolicy: Delete Properties: GroupDescription: cfn-import-test GroupName: cfn-import-test VpcId: !Ref VPCID TestInstance: Type: AWS::EC2::Instance DeletionPolicy: Delete Properties: ImageId: ami-0064e711cbc7a825e InstanceType: m5.large SecurityGroupIds: - !Ref GROUPID SubnetId: !Ref SUBNETID
ここでCloudFormationのコンソールを開きます。対象のスタックを選択して、更新する
をクリックします。
既存テンプレートを置き換える
を選択して、更新したテンプレートをアップロードして次へ
をクリックします。
パラメータを変更せずに次へ
をクリックします。
次へ
をクリックします。
変更セットのプレビュー
に何もないことを確認して、スタックの更新
をクリックします。
UPDATE_COMPLETE
になるのを待ちます。
CloudFormationと共にリソースを削除する
CloudFormationスタックを削除して、インポートしたリソースも消えることを確認します。
削除前のリソースを確認します。
DynamoDBにテーブルが2個あります。
Security Groupです。
EC2です。
ここでスタックを削除します。ここでCloudFormationのコンソールで対象のスタックを選択して、削除
をクリックします。
スタックの削除
をクリックします。
スタックが削除されていきます。
各リソースもDELETE_COMPLETE
になっています。
各々の画面でも確認してみます。
DynamoDBのテーブルが消えています。
Security Groupも消えています。
EC2もterminated
になっています。
CloudFormationの管理として削除できました。
さいごに
既存リソースのインポートは、ずっと待っていてようやく出てきた機能でした。これがあると環境をCloudFormationで管理して長期で運用することがしやすくなると思われます。私にもいくつかCloudFormationで管理している環境が、手動で作成してしまった場合は、一旦削除してCloudFormationで再作成したりといった大変手間がかかる運用となっていました。今回のアップデートをどんどん使っていきたいと思います。