スタックへの既存リソースのインポート
このトピックでは、テンプレートに既存の AWS リソースを記述することで、それらを既存のスタックにインポートする方法を説明します。その代わりに、既存のリソースをスキャンして、既存のリソースを CloudFormation にインポートしたり、新しいアカウントでリソースを複製したりするために使用できるテンプレートを自動的に生成するには、「IaC ジェネレーターを使用して既存のリソースからテンプレートを生成する」を参照してください。
前提条件
始めるには以下のものが必要です。
-
スタックにすでに含まれているリソースとインポートするリソースの両方を含む、スタック全体を記述するテンプレート。テンプレートをローカルに保存、または Amazon S3 バケットに保存します。
実行中スタックのテンプレートのコピーを取得する
-
CloudFormation コンソール (https://console.aws.amazon.com/cloudformation/
) を開きます。 -
スタックのリストから、テンプレートの取得元となるスタックを選択します。
-
[スタックの詳細] ペインで [テンプレート] タブを選択してから、[クリップボードにコピー] を選択します。
-
コードをテキストエディタに貼り付けて、テンプレートへのその他リソースの追加を開始します。
-
-
インポートするリソースごとに、以下を含めてください。
-
リソースの現在の設定を定義するプロパティとプロパティ値。
-
リソースの固有識別子 (リソース名など)。詳細については、「リソース識別子」を参照してください。
-
サンプルテンプレート
このチュートリアルでは、2 つの DynamoDB テーブルを指定する、TemplateToImport.json
という名前の以下のサンプルテンプレートを使用していることを前提としています。ServiceTable
は現在スタックに含まれているテーブルで、GamesTable
はインポートするテーブルです。
注記
これは、テンプレートの一例にすぎません。独自のテスト目的のために使用するには、サンプルリソースをお使いのアカウントのリソースに置き換えてください。
{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "Import test",
"Resources": {
"ServiceTable": {
"Type": "AWS::DynamoDB::Table",
"Properties": {
"TableName": "Service",
"AttributeDefinitions": [
{
"AttributeName": "key",
"AttributeType": "S"
}
],
"KeySchema": [
{
"AttributeName": "key",
"KeyType": "HASH"
}
],
"ProvisionedThroughput": {
"ReadCapacityUnits": 5,
"WriteCapacityUnits": 1
}
}
},
"GamesTable": {
"Type": "AWS::DynamoDB::Table",
"DeletionPolicy": "Retain",
"Properties": {
"TableName": "Games",
"AttributeDefinitions": [
{
"AttributeName": "key",
"AttributeType": "S"
}
],
"KeySchema": [
{
"AttributeName": "key",
"KeyType": "HASH"
}
],
"ProvisionedThroughput": {
"ReadCapacityUnits": 5,
"WriteCapacityUnits": 1
}
}
}
}
}
AWS Management Console を使用した既存のリソースのスタックへのインポート
注記
AWS CloudFormation コンソールは、リソースをインポートする場合に、組み込み関数である Fn::Transform の使用をサポートしません。AWS Command Line Interface を使用して組み込み関数 Fn::Transform を使用するリソースをインポートできます。
AWS Management Console にサインインし、AWS CloudFormation コンソール (https://console.aws.amazon.com/cloudformation
) を開きます。 -
[スタック] ページで、リソースのインポート先のスタックを選択します。
-
[Stack actions (スタックアクション)] を選択し、[Import resources into stack (リソースをスタックにインポートする)] を選択します。
-
[インポートの概要] ページを確認し、[次へ] を選択します。
-
[Specify template (テンプレートを指定)] ページで、以下のいずれかの方法を使用して更新したテンプレートを指定し、[次へ] を選択します。
-
[Amazon S3 URL] を選択し、テキストボックスでテンプレートの URL を指定します。
-
[Upload a template file (テンプレートファイルのアップロード)] を選択し、テンプレートを参照します。
-
-
[Identify resources (リソースの識別)] ページで、各ターゲットリソースを識別します。詳細については、「リソース識別子」を参照してください。
-
[Identifier property (識別子のプロパティ)] で、リソース識別子のタイプを選択します。たとえば、
AWS::DynamoDB::Table
リソースはTableName
プロパティを使用して識別できます。 -
[Identifier value (識別子の値)] に、実際のプロパティ値を入力します。たとえば、サンプルテンプレートの
GamesTable
リソースのTableName
は
です。Games
-
[Next] を選択します。
-
-
[Specify stack details (スタック詳細の指定)] ページで、任意のパラメータを更新し、[次へ] を選択します。これにより、変更セットが自動的に作成されます。
注記
作成、更新、または削除オペレーションを開始する既存のパラメータを変更すると、インポートオペレーションは失敗します。
-
[Review
stack-name
(スタック名の確認)] ページで、インポートするリソースを確認し、[Import resources (リソースのインポート)] を選択します。これにより、最後のステップで作成した変更セットが自動的に実行されます。この時点で、インポートされたリソースにはスタックレベルのタグが適用されます。詳細については、「スタックオプションを設定する」を参照してください。スタックの [イベント] ページが表示されます。
-
(オプション) スタックでドリフト検出を実行し、インポートされたリソースのテンプレートと実際の構成が一致していることを確認します。ドリフト検出の詳細については、「CloudFormation スタック全体のドリフトを検出する」を参照してください。
-
(オプション)インポートしたリソースが予想されるテンプレート構成と一致しない場合は、テンプレート構成を修正するか、リソースを直接更新します。ドリフトしたリソースのインポートに関する詳細は、「インポートオペレーションでドリフトを解決する」を参照してください。
AWS CLI を使用した既存のリソースのスタックへのインポート
-
テンプレート内の各リソースタイプを識別するプロパティを知るには、テンプレートの S3 URL を指定して get-template-summary コマンドを実行します。たとえば、
AWS::DynamoDB::Table
リソースはTableName
プロパティを使用して識別できます。サンプルテンプレートのGamesTable
リソースの場合、TableName
の値はGames
です。この情報は、次のステップで必要になります。aws cloudformation get-template-summary \ --template-url
https://amzn-s3-demo-bucket.s3.us-west-2.amazonaws.com/TemplateToImport.json
詳細については、「リソース識別子」を参照してください。
-
インポートする実際のリソースとその一意の識別子のリストを次の JSON 文字列形式で作成します。
[{"ResourceType":"AWS::DynamoDB::Table","LogicalResourceId":"GamesTable","ResourceIdentifier":{"TableName":"Games"}}]
または、設定ファイルで JSON 形式のパラメータを指定することもできます。
例えば、
GamesTable
をインポートするには、次の設定を含むResourcesToImport.txt
ファイルを作成します。[ { "ResourceType":"AWS::DynamoDB::Table", "LogicalResourceId":"GamesTable", "ResourceIdentifier": { "TableName":"Games" } } ]
-
変更セットを作成するには、次の create-change-set コマンドを使用してプレースホルダーテキストを置き換えます。
--change-set-type
オプションの場合、IMPORT
の値を指定します。--resources-to-import
オプションでは、サンプルの JSON 文字列を、作成した実際の JSON 文字列に置き換えます。aws cloudformation create-change-set \ --stack-name
TargetStack
--change-set-nameImportChangeSet
\ --change-set-typeIMPORT
\ --template-urlhttps://amzn-s3-demo-bucket.s3.us-west-2.amazonaws.com/TemplateToImport.json
\ --resources-to-import'[{"ResourceType":"AWS::DynamoDB::Table","LogicalResourceId":"GamesTable","ResourceIdentifier":{"TableName":"Games"}}]'
注記
--resources-to-import
はインライン YAML をサポートしていません。JSON 文字列で引用符をエスケープするための要件は、ターミナルに応じて異なります。詳細については、「AWS Command Line Interface ユーザーガイド」の「Using quotation marks inside strings」を参照してください。または、次の例に示すように、ファイル URL を
--resources-to-import
オプションの入力として使用できます。--resources-to-import
file://ResourcesToImport.txt
-
変更セットを確認し、正しいリソースがインポートされることを確認します。
aws cloudformation describe-change-set \ --change-set-name
ImportChangeSet
--stack-nameTargetStack
-
変更セットを開始してリソースをインポートするには、次の execute-change-set コマンドを使用してプレースホルダーテキストを置き換えます。この時点で、インポートされたリソースにはスタックレベルのタグが適用されます。詳細については、「スタックオプションを設定する」を参照してください。オペレーション
(IMPORT_COMPLETE)
が正常に完了すると、リソースは正常にインポートされています。aws cloudformation execute-change-set \ --change-set-name
ImportChangeSet
--stack-nameTargetStack
-
(オプション)
IMPORT_COMPLETE
スタックでドリフト検出を実行し、インポートされたリソースのテンプレートと実際の構成が一致していることを確認します。ドリフト検出の詳細については、「CloudFormation スタック全体のドリフトを検出する」を参照してください。-
指定されたスタックでドリフト検出を実行します。
aws cloudformation detect-stack-drift --stack-name
TargetStack
正常に完了した場合、このコマンドは次のサンプル出力を返します。
{ "Stack-Drift-Detection-Id" : "624af370-311a-11e8-b6b7-500cexample" }
-
指定されたスタックドリフト検出 ID のドリフト検出オペレーションの進行状況を表示します。
aws cloudformation describe-stack-drift-detection-status \ --stack-drift-detection-id
624af370-311a-11e8-b6b7-500cexample
-
指定されたスタック内でドリフトが確認されたリソースのドリフト情報を表示します。
aws cloudformation describe-stack-resource-drifts --stack-name
TargetStack
-
-
(オプション)インポートしたリソースが予想されるテンプレート構成と一致しない場合は、テンプレート構成を修正するか、リソースを直接更新します。ドリフトしたリソースのインポートに関する詳細は、「インポートオペレーションでドリフトを解決する」を参照してください。