Creating a stack from existing resources
During this import operation, you need to provide the following.
-
A template that describes the resources that will be in the new stack and the resource configurations. Each resource in your template must have a DeletionPolicy attribute.
-
A unique identifier for each target resource. Visit the appropriate service console to obtain unique identifiers.
In this walkthrough, we provide the following example template, called
TemplateToImport.json
. ServiceTable
and
GamesTable
are the targets of the import.
{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "Import test", "Resources": { "ServiceTable": { "Type": "AWS::DynamoDB::Table", "DeletionPolicy": "Retain", "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 } } } } }
Create a stack from existing resources using the AWS Management Console
-
Sign in to the AWS Management Console and open the AWS CloudFormation console at https://console.aws.amazon.com/cloudformation
. -
On the Stacks page, choose Create stack, and then choose With existing resources (import resources).
-
Read the Import overview page for a list of things you're required to provide during this operation. Then, choose Next.
-
On the Specify template page, provide your template using one of the following methods, and then choose Next.
-
Choose Amazon S3 URL, and then specify the URL for your template in the text box.
-
Choose Upload a template file, and then browse for your template.
-
-
On the Identify resources page, identify each target resource.
-
Under Identifier property, choose the type of resource identifier. For example, the
AWS::DynamoDB::Table
resource can be identified using theTableName
property. -
Under Identifier value, type the actual property value. For example, the
TableName
for theGamesTable
resource in the example template is
.Games
-
Choose Next.
-
-
On the Specify stack details page, modify any parameters, and then choose Next. This automatically creates a change set.
Important
The import operation fails if you modify existing parameters that initiate a create, update, or delete operation.
-
On the Review
stack-name
page, confirm that the correct resources are being imported, and then choose Import resources. This automatically executes the change set created in the last step.The Events pane of the Stack details page for your new stack displays.
-
(Optional) Run drift detection on the stack to make sure the template and actual configuration of the imported resources match. For more information about detecting drift, see Detect drift on an entire CloudFormation stack.
-
(Optional) If your imported resources don't match their expected template configurations, either correct the template configurations or update the resources directly. In this walkthrough, we correct the template configurations to match their actual configurations.
-
Revert the import operation for the affected resources.
-
Add the import targets to your template again, making sure that the template configurations match the actual configurations.
-
Repeat steps 2 – 8 using the modified template to import the resources again.
-
Create a stack from existing resources using the AWS CLI
-
Open the AWS CLI.
-
Optionally run
GetTemplateSummary
to learn which properties identify each resource type in your template. For example, theAWS::DynamoDB::Table
resource can be identified using theTableName
property. For theGamesTable
resource in the example template, the value ofTableName
isGames
.>
aws cloudformation get-template-summary --template-url https://
DOC-EXAMPLE-BUCKET
.s3.us-west-2
.amazonaws.com/TemplateToImport.json
-
Compose a list of the target resources from your template and their unique identifiers in the following format.
[{\"ResourceType\":\"
AWS::DynamoDB::Table
\",\"LogicalResourceId\":\"GamesTable
\",\"ResourceIdentifier\":{\"TableName
\":\"Games
\"}}] -
Create a change set of type
IMPORT
with the following parameters.--resources-to-import
doesn't support inline YAML.>
aws cloudformation create-change-set --stack-name
TargetStack
--change-set-nameImportChangeSet
--change-set-typeIMPORT
--resources-to-import "[{\"ResourceType\":\"AWS::DynamoDB::Table
\",\"LogicalResourceId\":\"GamesTable
\",\"ResourceIdentifier\":{\"TableName
\":\"Games
\"}},{\"ResourceType\":\"AWS::DynamoDB::Table
\",\"LogicalResourceId\":\"ServiceTable
\",\"ResourceIdentifier\":{\"TableName
\":\"Service
\"}}]" --template-url https://DOC-EXAMPLE-BUCKET
.s3.us-west-2
.amazonaws.com/TemplateToImport.json
The AWS CLI also supports text files as input for the
--resources-to-import
parameter, as shown in the following example.--resources-to-import
file://ResourcesToImport.txt
In this walkthrough,
file://ResourcesToImport.txt
contains the following.[ { "ResourceType":"AWS::DynamoDB::Table", "LogicalResourceId":"GamesTable", "ResourceIdentifier":{ "TableName":"Games" } }, { "ResourceType":"AWS::DynamoDB::Table", "LogicalResourceId":"ServiceTable", "ResourceIdentifier":{ "TableName":"Service" } } ]
-
Review the change set to make sure the correct resources will be imported.
>
aws cloudformation describe-change-set --change-set-name
ImportChangeSet
--stack-nameTargetStack
-
Execute the change set to import the resources. On successful completion of the operation
(IMPORT_COMPLETE)
, the resources are successfully imported.>
aws cloudformation execute-change-set --change-set-name
ImportChangeSet
--stack-nameTargetStack
-
(Optional) Run drift detection on the
IMPORT_COMPLETE
stack to make sure the template and actual configuration of the imported resources match. For more information on detecting drift, see Detect drift on an entire CloudFormation stack.>
aws cloudformation detect-stack-drift --stack-name
TargetStack
{ "StackDriftDetectionId" : "624af370-311a-11e8-b6b7-500cexample" }>
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
-
(Optional) If your imported resources don't match their expected template configurations, either correct the template configurations or update the resources directly. In this walkthrough, we correct the template configurations to match their actual configurations.
-
Revert the import operation for the affected resources.
-
Add the import targets to your template again, making sure that the template configurations match the actual configurations.
-
Repeat steps 4 – 7 using the modified template to import the resources again.
-