cloudtools / stacker

An AWS CloudFormation Stack orchestrator/manager.
http://stacker.readthedocs.io/en/stable/
BSD 2-Clause "Simplified" License
711 stars 167 forks source link

change diff to use CFN change sets instead of comparing template dicts #744

Closed ITProKyle closed 4 years ago

ITProKyle commented 4 years ago

Using CFN Change Sets will give a more accurate representation of what is being changed. Akin to terraform plan.

Usage

Interactive

A summary of changes is displayed for each stack (the same as stacker build). The user is prompted about displaying the full changeset before moving on.

$ stacker diff -i dev-us-west-2.env stacks.yaml
[2019-09-12T13:21:47] Using interactive AWS provider mode.
[2019-09-12T13:21:47] Diffing stacks: stacker-tf-state
[2019-09-12T13:21:49] example-stacker-tf-state changes:
Parameters Modified: BucketName
Replacements:
- Modify TerraformStateBucket (AWS::S3::Bucket)
Changes:
- Modify ManagementPolicy (AWS::IAM::ManagedPolicy)
Show full change set? [y/n] n

Default

The full change set is displayed. This example also showcases a stack (stacker-fake-resource) that is consuming the output of a previous stack (stacker-tf-state) resulting in an inferred change.

$ stacker diff dev-us-west-2.env stacks.yaml --region us-west-2 --replacements-only
[2019-09-12T13:30:16] Using default AWS provider mode
[2019-09-12T13:30:17] Diffing stacks: stacker-tf-state, stacker-fake-resource
[2019-09-12T13:30:19] example-stacker-tf-state full changeset:

--- Old Parameters
+++ New Parameters
******************
-BucketName = example-us-west-2-stackerdev
+BucketName = example-us-west-2-stackerdev-changed
 TableName = stacker-state-table

- ResourceChange:
    Action: Modify
    Details:
    - CausingEntity: TerraformStateBucket.Arn
      ChangeSource: ResourceAttribute
      Evaluation: Static
      Target:
        Attribute: Properties
        Name: PolicyDocument
        RequiresRecreation: Never
    LogicalResourceId: ManagementPolicy
    PhysicalResourceId: arn:aws:iam::************:policy/example-stacker-tf-state-ManagementPolicy-****
    Replacement: 'False'
    ResourceType: AWS::IAM::ManagedPolicy
    Scope:
    - Properties
  Type: Resource
- ResourceChange:
    Action: Modify
    Details:
    - ChangeSource: DirectModification
      Evaluation: Dynamic
      Target:
        Attribute: Properties
        Name: BucketName
        RequiresRecreation: Always
    - CausingEntity: BucketName
      ChangeSource: ParameterReference
      Evaluation: Static
      Target:
        Attribute: Properties
        Name: BucketName
        RequiresRecreation: Always
    LogicalResourceId: TerraformStateBucket
    PhysicalResourceId: example-us-west-2-stackerdev
    Replacement: 'True'
    ResourceType: AWS::S3::Bucket
    Scope:
    - Properties
  Type: Resource

[2019-09-12T13:30:19] stacker-tf-state: complete
[2019-09-12T13:30:22] example-stacker-fake-resource full changeset:

--- Old Parameters
+++ New Parameters
******************
-TestParameter = example-us-west-2-stackerdev
+TestParameter = <inferred-change: example-stacker-tf-state.TerraformStateBucketName={'Ref': 'TerraformStateBucket'}>

- ResourceChange:
    Action: Modify
    Details:
    - ChangeSource: DirectModification
      Evaluation: Dynamic
      Target:
        Attribute: Properties
        Name: BucketName
        RequiresRecreation: Always
    - CausingEntity: TestParameter
      ChangeSource: ParameterReference
      Evaluation: Static
      Target:
        Attribute: Properties
        Name: BucketName
        RequiresRecreation: Always
    LogicalResourceId: TestBucket
    PhysicalResourceId: example-us-west-2-stackerdev-x
    Replacement: 'True'
    ResourceType: AWS::S3::Bucket
    Scope:
    - Properties
  Type: Resource
quick-refs commented 4 years ago

Has this been released? or any plan on releasing it