αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžšαŸ€αž“αž˜αŸαžšαŸ€αž“αž‘αžΆαŸ†αž„ 6 αž“αŸαŸ‡αž“αŸƒαž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ cloudformation αž–αŸαž‰αž˜αž½αž™αž‡αžΈαžœαž·αžαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αŸ”

αžαŸ’αž‰αž»αŸ†αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ αž–αŸαžαŸŒαž˜αžΆαž“αž–αž–αž€ 4 αž†αŸ’αž“αžΆαŸ†β€‹αž€αž“αŸ’αž›αž„αž‘αŸ…αŸ” αžαžΆαŸ†αž„αž–αžΈαž–αŸαž›αž“αŸ„αŸ‡αž˜αž€ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž”αŸ†αž”αŸ‚αž€αž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‡αžΆαž…αŸ’αžšαžΎαž“ αžŸαžΌαž˜αŸ’αž”αžΈαžαŸ‚αž€αž“αŸ’αž›αŸ‚αž„αž•αž›αž·αžαžšαž½αž…αž αžΎαž™αž€αŸαžŠαŸ„αž™αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžšαžΆαž›αŸ‹αž–αŸαž›αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αžšαž‰αŸ‰αŸαžšαž‰αŸ‰αŸƒαž’αŸ’αžœαžΈαž˜αž½αž™ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžšαŸ€αž“αž’αŸ’αžœαžΈαžαŸ’αž˜αžΈαŸ” αžαžΆαž˜αžšαž™αŸˆαž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αž˜αŸαžšαŸ€αž“αžŸαŸ†αžαžΆαž“αŸ‹αŸ—αž˜αž½αž™αž…αŸ†αž“αž½αž“αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžšαŸ€αž“αŸ”

αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžšαŸ€αž“αž˜αŸαžšαŸ€αž“αž‘αžΆαŸ†αž„ 6 αž“αŸαŸ‡αž“αŸƒαž€αžΆαžšαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ cloudformation αž–αŸαž‰αž˜αž½αž™αž‡αžΈαžœαž·αžαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αŸ”

αž˜αŸαžšαŸ€αž“αž‘αžΈαŸ‘αŸ– αžŸαžΆαž€αž›αŸ’αž”αž„αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž˜αž»αž“αž“αžΉαž„αžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹

αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžšαŸ€αž“αž˜αŸαžšαŸ€αž“αž“αŸαŸ‡αž—αŸ’αž›αžΆαž˜αŸ—αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαžαŸ’αž‰αž»αŸ†αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ αž–αŸαžαŸŒαž˜αžΆαž“αž–αž–αž€. αžαŸ’αž‰αž»αŸ†β€‹αž˜αž·αž“β€‹αž…αžΆαŸ†β€‹αžαžΆβ€‹αž’αŸ’αžœαžΈβ€‹αžŠαŸ‚αž›β€‹αžαŸ’αž‰αž»αŸ†β€‹αžαžΌαž…β€‹αž“αŸ„αŸ‡β€‹αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αžαŸ’αž‰αž»αŸ†β€‹αž…αŸ’αž”αžΆαžŸαŸ‹β€‹αž‡αžΆβ€‹αž…αžΆαŸ†β€‹αžαžΆβ€‹αžαŸ’αž‰αž»αŸ†β€‹αž”αžΆαž“β€‹αž”αŸ’αžšαžΎβ€‹αž–αžΆαž€αŸ’αž™β€‹αž”αž‰αŸ’αž‡αžΆ Aws cloudformation update. αž–αžΆαž€αŸ’αž™β€‹αž”αž‰αŸ’αž‡αžΆβ€‹αž“αŸαŸ‡β€‹αž‚αŸ’αžšαžΆαž“αŸ‹β€‹αžαŸ‚β€‹αžŠαžΆαž€αŸ‹β€‹αž…αŸαž‰β€‹αž“αžΌαžœβ€‹αž‚αŸ†αžšαžΌβ€‹αžŠαŸ„αž™β€‹αž˜αž·αž“β€‹αž˜αžΆαž“β€‹αž€αžΆαžšβ€‹αž”αž‰αŸ’αž‡αžΆαž€αŸ‹β€‹αž–αžΈβ€‹αž€αžΆαžšβ€‹αž•αŸ’αž›αžΆαžŸαŸ‹β€‹αž”αŸ’αžαžΌαžšβ€‹αžŠαŸ‚αž›β€‹αž“αžΉαž„β€‹αžαŸ’αžšαžΌαžœβ€‹αžŠαžΆαž€αŸ‹β€‹αž±αŸ’αž™β€‹αž”αŸ’αžšαžΎβ€‹αž”αŸ’αžšαžΆαžŸαŸ‹β€‹αž‘αžΎαž™αŸ” αžαŸ’αž‰αž»αŸ†β€‹αž˜αž·αž“β€‹αž‚αž·αžβ€‹αžαžΆβ€‹αž€αžΆαžšβ€‹αž–αž“αŸ’αž™αž›αŸ‹β€‹αžŽαžΆβ€‹αž˜αž½αž™β€‹αž‚αžΊβ€‹αžαŸ’αžšαžΌαžœβ€‹αž€αžΆαžšβ€‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹β€‹αž˜αžΌαž›β€‹αž αŸαžαž»β€‹αžŠαŸ‚αž›β€‹αž’αŸ’αž“αž€β€‹αž‚αž½αžšβ€‹αžŸαžΆαž€αž›αŸ’αž”αž„β€‹αž€αžΆαžšβ€‹αž•αŸ’αž›αžΆαžŸαŸ‹β€‹αž”αŸ’αžαžΌαžšβ€‹αž‘αžΆαŸ†αž„β€‹αž’αžŸαŸ‹β€‹αž˜αž»αž“β€‹αž–αŸαž›β€‹αžŠαžΆαž€αŸ‹β€‹αž±αŸ’αž™β€‹αž”αŸ’αžšαžΎβ€‹αž”αŸ’αžšαžΆαžŸαŸ‹αŸ”

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž”αžšαžΆαž‡αŸαž™αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž—αŸ’αž›αžΆαž˜αŸ— αž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αŸ„αŸ‡αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‡αŸ†αž“αž½αžŸαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž’αžΆαž”αŸ‹αžŠαŸαžαžŠαŸ„αž™αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ αž”αž„αŸ’αž€αžΎαž-αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš-αž€αŸ†αžŽαžαŸ‹

