рдореИрд▓реЗ рдореЗрд░реЛ рдмрд╛рдБрдХреА рдЬреАрд╡рдирдХреЛ рд▓рд╛рдЧрд┐ рдХреНрд▓рд╛рдЙрдбрдлрд░реНрдореЗрд╕рдирдХреЛ рд╕рд╛рде рдХрд╛рдо рдЧрд░реНрдиреЗ рдпреА 6 рдкрд╛рдард╣рд░реВ рд╕рд┐рдХреЗрдВред

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

рдореИрд▓реЗ рдореЗрд░реЛ рдмрд╛рдБрдХреА рдЬреАрд╡рдирдХреЛ рд▓рд╛рдЧрд┐ рдХреНрд▓рд╛рдЙрдбрдлрд░реНрдореЗрд╕рдирдХреЛ рд╕рд╛рде рдХрд╛рдо рдЧрд░реНрдиреЗ рдпреА 6 рдкрд╛рдард╣рд░реВ рд╕рд┐рдХреЗрдВред

рдкрд╛рда 1: рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБ рдЕрдШрд┐ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрдиреБрд╣реЛрд╕реН

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

рдпреЛ рдЕрд╕рдлрд▓рддрд╛ рдкрдЫрд┐, рдо рддреБрд░реБрдиреНрддреИ рдкрд░рд┐рд╡рд░реНрддрди рднрдпреЛ рддреИрдирд╛рддреА рдкрд╛рдЗрдкрд▓рд╛рдЗрди, рдХрдорд╛рдгреНрдбрдХреЛ рд╕рд╛рде рдЕрдкрдбреЗрдЯ рдЖрджреЗрд╢ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЧрд░реНрджреИ рд╕рд┐рд░реНрдЬрдирд╛-рдкрд░рд┐рд╡рд░реНрддрди-рд╕реЗрдЯ

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

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

рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рд╕рдореАрдХреНрд╖рд╛ рдЧрд░рд┐рд╕рдХреЗрдкрдЫрд┐, рддрд┐рдиреАрд╣рд░реВ рддреИрдирд╛рдд рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ

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"

рдкрд╛рда реи: рд╕реНрдЯреЗрдЯрдлреБрд▓ рд╕реНрд░реЛрддрд╣рд░реВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╡рд╛ рд╣рдЯрд╛рдЙрдирдмрд╛рдЯ рд░реЛрдХреНрди рд╕реНрдЯреНрдпрд╛рдХ рдиреАрддрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН

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

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

рддреНрдпрд╣рд╛рдБ рд╕реНрд░реЛрддрд╣рд░реВ рдЫрдиреН рдЬреБрди рддрдкрд╛рдИрдВ рдХрд╣рд┐рд▓реНрдпреИ рдмрджрд▓реНрди рд╡рд╛ рд╣рдЯрд╛рдЙрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдиред рдпреА рд╕реНрдЯреЗрдЯрдлреБрд▓ рд╕реЗрд╡рд╛рд╣рд░реВ рд╣реБрдиреН, рдЬрд╕реНрддреИ RDS рдбрд╛рдЯрд╛рдмреЗрд╕ рдЙрджрд╛рд╣рд░рдг рд╡рд╛ рдЗрд▓рд╛рд╕реНрдЯрд┐рдХрд╕рд░реНрдЪ рдХреНрд▓рд╕реНрдЯрд░, рдЗрддреНрдпрд╛рджрд┐ред рдпреЛ рд░рд╛рдореНрд░реЛ рд╣реБрдиреЗрдЫ рдпрджрд┐ aws рд▓реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдбрд┐рдкреНрд▓реЛрдпрдореЗрдиреНрдЯ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реНрдпреЛ рднрдиреЗ рдпрджрд┐ рд╕рдЮреНрдЪрд╛рд▓рди рднрдЗрд░рд╣реЗрдХреЛ рдЫ рднрдиреЗ рддреНрдпрд╕реНрддреЛ рд╕реНрд░реЛрдд рдореЗрдЯрд╛рдЙрди рдЖрд╡рд╢реНрдпрдХ рдЫред рд╕реМрднрд╛рдЧреНрдп рджреЗрдЦрд┐, рдХреНрд▓рд╛рдЙрдбрдлрд░реНрдореЗрд╕рдирд╕рдБрдЧ рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдирд┐рд░реНрдорд┐рдд рддрд░рд┐рдХрд╛ рдЫред рдпрд╕рд▓рд╛рдИ рд╕реНрдЯреНрдпрд╛рдХ рдиреАрддрд┐ рднрдирд┐рдиреНрдЫ, рд░ рддрдкрд╛рдИрдВ рдпрд╕рдХреЛ рдмрд╛рд░реЗрдорд╛ рдердк рдкрдвреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдХрд╛рдЧрдЬрд╛рдд:

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"

