рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреВрд░реЗ рдЬреАрд╡рди рдореЗрдВ рдХреНрд▓рд╛рдЙрдбрдлреЙрд░реНрдореЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдпреЗ 6 рд╕рдмрдХ рд╕реАрдЦреЗред

рдореИрдВрдиреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдмрд╛рджрд▓ рдЫрд╛рдирд╛ 4 рд╕рд╛рд▓ рдкрд╣рд▓реЗред рддрдм рд╕реЗ рдореИрдВрдиреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдБрдЪреЗ рддреЛрдбрд╝ рджрд┐рдП рд╣реИрдВ, рдпрд╣рд╛рдБ рддрдХ рдХрд┐ рд╡реЗ рднреА рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдереЗред рд▓реЗрдХрд┐рди рд╣рд░ рдмрд╛рд░ рдЬрдм рдореИрдВрдиреЗ рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рдХреА рддреЛ рдореИрдВрдиреЗ рдХреБрдЫ рдирдпрд╛ рд╕реАрдЦрд╛ред рдЗрд╕ рдЕрдиреБрднрд╡ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдореИрдВ рд╕реАрдЦреЗ рдЧрдП рдХреБрдЫ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдмрдХ рд╕рд╛рдЭрд╛ рдХрд░реВрдВрдЧрд╛ред

рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреВрд░реЗ рдЬреАрд╡рди рдореЗрдВ рдХреНрд▓рд╛рдЙрдбрдлреЙрд░реНрдореЗрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдпреЗ 6 рд╕рдмрдХ рд╕реАрдЦреЗред

рдкрд╛рда 1: рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдирдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ

рдореЗрд░реЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╣реА рдореИрдВрдиреЗ рдпрд╣ рд╕рдмрдХ рд╕реАрдЦ рд▓рд┐рдпрд╛ рдмрд╛рджрд▓ рдЫрд╛рдирд╛. рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рддрдм рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рддреЛрдбрд╝рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рдЬрд░реВрд░ рдпрд╛рдж рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХрдорд╛рдВрдб рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдерд╛ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рдХреНрд▓рд╛рдЙрдбрдлреЙрд░реНрдореЗрд╢рди рдЕрдкрдбреЗрдЯ. рдпрд╣ рдЖрджреЗрд╢ рддреИрдирд╛рдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЗ рдмрд┐рдирд╛ рд╣реА рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд░реЛрд▓ рдЖрдЙрдЯ рдХрд░ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХрд┐рд╕реА рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдирдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдмрд╛рдж, рдореИрдВ рддреБрд░рдВрдд рдмрджрд▓ рдЧрдпрд╛ рддреИрдирд╛рддреА рдкрд╛рдЗрдкрд▓рд╛рдЗрди, рдЕрдкрдбреЗрдЯ рдХрдорд╛рдВрдб рдХреЛ рдХрдорд╛рдВрдб рд╕реЗ рдмрджрд▓рдирд╛ рд╕реГрдЬрди-рдкрд░рд┐рд╡рд░реНрддрди-рд╕реЗрдЯ

# 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"

рдПрдХ рдмрд╛рд░ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗрдЯ рдмрди рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдореМрдЬреВрджрд╛ рд╕реНрдЯреИрдХ рдкрд░ рдЗрд╕рдХрд╛ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИред рдЕрдкрдбреЗрдЯ рдХрдорд╛рдВрдб рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЪреЗрдВрдЬрд╕реЗрдЯ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддреИрдирд╛рддреА рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рдЙрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рдирдХреА рдЖрдк рддреИрдирд╛рддреА рд╕реЗ рдкрд╣рд▓реЗ рд╕рдореАрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рдХрдВрд╕реЛрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЕрдкрдиреА рд╣рд░ рдЪреАрдЬрд╝ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рд╕реАрдПрд▓рдЖрдИ рдореЗрдВ рдЬрд╛рдВрдЪреЗрдВ:

# 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   |
+---------+--------------------+----------------------+------------+