# OPERATION is either "UPDATE" or "CREATE"
changeset_id=$(aws cloudformation create-change-set 
    --change-set-name "$CHANGE_SET_NAME" 
    --stack-name "$STACK_NAME" 
    --template-body "$TPL_PATH" 
    --change-set-type "$OPERATION" 
    --parameters "$PARAMETERS" 
    --output text 
    --query Id)

aws cloudformation wait 
    change-set-create-complete --change-set-name "$changeset_id"

αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžŸαŸ†αžŽαž»αŸ†αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαž αžœαžΆαž˜αž·αž“αž˜αžΆαž“αž₯αž‘αŸ’αž’αž·αž–αž›αž›αžΎαž‡αž„αŸ‹αžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αžšαžΆαž”αŸ‹αž“αŸ„αŸ‡αž‘αŸαŸ” αž˜αž·αž“αžŠαžΌαž…αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž’αžΆαž”αŸ‹αžŠαŸαžαž‘αŸ αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž“αŸƒαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž˜αž·αž“αž”αž„αŸ’αž€αž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž–αž·αžαž”αŸ’αžšαžΆαž€αžŠαž“αŸ„αŸ‡αž‘αŸαŸ” αž•αŸ’αž‘αž»αž™αž‘αŸ…αžœαž·αž‰ αžœαžΆαž”αž„αŸ’αž€αžΎαžαž”αž‰αŸ’αž‡αžΈαž“αŸƒαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž˜αž»αž“αž–αŸαž›αžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ” αž’αŸ’αž“αž€β€‹αž’αžΆαž…β€‹αž˜αžΎαž›β€‹αž€αžΆαžšβ€‹αž•αŸ’αž›αžΆαžŸαŸ‹β€‹αž”αŸ’αžαžΌβ€‹αžšβ€‹αž“αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αž…αŸ†αžŽαž»αž…β€‹αž”αŸ’αžšαž‘αžΆαž€αŸ‹β€‹αž€αž»αž„αžŸαžΌαž› aws αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž…αž„αŸ‹αž’αŸ’αžœαžΎαž’αŸ’αžœαžΈαŸ—αž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž’αŸ’αžœαžΎαž”αžΆαž“αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž· αžŸαžΌαž˜αž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž–αž½αž€αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„ CLIαŸ–

# this command is presented only for demonstrational purposes.
# the real command should take pagination into account
aws cloudformation describe-change-set 
    --change-set-name "$changeset_id" 
    --query 'Changes[*].ResourceChange.{Action:Action,Resource:ResourceType,ResourceId:LogicalResourceId,ReplacementNeeded:Replacement}' 
    --output table