рдкрд╛рда рей: рдЧреЛрдкреНрдп рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВрдХреЛ рд╕рд╛рде рд╕реНрдЯреНрдпрд╛рдХ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рдЧрд░реНрджрд╛ UsePreviousValue рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН

рддрдкрд╛рдИрдВрд▓реЗ RDS mysql рдПрдХрд╛рдЗ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджрд╛, AWS рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ MasterUsername рд░ MasterUserPassword рдЙрдкрд▓рдмреНрдз рдЧрд░рд╛рдЙрдиреБрдкрд░реНрдЫред рд╕реНрд░реЛрдд рдХреЛрдбрдорд╛ рдЧреЛрдкреНрдп рдХреБрд░рд╛рд╣рд░реВ рдирд░рд╛рдЦреНрдиреБ рд░рд╛рдореНрд░реЛ рднрдПрдХреЛрд▓реЗ рд░ рдо рд╕рдмреИ рдХреБрд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдереЗрдБ, рдореИрд▓реЗ "рд╕реНрдорд╛рд░реНрдЯ рдореЗрдХрд╛рдирд┐рдЬреНрдо" рд▓рд╛рдЧреВ рдЧрд░реЗрдВ рдЬрд╣рд╛рдБ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдЕрдШрд┐ рдкреНрд░рдорд╛рдгрд╣рд░реВ s3 рдмрд╛рдЯ рдкреНрд░рд╛рдкреНрдд рд╣реБрдиреЗрдЫрдиреН, рд░ рдпрджрд┐ рдкреНрд░рдорд╛рдгрд╣рд░реВ рдлреЗрд▓рд╛ рдкрд░реЗрдирдиреН рднрдиреЗ, рдирдпрд╛рдБ рдкреНрд░рдорд╛рдгрд╣рд░реВ рдЙрддреНрдкрдиреНрди рд╣реБрдиреНрдЫрдиреН рд░ s3 рдорд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░рд┐рдПрдХреЛ рдЫред

рдпреА рдкреНрд░рдорд╛рдгрд╣рд░реВ рддреНрдпрд╕рдкрдЫрд┐ рдХреНрд▓рд╛рдЙрдбрдлрд░реНрдореЗрд╕рди рд╕рд┐рд░реНрдЬрдирд╛-рдкрд░рд┐рд╡рд░реНрддрди-рд╕реЗрдЯ рдЖрджреЗрд╢рдорд╛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВрдХреЛ рд░реВрдкрдорд╛ рдкрд╛рд╕ рдЧрд░рд┐рдиреЗрдЫред рд╕реНрдХреНрд░рд┐рдкреНрдЯрдХреЛ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрд╛, рдпреЛ рднрдпреЛ рдХрд┐ s3 рдорд╛ рдЬрдбрд╛рди рд╣рд░рд╛рдПрдХреЛ рдерд┐рдпреЛ, рд░ рдореЗрд░реЛ "рд╕реНрдорд╛рд░реНрдЯ рдореЗрдХрд╛рдирд┐рдЬреНрдо" рд▓реЗ рдпрд╕рд▓рд╛рдИ рдирдпрд╛рдБ рдкреНрд░рдорд╛рдгрд╣рд░реВ рдЙрддреНрдкрдиреНрди рдЧрд░реНрди рд╕рдВрдХреЗрддрдХреЛ рд░реВрдкрдорд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЧрд░реНрдпреЛред

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

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"

рдкрд╛рда рек: рд░реЛрд▓рдмреНрдпрд╛рдХ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН

рдореИрд▓реЗ рдХрд╛рдо рдЧрд░реЗрдХреЛ рдЕрд░реНрдХреЛ рдЯреЛрд▓реАрд▓реЗ рдкреНрд░рдХрд╛рд░реНрдп рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдпреЛ рдХреНрд▓рд╛рдЙрдбрдлреЙрд░реНрдореЗрд╢рди, рдмреЛрд▓рд╛рдЗрдпреЛ рд░реЛрд▓рдмреНрдпрд╛рдХ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдиред рдореИрд▓реЗ рдкрд╣рд┐рд▓реЗ рдпреЛ рднреЗрдЯреЗрдХреЛ рдерд┐рдЗрдирдБ рд░ рдЪрд╛рдБрдбреИ рдорд╣рд╕реБрд╕ рдЧрд░реЗрдВ рдХрд┐ рдпрд╕рд▓реЗ рдореЗрд░реЛ рд╕реНрдЯреНрдпрд╛рдХрд╣рд░реВ рдердк рдХреВрд▓рд░ рдмрдирд╛рдЙрдБрджрдЫред рдЕрдм рдо рдХреНрд▓рд╛рдЙрдбрдлрд╛рд░реНрдореЗрд╕рди рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ lambda рд╡рд╛ ECS рдорд╛ рдореЗрд░реЛ рдХреЛрдб рдбрд┐рдкреНрд▓реЛрдп рдЧрд░реНрджрд╛ рд╣рд░реЗрдХ рдкрдЯрдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреБред

рдпреЛ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрджрдЫ: рддрдкрд╛рдЗрдБ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН CloudWatch рдЕрд▓рд╛рд░реНрдо рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдорд╛ --рд░реЛрд▓рдмреНрдпрд╛рдХ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдЬрдм рддрдкрд╛рдЗрдБ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫред рдкрдЫрд┐, рдЬрдм рддрдкрд╛рдЗрдБ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВрдХреЛ рд╕реЗрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ, aws рдХрдореНрддрд┐рдорд╛ рдПрдХ рдорд┐рдиреЗрдЯрдХреЛ рд▓рд╛рдЧрд┐ рдЕрд▓рд╛рд░реНрдо рдирд┐рдЧрд░рд╛рдиреА рдЧрд░реНрджрдЫред рдпрджрд┐ рдпреЛ рд╕рдордпрдорд╛ рдЕрд▓рд╛рд░реНрдо рд╕реНрдерд┐рддрд┐рд▓рд╛рдИ ALARM рдорд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдЫ рднрдиреЗ рдпрд╕рд▓реЗ рддреИрдирд╛рддреАрд▓рд╛рдИ рдлрд┐рд░реНрддрд╛ рдЧрд░реНрдЫред

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

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"

рдкрд╛рда рел: рдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрдиреБрд╣реЛрд╕реН рдХрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯрдХреЛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрднрдпреЛ

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

рдкрд╛рда рем: рдкрд╛рдЩреНрдЧреНрд░рд╛рд▓рд╛рдИ рдкреБрди: рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдирдЧрд░реНрдиреБрд╣реЛрд╕реН

рдпреЛ рд╕рдВрдЧ рддреИрдирд╛рддреА рдЬрд╕реНрддреЛ рд▓рд╛рдЧреНрди рд╕рдХреНрдЫ рдХреНрд▓рд╛рдЙрдбрдлреЙрд░реНрдореЗрд╢рди - рд╕рдЬрд┐рд▓реЛ рдЫред рддрдкрд╛рдИрд▓рд╛рдИ рдХреЗрд╡рд▓ aws cli рдЖрджреЗрд╢рд╣рд░реВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдиреЗ bash рд╕реНрдХреНрд░рд┐рдкреНрдЯрд╣рд░реВрдХреЛ рдЧреБрдЪреНрдЫрд╛ рдЪрд╛рд╣рд┐рдиреНрдЫред

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

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

рдпреА рдкрд╛рдард╣рд░реВрд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдЧрд▓реНрддреАрд╣рд░реВрдмрд╛рдЯ рдмрдЪреНрди рдорджреНрджрдд рдЧрд░реНрдиреЗрдЫред

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди