How do I force a CloudFormation stack to update when the parameter is updated?

后端 未结 3 834
情书的邮戳
情书的邮戳 2021-01-02 18:37

I am running a AWS CloudFormation stack that takes in some parameters and launches EC2 instances along with other AWS resources. The parameters are fed into the user data of

相关标签:
3条回答
  • 2021-01-02 18:55

    Use the AWS CLI Update-Stack command. If you use the AWS CLI you can inject parameters into your stack so any change to any of the parameters result in a new stack. I do this myself to inject the Git/version commit ID into UserData so simply committing changes to the stack's JSON/Yaml to Git will allow stack updates. Any change to the parameters file will allow stack updates, even just a comment. I reference my Git commit ID in UserData the same way you are referencing Ref:CompanyName so when I change the Git commit ID the userData section is updated on stack updates.

    Update Stack Command

    aws cloudformation update-stack --stack-name MyStack --template-body file:///Users/Documents/Git/project/cloudformation/stack.json --parameters file:///Users/Documents/Git/project/cloudformation/parameters/stack-parameters.dev.json --capabilities CAPABILITY_IAM
    

    Process

    With this approach you make your parameters changes to the parameters json or yaml file then check it into version control. Now if you use a build server you can update your stack by checking out master and just running that one line above. Using AWS CodeBuild makes this easy so you don't need jenkins.

    0 讨论(0)
  • 2021-01-02 19:01

    CloudFormation will not update the stack unless there is a change in properties of the resources already created in the stack.

    For example: Consider I have a simple template to create a database where I need to pass 2 parameters:

    1. db-name
    2. region

    Assume that I am using db-name passing it as value to DBInstanceIdentifier.

    Also assume that I am not using the input parameter region for any purpose in creation of resources (or its properties) of the stack in any way.It is more of a dummy parameter I keep for readability purpose.

    I passed (TEST-DB1, us-east-1) as input parameters to the CloudFormation template and successfully created the resources.

    Scenario-1: Now if I update the stack(still using the existing template) and just change the input parameters to (TEST-DB2, us-east-1). ie: changing just the db-name and not the region. Then CloudFormation will detect that, this parameter update, results in change in properties of running resource(s) of the stack and will compute and display the modifications as a change set.

    Scenario-2: Suppose I make another update(still using the existing template) property and just change the input parameters to (TEST-DB1, us-east-2). ie: changing just the region and not the db-name. Then CloudFormation will detect that, this parameter update, result in NO change in properties of running resource(s) of the stack will show the Error creating change set.

    Bottomline: Your change in input parameter must result in an update/replacement of any resources(or its attributes like security-groups,port etc..) of the stack. Then AWS CloudFormation will display them as Change Sets for your review. Also, the method (update or replacement) AWS CloudFormation uses depends on which property you update for a given resource type.

    Your parameter "CompanyName" is not making any changes to the running resources of the stack. Hence it is reporting as Error creating change set. You need to use it to create any resource/resource properties of the stack. Then CloudFormation will detect the change-sets when you modify it. The same applies for any other input-parameters which you use.

    0 讨论(0)
  • 2021-01-02 19:10

    The answer of your problem is already answered with this state, CloudFormation will not update the stack unless there is a change in properties of the resources already created in the stack.

    And for the answer for your question, please check the explanation below.

    There is a way to force Cloudformation to update the stack using the AWS::CloudFormation::Init. By using cfn-init, each instance can update itself when it detect the change that made by AWS::CloudFormation::Init in metadata.

    There is a concept that we must understand first, that is the difference between UserData and metadata, at least under the AWS::CloudFormation::Init case.

    • Userdata: Will be only called once when the instance is being launch for the first time (this including update that need the instance to be replaced). So, if you update the stack (not creating a new one), even if you change the parameter value, it won't change anything if you call the parameter under UserData.
    • Metadata: Can be updated anytime. To make it works, you have to make sure that the daemon that detect the metadata changed is running (the daemon is called the cfn-hup)

    If you already use the Metadata and AWS::CloudFormation::Init, the data is not immediately being updated. As far I know, here is the condition the data to be change after change the Metadata value.

    • Reboot the instance
    • Run cfn-init command again with it's parameter
    • Waiting about 15 minutes, because the daemon to check the change in Metadata is checking the change once in 15 minutes.
    0 讨论(0)
提交回复
热议问题