αž–αžΆαž€αŸ’αž™β€‹αž”αž‰αŸ’αž‡αžΆβ€‹αž“αŸαŸ‡β€‹αž‚αž½αžšβ€‹αžαŸ‚β€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž›αž‘αŸ’αž’αž•αž›β€‹αžŸαŸ’αžšαžŠαŸ€αž„β€‹αž‚αŸ’αž“αžΆβ€‹αž“αžΉαž„β€‹αžŠαžΌαž…β€‹αžαžΆαž„β€‹αž€αŸ’αžšαŸ„αž˜αŸ–

--------------------------------------------------------------------
|                         DescribeChangeSet                        |
+---------+--------------------+----------------------+------------+
| Action  | ReplacementNeeded  |      Resource        | ResourceId |
+---------+--------------------+----------------------+------------+
|  Modify | True               |  AWS::ECS::Cluster   |  MyCluster |
|  Replace| True               |  AWS::RDS::DBInstance|  MyDB      |
|  Add    | None               |  AWS::SNS::Topic     |  MyTopic   |
+---------+--------------------+----------------------+------------+

αž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹αž‡αžΆαž–αž·αžŸαŸαžŸαž…αŸ†αž–αŸ„αŸ‡αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž›αžŸαž€αž˜αŸ’αž˜αž—αžΆαž– αž‡αŸ†αž“αž½αžŸ, Delete αž¬αž€αž“αŸ’αž›αŸ‚αž„αžŽαžΆ αžαŸ’αžšαžΌαžœαž€αžΆαžšαž‡αŸ†αž“αž½αžŸ - αž–αž·αž. αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŠαŸαž‚αŸ’αžšαŸ„αŸ‡αžαŸ’αž“αžΆαž€αŸ‹αž”αŸ†αž•αž»αž αž αžΎαž™αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαž“αžΆαŸ†αž±αŸ’αž™αž”αžΆαžαŸ‹αž”αž„αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αŸ”

αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αž·αž“αž·αžαŸ’αž™ αž–αž½αž€αž‚αŸαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™

aws cloudformation execute-change-set --change-set-name "$changeset_id"

operation_lowercase=$(echo "$OPERATION" | tr '[:upper:]' '[:lower:]')
aws cloudformation wait "stack-${operation_lowercase}-complete" 
    --stack-name "$STACK_NAME"

αž˜αŸαžšαŸ€αž“αž‘αžΈ 2αŸ– αž”αŸ’αžšαžΎαž‚αŸ„αž›αž€αžΆαžšαžŽαŸαž‡αž„αŸ‹ αžŠαžΎαž˜αŸ’αž”αžΈαž€αžΆαžšαž–αžΆαžšαž’αž“αž’αžΆαž“αžšαžŠαŸ’αž‹αž–αžΈαž€αžΆαžšαž‡αŸ†αž“αž½αžŸ αž¬αžŠαž€αž…αŸαž‰

αž–αŸαž›αžαŸ’αž›αŸ‡αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž˜αžΎαž›αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‚αžΊαž˜αž·αž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αž‘αŸαŸ” αž™αžΎαž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‚αŸ’αž“αžΆαž‡αžΆαž˜αž“αž»αžŸαŸ’αžŸ αž αžΎαž™αž™αžΎαž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‚αŸ’αž“αžΆαž˜αžΆαž“αž€αŸ†αž αž»αžŸαŸ” αž˜αž·αž“αž™αžΌαžšαž”αŸ‰αž»αž“αŸ’αž˜αžΆαž“αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž™αžΎαž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš αž˜αž·αžαŸ’αžαžšαž½αž˜αž€αŸ’αžšαž»αž˜αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž€αžΆαžšαž–αž„αŸ’αžšαžΆαž™αžŠαŸ„αž™αž˜αž·αž“αžŠαžΉαž„αžαŸ’αž›αž½αž“ αžŠαŸ‚αž›αž”αžŽαŸ’αžαžΆαž›αž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαž’αžΆαž”αŸ‹αžŠαŸαžαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ” αž˜αž·αž“αž˜αžΆαž“αž’αŸ’αžœαžΈαž’αžΆαž€αŸ’αžšαž€αŸ‹αž€αžΎαžαž‘αžΎαž„αž‘αŸαž–αŸ’αžšαŸ„αŸ‡αžœαžΆαž‡αžΆαž”αžšαž·αž™αžΆαž€αžΆαžŸαžŸαžΆαž€αž›αŸ’αž”αž„αŸ”

αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαžŸαŸ’αž‚αŸ’αžšαžΈαž”αžšαž”αžŸαŸ‹αž™αžΎαž„αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αž”αž‰αŸ’αž‡αžΈαž“αŸƒαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš αž“αž·αž„αžŸαŸ’αž“αžΎαžŸαž»αŸ†αž€αžΆαžšαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž€αŸαžŠαŸ„αž™ αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‡αŸ†αž“αž½αžŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαŸ†αž›αž„ αžŠαŸ„αž™αžŸαžΆαžšαž”αž‰αŸ’αž‡αžΈαž“αŸƒαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž˜αžΆαž“αž‘αŸ†αž αŸ†αž’αŸ†αžŠαŸ‚αž›αžœαžΆαž˜αž·αž“αžŸαž˜αž“αŸ…αž›αžΎαž’αŸαž€αŸ’αžšαž„αŸ‹αŸ” αž αžΎαž™αž…αžΆαž”αŸ‹αžαžΆαŸ†αž„αž–αžΈαž“αŸαŸ‡αž‚αžΊαž‡αžΆαž€αžΆαžšαž’αžΆαž”αŸ‹αžŠαŸαžαž’αž˜αŸ’αž˜αžαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž”αžšαž·αž™αžΆαž€αžΆαžŸαžŸαžΆαž€αž›αŸ’αž”αž„ αžœαžΆαž˜αž·αž“αž˜αžΆαž“αž€αžΆαžšαž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹αž…αŸ’αžšαžΎαž“αž…αŸ†αž–αŸ„αŸ‡αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž“αŸ„αŸ‡αž‘αŸαŸ”

αž˜αžΆαž“αž’αž“αž’αžΆαž“αžŠαŸ‚αž›αž’αŸ’αž“αž€αž˜αž·αž“αž…αž„αŸ‹αž‡αŸ†αž“αž½αžŸ αž¬αžŠαž€αž…αŸαž‰αŸ” αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž‚αžΊαž‡αžΆαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž–αŸαž‰αž›αŸαž‰ αžŠαžΌαž…αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ RDS αž¬αž€αŸ’αžšαž»αž˜αžŸαŸ’αžœαŸ‚αž„αžšαž€αž™αžΊαžαŸ” αžŸαŸ†αžŽαžΆαž„αž›αŸ’αž’ αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž–αž–αž€αž˜αžΆαž“αžœαž·αž’αžΈαžŠαŸ‚αž›αž—αŸ’αž‡αžΆαž”αŸ‹αž˜αž€αž‡αžΆαž˜αž½αž™αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžšαžΏαž„αž“αŸαŸ‡αŸ” αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž αŸ…αžαžΆ αž‚αŸ„αž›αž“αž™αŸ„αž”αžΆαž™αž‡αž„αŸ‹ αž αžΎαž™αž’αŸ’αž“αž€αž’αžΆαž…αž’αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž’αŸ†αž–αžΈαžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„ αž―αž€αžŸαžΆαžš:

STACK_NAME=$1
RESOURCE_ID=$2

POLICY_JSON=$(cat <<EOF
{
    "Statement" : [{
        "Effect" : "Deny",
        "Action" : [
            "Update:Replace",
            "Update:Delete"
        ],
        "Principal": "*",
        "Resource" : "LogicalResourceId/$RESOURCE_ID"
    }]
}
EOF
)

aws cloudformation set-stack-policy --stack-name "$STACK_NAME" 
    --stack-policy-body "$POLICY_JSON"

αž˜αŸαžšαŸ€αž“αž‘αžΈ 3αŸ– αž”αŸ’αžšαžΎ UsePreviousValue αž“αŸ…αž–αŸαž›αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž‡αž„αŸ‹αžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαžŸαž˜αŸ’αž„αžΆαžαŸ‹