рдЬрд╣рд╛рдВ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╣реЛ рд╡рд╣рд╛рдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдкрд░ рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджреЗрдВ рдмрджрд▓реЗрдВ, рдорд┐рдЯрд╛рдирд╛ рдпрд╛ рдЬрд╣рд╛рдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ - рд╕рддреНрдп. рдпреЗ рд╕рдмрд╕реЗ рдЦрддрд░рдирд╛рдХ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИрдВ рдФрд░ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдиреБрдХрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИред

рдПрдХ рдмрд╛рд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд╕рдореАрдХреНрд╖рд╛ рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдиреНрд╣реЗрдВ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

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: рд╕реНрдЯреЗрдЯрдлреБрд▓ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдпрд╛ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдХ рдиреАрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдХрднреА-рдХрднреА рдХреЗрд╡рд▓ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рд╣реА рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ред рд╣рдо рд╕рднреА рдЗрдВрд╕рд╛рди рд╣реИрдВ рдФрд░ рд╣рдо рд╕рднреА рдЧрд▓рддрд┐рдпрд╛рдБ рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЪреЗрдВрдЬрд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рд╣реА рд╕рдордп рдмрд╛рдж, рдореЗрд░реА рдЯреАрдо рдХреЗ рд╕рд╛рдереА рдиреЗ рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рдПрдХ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХрд┐рдпрд╛ рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдбреЗрдЯрд╛рдмреЗрд╕ рдЕрдкрдбреЗрдЯ рд╣реБрдЖред рдХреБрдЫ рднреА рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдорд╛рд╣реМрд▓ рдерд╛ред

рднрд▓реЗ рд╣реА рд╣рдорд╛рд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдиреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдФрд░ рдкреБрд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛, рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд╕реВрдЪреА рдЗрддрдиреА рдмрдбрд╝реА рдереА рдХрд┐ рдпрд╣ рд╕реНрдХреНрд░реАрди рдкрд░ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реБрдИред рдФрд░ рдЪреВрдБрдХрд┐ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рд╡реЗрд╢ рдореЗрдВ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЕрджреНрдпрддрди рдерд╛, рдЗрд╕рд▓рд┐рдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдкрд░ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ред

рдРрд╕реЗ рд╕рдВрд╕рд╛рдзрди рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдХрднреА рднреА рдмрджрд▓рдирд╛ рдпрд╛ рд╣рдЯрд╛рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗред рдпреЗ рд╕реНрдЯреЗрдЯрдлреБрд▓ рд╕реЗрд╡рд╛рдПрдВ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЖрд░рдбреАрдПрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдпрд╛ рдЗрд▓рд╛рд╕реНрдЯрд┐рдХреНрд╕рд░реНрдЪ рдХреНрд▓рд╕реНрдЯрд░ рдЗрддреНрдпрд╛рджрд┐ред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рддреИрдирд╛рддреА рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░ рджреЗрдЧрд╛ рдпрджрд┐ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдРрд╕реЗ рд╕рдВрд╕рд╛рдзрди рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдХреНрд▓рд╛рдЙрдбрдлреЙрд░реНрдореЗрд╢рди рдХреЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рддрд░реАрдХрд╛ рд╣реИред рдЗрд╕реЗ рд╕реНрдЯреИрдХ рдиреАрддрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдкреНрд░рд▓реЗрдЦрди:

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 рдЗрдХрд╛рдИ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ AWS рдХреЛ рдЖрдкрдХреЛ рдПрдХ рдорд╛рд╕реНрдЯрд░ рдпреВрдЬрд╝рд░рдиреЗрдо рдФрд░ рдорд╛рд╕реНрдЯрд░ рдпреВрдЬрд╝рд░ рдкрд╛рд╕рд╡рд░реНрдб рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЪреВрдВрдХрд┐ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рд░рд╣рд╕реНрдп рди рд░рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИ рдФрд░ рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдм рдХреБрдЫ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ "рд╕реНрдорд╛рд░реНрдЯ рддрдВрддреНрд░" рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╣рд╛рдВ рддреИрдирд╛рддреА рд╕реЗ рдкрд╣рд▓реЗ рдПрд╕ 3 рд╕реЗ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рдФрд░ рдпрджрд┐ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдирд╣реАрдВ рдорд┐рд▓рддреЗ рд╣реИрдВ, рддреЛ рдирдП рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ s3 рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрддред

рдлрд┐рд░ рдЗрди рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдХреЛ рдХреНрд▓рд╛рдЙрдбрдлреЙрд░реНрдореЗрд╢рди рдХреНрд░рд┐рдПрдЯ-рдЪреЗрдВрдЬ-рд╕реЗрдЯ рдХрдорд╛рдВрдб рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдРрд╕рд╛ рд╣реБрдЖ рдХрд┐ s3 рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдЯреВрдЯ рдЧрдпрд╛, рдФрд░ рдореЗрд░реЗ "рд╕реНрдорд╛рд░реНрдЯ рддрдВрддреНрд░" рдиреЗ рдЗрд╕реЗ рдирдИ рд╕рд╛рдЦ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрдд рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ред

рдпрджрд┐ рдореИрдВрдиреЗ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдФрд░ рдХрдиреЗрдХреНрд╢рди рд╕рдорд╕реНрдпрд╛ рдлрд┐рд░ рд╕реЗ рд╣реБрдИ, рддреЛ рдпрд╣ рд╕реНрдЯреИрдХ рдХреЛ рдирдП рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдХреЗ рд╕рд╛рде рдЕрдкрдбреЗрдЯ рдХрд░ рджреЗрдЧрд╛ред рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреБрдЫ рднреА рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛. рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВрдиреЗ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдФрд░ рджреВрд╕рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛, рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ - рд╕реНрдЯреИрдХ рдмрдирд╛рддреЗ рд╕рдордпред рдФрд░ рдмрд╛рдж рдореЗрдВ, рдЬрдм рд╕реНрдЯреИрдХ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рддреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдЧреБрдкреНрдд рдорд╛рди рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ рдмрд╕ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ рдкрд┐рдЫрд▓рд╛ рдореВрд▓реНрдп = рд╕рддреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

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: рд░реЛрд▓рдмреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдЬрд┐рд╕ рдЕрдиреНрдп рдЯреАрдо рдХреЗ рд╕рд╛рде рдореИрдВрдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛, рдЙрд╕рдиреЗ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдмрд╛рджрд▓ рдЫрд╛рдирд╛рдмреБрд▓рд╛рдпрд╛ рд░реЛрд▓рдмреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди. рдореИрдВ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрднреА рдирд╣реАрдВ рдорд┐рд▓рд╛ рдерд╛ рдФрд░ рдореБрдЭреЗ рддреБрд░рдВрдд рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рдвреЗрд░реЛрдВ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЛ рдФрд░ рднреА рдмреЗрд╣рддрд░ рдмрдирд╛ рджреЗрдЧрд╛ред рдЕрдм рдЬрдм рднреА рдореИрдВ рдХреНрд▓рд╛рдЙрдбрдлреЙрд░реНрдореЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реИрдореНрдмреНрдбрд╛ рдпрд╛ рдИрд╕реАрдПрд╕ рдкрд░ рдЕрдкрдирд╛ рдХреЛрдб рддреИрдирд╛рдд рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред

рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рдЖрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ рдХреНрд▓рд╛рдЙрдбрд╡реЙрдЪ рдЕрд▓рд╛рд░реНрдо рдЕрд░реНрди рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ --рд░реЛрд▓рдмреИрдХ-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рдирдЬрдм рдЖрдк рдХреЛрдИ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ. рдмрд╛рдж рдореЗрдВ, рдЬрдм рдЖрдк рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдорд┐рдирдЯ рдХреЗ рд▓рд┐рдП рдЕрд▓рд╛рд░реНрдо рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЗрд╕ рджреМрд░рд╛рди рдЕрд▓рд╛рд░реНрдо рдХреА рд╕реНрдерд┐рддрд┐ рдЕрд▓рд╛рд░реНрдо рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреА рд╣реИ рддреЛ рдпрд╣ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреЛ рд╡рд╛рдкрд╕ рд▓реЗ рд▓реЗрддрд╛ рд╣реИред

рдиреАрдЪреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЕрдВрд╢ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдмрд╛рджрд▓ рдЫрд╛рдирд╛рдЬрд┐рд╕рдореЗрдВ рдореИрдВ рдмрдирд╛рддрд╛ рд╣реВрдВ рдХреНрд▓рд╛рдЙрдбрд╡реЙрдЪ рдЕрд▓рд╛рд░реНрдо, рдЬреЛ рдХреНрд▓рд╛рдЙрдб рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореАрдЯреНрд░рд┐рдХ рдХреЛ рдХреНрд▓рд╛рдЙрдб рд▓реЙрдЧ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИ (рдореАрдЯреНрд░рд┐рдХ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ)ред рдореЗрдЯреНрд░рд┐рдХрдлрд╝рд┐рд▓реНрдЯрд░):

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

рдкрд╛рда 6: рдкрд╣рд┐рдпреЗ рдХрд╛ рджреЛрдмрд╛рд░рд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рди рдХрд░реЗрдВ

рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдЗрд╕реЗ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдмрд╛рджрд▓ рдЫрд╛рдирд╛ - рдпрд╣ рдЖрд╕рд╛рди рд╣реИред рдЖрдкрдХреЛ рдмрд╕ рдПрдбрдмреНрд▓реВрдПрд╕ рд╕реАрдПрд▓рдЖрдИ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдмреИрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рдЪрд╛рд╣рд┐рдПред

4 рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рд╕рд░рд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рд╢реБрд░реБрдЖрдд рдХреА рдереА рдЬрд┐рд╕реЗ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рдХреНрд▓рд╛рдЙрдбрдлреЙрд░реНрдореЗрд╢рди рдХреНрд░рд┐рдПрдЯ-рд╕реНрдЯреИрдХ рдХрдорд╛рдВрдб рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛ред рдЬрд▓реНрдж рд╣реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд░рд▓ рдирд╣реАрдВ рд░рд╣ рдЧрдИред рд╕реАрдЦреЗ рдЧрдП рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рда рдиреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрдирд╛ рджрд┐рдпрд╛ред рдпрд╣ рди рдХреЗрд╡рд▓ рдХрдард┐рди рдерд╛, рдмрд▓реНрдХрд┐ рдмрдЧреНрд╕ рд╕реЗ рднреА рднрд░рд╛ рд╣реБрдЖ рдерд╛ред

рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдПрдХ рдЫреЛрдЯреЗ рдЖрдИрдЯреА рд╡рд┐рднрд╛рдЧ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВред рдЕрдиреБрднрд╡ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЯреАрдо рдХреЗ рдкрд╛рд╕ рдХреНрд▓рд╛рдЙрдбрдлреЙрд░реНрдореЗрд╢рди рд╕реНрдЯреИрдХ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХрд╛ рдЕрдкрдирд╛ рддрд░реАрдХрд╛ рд╣реИред рдФрд░ рдпрд╣ рдмреБрд░рд╛ рд╣реИ. рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рднреА рд▓реЛрдЧ рдПрдХ рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдкрдирд╛рдПрдВред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдХреНрд▓рд╛рдЙрдбрдлреЙрд░реНрдореЗрд╢рди рд╕реНрдЯреИрдХ рдХреЛ рддреИрдирд╛рдд рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдореЗрдВ рдЖрдкрдХреА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдХрдИ рдЙрдкрдХрд░рдг рдЙрдкрд▓рдмреНрдз рд╣реИрдВред

рдпреЗ рдкрд╛рда рдЖрдкрдХреЛ рдЧрд▓рддрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