αž“αŸ…αž–αŸαž›αž’αŸ’αž“αž€αž”αž„αŸ’αž€αžΎαž RDS mysql entity AWS αžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αž’αŸ’αž“αž€αž•αŸ’αžαž›αŸ‹ MasterUsername αž“αž·αž„ MasterUserPassword αŸ” αžŠαŸ„αž™αžŸαžΆαžšαžœαžΆαž‡αžΆαž€αžΆαžšαž”αŸ’αžšαžŸαžΎαžšαž‡αžΆαž„αž€αž»αŸ†αžšαž€αŸ’αžŸαžΆαž€αžΆαžšαžŸαž˜αŸ’αž„αžΆαžαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαžŠαž”αŸ’αžšαž—αž– αž αžΎαž™αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž’αŸ’αžœαžΎαž’αŸ’αžœαžΈαŸ—αž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž—αžΆαž– αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž’αž“αž»αžœαžαŸ’αž "αž™αž“αŸ’αžαž€αžΆαžšαž†αŸ’αž›αžΆαžαžœαŸƒ" αžŠαŸ‚αž›αž˜αž»αž“αž–αŸαž›αžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž›αž·αžαž·αžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αž‘αž½αž›αž–αžΈ s3 αž αžΎαž™αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž–αŸαžαŸŒαž˜αžΆαž“αžŸαž˜αŸ’αž„αžΆαžαŸ‹αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αžƒαžΎαž‰ αž›αž·αžαž·αžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžαŸ’αž˜αžΈαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαž αž“αž·αž„ αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αŸ’αž“αž»αž„ s3 αŸ”

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž›αž·αžαž·αžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž‡αžΆαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž‘αŸ…αž€αžΆαž“αŸ‹αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž”αž„αŸ’αž€αžΎαž-αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš-αž€αŸ†αžŽαžαŸ‹αž”αž„αŸ’αž€αžΎαžαž–αž–αž€αŸ” αžαžŽαŸˆαž–αŸαž›αž€αŸ†αž–αž»αž„αž–αž·αžŸαŸ„αž’αž“αŸαž‡αžΆαž˜αž½αž™αžŸαŸ’αž‚αŸ’αžšαžΈαž” αžœαžΆαž”αžΆαž“αž€αžΎαžαž‘αžΎαž„αžαžΆαž€αžΆαžšαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ… s3 αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžΆαžαŸ‹αž”αž„αŸ‹ αž αžΎαž™ "αž™αž“αŸ’αžαž€αžΆαžšαž†αŸ’αž›αžΆαžαžœαŸƒ" αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž…αžΆαžαŸ‹αž‘αž»αž€αžœαžΆαž‡αžΆαžŸαž‰αŸ’αž‰αžΆαž˜αž½αž™αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž–αŸαžαŸŒαž˜αžΆαž“αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžαŸ’αž˜αžΈαŸ”

αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžαŸ’αž‰αž»αŸ†αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž”αŸ’αžšαžΎαžŸαŸ’αž‚αŸ’αžšαžΈαž”αž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž•αž›αž·αž αž αžΎαž™αž”αž‰αŸ’αž αžΆαž“αŸƒαž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹αž”αžΆαž“αž€αžΎαžαž‘αžΎαž„αž˜αŸ’αžαž„αž‘αŸ€αž αžœαžΆαž“αžΉαž„αž’αŸ’αžœαžΎαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž—αžΆαž–αž‡αž„αŸ‹αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž›αž·αžαž·αžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžαŸ’αž˜αžΈαŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž–αž·αžŸαŸαžŸαž“αŸαŸ‡αž‚αŸ’αž˜αžΆαž“αž’αŸ’αžœαžΈαž’αžΆαž€αŸ’αžšαž€αŸ‹αž“αžΉαž„αž€αžΎαžαž‘αžΎαž„αž‘αŸαŸ” αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž”αŸ„αŸ‡αž”αž„αŸ‹αž…αŸ„αž›αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž“αŸαŸ‡ αž αžΎαž™αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž”αŸ’αžšαžΎαž˜αž½αž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αž αžŠαŸ„αž™αž•αŸ’αžαž›αŸ‹αž–αŸαžαŸŒαž˜αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽαžαŸ‚αž˜αŸ’αžαž„αž‚αžαŸ‹ - αž“αŸ…αž–αŸαž›αž”αž„αŸ’αž€αžΎαžαž‡αž„αŸ‹αŸ” αž αžΎαž™αž€αŸ’αžšαŸ„αž™αž˜αž€ αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž‡αž„αŸ‹αžαŸ’αžšαžΌαžœαž€αžΆαžšαž€αžΆαžšαž’αžΆαž”αŸ‹αžŠαŸαž αž‡αŸ†αž“αž½αžŸαž±αŸ’αž™αž€αžΆαžšαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžαž˜αŸ’αž›αŸƒαžŸαž˜αŸ’αž„αžΆαžαŸ‹αž“αŸƒαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž”αŸ’αžšαžΎαž™αŸ‰αžΆαž„αžŸαžΆαž˜αž‰αŸ’αž‰ UsePreviousValue=αž–αž·αž:

aws cloudformation create-change-set 
    --change-set-name "$CHANGE_SET_NAME" 
    --stack-name "$STACK_NAME" 
    --template-body "$TPL_PATH" 
    --change-set-type "UPDATE" 
    --parameters "ParameterKey=MasterUserPassword,UsePreviousValue=true"

αž˜αŸαžšαŸ€αž“αž‘αžΈ 4: αž”αŸ’αžšαžΎαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ rollback

αž€αŸ’αžšαž»αž˜αž˜αž½αž™αž‘αŸ€αžαžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž”αžΆαž“αž”αŸ’αžšαžΎαž˜αž»αžαž„αžΆαžš αž–αŸαžαŸŒαž˜αžΆαž“αž–αž–αž€, αž”αžΆαž“αž αŸ… αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ rollback. αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž”αžΆαž“αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αžœαžΆαž–αžΈαž˜αž»αž“αž˜αž€αž‘αŸ αž αžΎαž™αž”αžΆαž“αžŠαžΉαž„αžαžΆαžœαžΆαž“αžΉαž„αž’αŸ’αžœαžΎαž±αŸ’αž™αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‡αž„αŸ‹αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž€αžΆαž“αŸ‹αžαŸ‚αžαŸ’αžšαž‡αžΆαž€αŸ‹αž‡αžΆαž„αž˜αž»αž“αŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž”αŸ’αžšαžΎαžœαžΆαžšαžΆαž›αŸ‹αž–αŸαž›αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž›αŸαžαž€αžΌαžŠαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αž‘αŸ… lambda ឬ ECS αžŠαŸ„αž™αž”αŸ’αžšαžΎ cloudformation αŸ”

αžšαž”αŸ€αž”αžŠαŸ‚αž›αžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš: αž’αŸ’αž“αž€αž”αž‰αŸ’αž‡αžΆαž€αŸ‹ αžŸαŸ†αž‘αŸαž„αžšαŸ„αž‘αž·αŸ CloudWatch αž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš --rollback-αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸ…αž–αŸαž›αž’αŸ’αž“αž€αž”αž„αŸ’αž€αžΎαžαžŸαŸ†αžŽαž»αŸ†αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαŸ” αž€αŸ’αžšαŸ„αž™αž˜αž€ αž“αŸ…αž–αŸαž›αž’αŸ’αž“αž€αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αžŸαŸ†αžŽαž»αŸ†αž“αŸƒαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš αž“αŸ„αŸ‡ aws αžαžΆαž˜αžŠαžΆαž“αžŸαŸ†αž‘αŸαž„αžšαŸ„αž‘αž·αŸαž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹αž˜αž½αž™αž“αžΆαž‘αžΈαŸ” αžœαžΆβ€‹αž”αž„αŸ’αžœαž·αž›β€‹αž€αžΆαžšβ€‹αžŠαžΆαž€αŸ‹β€‹αž±αŸ’αž™β€‹αž”αŸ’αžšαžΎβ€‹αžœαž·αž‰ αž”αŸ’αžšαžŸαž·αž“αž”αžΎβ€‹αž˜αŸ‰αŸ„αž„αžšαŸ„αž‘αŸβ€‹αž”αŸ’αžαžΌαžšβ€‹αžŸαŸ’αžαžΆαž“αž—αžΆαž–β€‹αž‘αŸ… ALARM αž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›β€‹αž“αŸαŸ‡αŸ”

αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αŸαŸ‡αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αžΆαžšαžŠαž€αžŸαŸ’αžšαž„αŸ‹αž‚αŸ†αžšαžΌ αž–αŸαžαŸŒαž˜αžΆαž“αž–αž–αž€αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αž„αŸ’αž€αžΎαž αžŸαŸ†αž‘αŸαž„αžšαŸ„αž‘αž·αŸ cloudwatchαžŠαŸ‚αž›αžαžΆαž˜αžŠαžΆαž“ cloud user metric αž‡αžΆαž…αŸ†αž“αž½αž“αž“αŸƒαž€αŸ†αž αž»αžŸαž€αŸ’αž“αž»αž„ cloud logs (αž˜αŸ‰αŸ‚αžαŸ’αžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαžαžΆαž˜αžšαž™αŸˆ αžαž˜αŸ’αžšαž„αž˜αŸ‰αŸ‚αžαŸ’αžš):

Resources:
  # this metric tracks number of errors in the cloudwatch logs. In this
  # particular case it's assumed logs are in json format and the error logs are
  # identified by level "error". See FilterPattern
  ErrorMetricFilter:
    Type: AWS::Logs::MetricFilter
    Properties:
      LogGroupName: !Ref LogGroup
      FilterPattern: !Sub '{$.level = "error"}'
      MetricTransformations:
      - MetricNamespace: !Sub "${AWS::StackName}-log-errors"
        MetricName: Errors
        MetricValue: 1
        DefaultValue: 0

  ErrorAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmName: !Sub "${AWS::StackName}-errors"
      Namespace: !Sub "${AWS::StackName}-log-errors"
      MetricName: Errors
      Statistic: Maximum
      ComparisonOperator: GreaterThanThreshold
      Period: 1 # 1 minute
      EvaluationPeriods: 1
      Threshold: 0
      TreatMissingData: notBreaching
      ActionsEnabled: yes

αž₯αž‘αžΌαžœαž“αŸαŸ‡ αžŸαŸ†αž‘αŸαž„αžšαŸ„αž‘αŸ αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž‡αžΆ αžœαž·αž›αžαž™αž€αŸ’αžšαŸ„αž™ αž€αŸαŸ‡αž“αŸ…αž–αŸαž›αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž”αŸ’αžšαž’αž”αŸ‹αž§αž”αž€αžšαžŽαŸαŸ–

ALARM_ARN=$1

ROLLBACK_TRIGGER=$(cat <<EOF
{
  "RollbackTriggers": [
    {
      "Arn": "$ALARM_ARN",
      "Type": "AWS::CloudWatch::Alarm"
    }
  ],
  "MonitoringTimeInMinutes": 1
}
EOF
)

aws cloudformation create-change-set 
    --change-set-name "$CHANGE_SET_NAME" 
    --stack-name "$STACK_NAME" 
    --template-body "$TPL_PATH" 
    --change-set-type "UPDATE" 
    --rollback-configuration "$ROLLBACK_TRIGGER"

αž˜αŸαžšαŸ€αž“αž‘αžΈ 5αŸ– αžαŸ’αžšαžΌαžœαž”αŸ’αžšαžΆαž€αžŠαžαžΆαž’αŸ’αž“αž€αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž€αŸ†αžŽαŸ‚αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž”αŸ†αž•αž»αžαž“αŸƒαž‚αŸ†αžšαžΌ

αžœαžΆαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‚αŸ†αžšαžΌαž‘αž˜αŸ’αžšαž„αŸ‹αž–αž–αž€αžŠαŸ‚αž›αž˜αž·αž“αžŸαžΌαžœαž”αŸ’αžšαžΎαž…αž»αž„αž€αŸ’αžšαŸ„αž™αž”αŸ†αž•αž»αž αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αžΆαžšαž’αŸ’αžœαžΎαžŠαžΌαž…αŸ’αž“αŸαŸ‡αž“αžΉαž„αž’αŸ’αžœαžΎαž±αŸ’αž™αžαžΌαž…αžαžΆαžαž…αŸ’αžšαžΎαž“αŸ” αžœαžΆαž”αžΆαž“αž€αžΎαžαž‘αžΎαž„αž…αŸ†αž–αŸ„αŸ‡αž™αžΎαž„αž˜αŸ’αžαž„αŸ– αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž˜αž·αž“αž”αžΆαž“αž‡αŸ†αžšαž»αž‰αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž…αž»αž„αž€αŸ’αžšαŸ„αž™αž”αž„αŸ’αž’αžŸαŸ‹αž–αžΈ Git αž αžΎαž™αž”αžΆαž“αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αŸ†αžŽαŸ‚αž˜αž»αž“αž“αŸƒαž‡αž„αŸ‹αžŠαŸ„αž™αž˜αž·αž“αžŠαžΉαž„αžαŸ’αž›αž½αž“αŸ” αž“αŸαŸ‡αž”αžŽαŸ’αžαžΆαž›αž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαž•αŸ’αž’αžΆαž€αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž”αžΆαž“αž”αŸ’αžšαžΎαž‡αž„αŸ‹αž“αŸαŸ‡αŸ”

αž’αŸ’αžœαžΈαž˜αž½αž™αžŠαŸ‚αž›αžŸαžΆαž˜αž‰αŸ’αž‰αžŠαžΌαž…αž‡αžΆαž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŠαžΎαž˜αŸ’αž”αžΈαž˜αžΎαž›αžαžΆαžαžΎαžŸαžΆαžαžΆαž˜αžΆαž“αž—αžΆαž–αž‘αžΆαž“αŸ‹αžŸαž˜αŸαž™αž˜αž»αž“αž“αžΉαž„αž’αŸ’αžœαžΎαžœαžΆαž”αžΆαž“αž›αŸ’αž’αžŠαŸ‚αžšαž¬αž‘αŸ (αžŸαž“αŸ’αž˜αžαŸ‹αžαžΆ git αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž€αŸ†αžŽαŸ‚αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€)αŸ–

git fetch
HEADHASH=$(git rev-parse HEAD)
UPSTREAMHASH=$(git rev-parse master@{upstream})

if [[ "$HEADHASH" != "$UPSTREAMHASH" ]] ; then
   echo "Branch is not up to date with origin. Aborting"
   exit 1
fi

αž˜αŸαžšαŸ€αž“αž‘αžΈαŸ¦αŸ– αž€αž»αŸ†αž”αž„αŸ’αž€αžΎαžαž€αž„αŸ‹αž‘αžΎαž„αžœαž·αž‰

αžœαžΆαž’αžΆαž…αž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž‡αžΆαž˜αž½αž™ αž–αŸαžαŸŒαž˜αžΆαž“αž–αž–αž€ - αžœαžΆβ€‹αž„αžΆαž™αžŸαŸ’αžšαž½αž›αŸ” αž’αŸ’αž“αž€αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžαŸ’αžšαžΌαžœαž€αžΆαžšαžŸαŸ’αž‚αŸ’αžšαžΈαž” bash αž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαŸ‚αž›αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ aws cli αŸ”

αž€αžΆαž›αž–αžΈ 4 αž†αŸ’αž“αžΆαŸ†αž˜αž»αž“ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‡αžΆαž˜αž½αž™ scripts αžŸαžΆαž˜αž‰αŸ’αž‰αž αŸ…αžαžΆ aws cloudformation create-stack commandαŸ” αž˜αž·αž“αž™αžΌαžšαž”αŸ‰αž»αž“αŸ’αž˜αžΆαž“αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž˜αž·αž“αžŸαžΆαž˜αž‰αŸ’αž‰αž‘αŸ€αžαž‘αŸαŸ” αž˜αŸαžšαŸ€αž“αž“αžΈαž˜αž½αž™αŸ—αžŠαŸ‚αž›αžšαŸ€αž“αž”αžΆαž“αž’αŸ’αžœαžΎαž±αŸ’αž™αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž€αžΆαž“αŸ‹αžαŸ‚αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αŸ” αžœαžΆβ€‹αž˜αž·αž“β€‹αžαŸ’αžšαžΉαž˜β€‹αžαŸ‚β€‹αž–αž·αž”αžΆαž€β€‹αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡β€‹αž‘αŸ αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αž€αŸβ€‹αž–αŸ„αžšαž–αŸαž‰β€‹αž‘αŸ…β€‹αžŠαŸ„αž™β€‹αž€αŸ†αž αž»αžŸβ€‹αžŠαŸ‚αžšαŸ”

αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αžαŸ’αž‰αž»αŸ†αž’αŸ’αžœαžΎαž€αžΆαžšαž“αŸ…αž•αŸ’αž“αŸ‚αž€ IT αžαžΌαž…αž˜αž½αž™αŸ” αž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αžαžΆαž€αŸ’αžšαž»αž˜αž“αžΈαž˜αž½αž™αŸ—αž˜αžΆαž“αžœαž·αž’αžΈαž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž”αžŽαŸ’αžαž»αŸ†αž”αž„αŸ’αž€αžΎαžαž–αž–αž€αŸ” αž αžΎαž™αž“αŸ„αŸ‡αž‡αžΆαžšαžΏαž„αž’αžΆαž€αŸ’αžšαž€αŸ‹αŸ” αžœαžΆβ€‹αž“αžΉαž„β€‹αž›αŸ’αž’β€‹αž‡αžΆαž„β€‹αž”αŸ’αžšαžŸαž·αž“β€‹αž”αžΎβ€‹αž’αŸ’αž“αž€β€‹αžšαžΆαž›αŸ‹β€‹αž‚αŸ’αž“αžΆβ€‹αž”αžΆαž“β€‹αž”αŸ’αžšαžΎβ€‹αžœαž·αž’αžΈβ€‹αžŠαžΌαž…β€‹αž‚αŸ’αž“αžΆαŸ” αž‡αžΆαžŸαŸ†αžŽαžΆαž„αž›αŸ’αž’ αž˜αžΆαž“αž§αž”αž€αžšαžŽαŸαž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαŸ‚αž›αž’αžΆαž…αžšαž€αž”αžΆαž“αžŠαžΎαž˜αŸ’αž”αžΈαž‡αž½αž™αž’αŸ’αž“αž€αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ αž“αž·αž„αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž”αžŽαŸ’αžαž»αŸ†αž”αž„αŸ’αž€αžΎαžαž–αž–αž€αŸ”

αž˜αŸαžšαŸ€αž“αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž“αžΉαž„αž‡αž½αž™αž’αŸ’αž“αž€αž‡αŸ€αžŸαžœαžΆαž„αž€αŸ†αž αž»αžŸαŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