เชฎเซ‡เช‚ เชฎเชพเชฐเชพ เชฌเชพเช•เซ€เชจเชพ เชœเซ€เชตเชจ เชฎเชพเชŸเซ‡ เช•เซเชฒเชพเช‰เชกเชซเซ‹เชฐเซเชฎเซ‡เชถเชจ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพเชจเชพ เช† 6 เชชเชพเช  เชถเซ€เช–เซเชฏเชพ.

เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซเชฏเซเช‚ เช•เซเชฒเชพเช‰เชกเชซเซ‹เชฐเซเชฎเซ‡เชถเชจ 4 เชตเชฐเซเชท เชชเชนเซ‡เชฒเชพ. เชคเซเชฏเชพเชฐเชฅเซ€ เชฎเซ‡เช‚ เช˜เชฃเชพ เชฌเชงเชพ เชˆเชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐ เชคเซ‹เชกเซเชฏเชพ เช›เซ‡, เชคเซ‡ เชชเชฃ เชœเซ‡ เชชเชนเซ‡เชฒเชพเชฅเซ€ เช‰เชคเซเชชเชพเชฆเชจเชฎเชพเช‚ เชนเชคเชพ. เชชเชฐเช‚เชคเซ เชœเซเชฏเชพเชฐเซ‡ เชชเชฃ เชนเซเช‚ เช•เช‚เชˆเช• เช—เชกเชฌเชก เช•เชฐเซเช‚ เช›เซเช‚, เชคเซเชฏเชพเชฐเซ‡ เชนเซเช‚ เช•เช‚เชˆเช• เชจเชตเซเช‚ เชถเซ€เช–เซเชฏเซ‹ เช›เซเช‚. เช† เช…เชจเซเชญเชต เชฆเซเชตเชพเชฐเชพ, เชนเซเช‚ เชถเซ€เช–เซ‡เชฒเชพ เช•เซ‡เชŸเชฒเชพเช• เชธเซŒเชฅเซ€ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เชชเชพเช  เชถเซ‡เชฐ เช•เชฐเซ€เชถ.

เชฎเซ‡เช‚ เชฎเชพเชฐเชพ เชฌเชพเช•เซ€เชจเชพ เชœเซ€เชตเชจ เชฎเชพเชŸเซ‡ เช•เซเชฒเชพเช‰เชกเชซเซ‹เชฐเซเชฎเซ‡เชถเชจ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพเชจเชพ เช† 6 เชชเชพเช  เชถเซ€เช–เซเชฏเชพ.

เชชเชพเช  1: เชคเซ‡เชฎเชจเซ‡ เชœเชฎเชพเชตเชคเชพ เชชเชนเซ‡เชฒเชพ เชซเซ‡เชฐเชซเชพเชฐเซ‹เชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเซ‹

เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซเชฏเชพ เชชเช›เซ€ เชคเชฐเชค เชœ เชฎเซ‡เช‚ เช† เชชเชพเช  เชถเซ€เช–เซเชฏเซ‹ เช•เซเชฒเชพเช‰เชกเชซเซ‹เชฐเซเชฎเซ‡เชถเชจ. เชฎเชจเซ‡ เชฏเชพเชฆ เชจเชฅเซ€ เช•เซ‡ เชฎเซ‡เช‚ เชฌเชฐเชพเชฌเชฐ เชถเซเช‚ เชคเซ‹เชกเซเชฏเซเช‚ เชนเชคเซเช‚, เชชเชฐเช‚เชคเซ เชฎเชจเซ‡ เชšเซ‹เช•เซเช•เชธเชชเชฃเซ‡ เชฏเชพเชฆ เช›เซ‡ เช•เซ‡ เชฎเซ‡เช‚ เช†เชฆเซ‡เชถเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเชฏเซ‹ เชนเชคเซ‹ aws เช•เซเชฒเชพเช‰เชกเชซเซ‹เชฐเซเชฎเซ‡เชถเชจ เช…เชชเชกเซ‡เชŸ. เช† เช†เชฆเซ‡เชถ เชคเซˆเชจเชพเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชจเชพเชฐ เชซเซ‡เชฐเชซเชพเชฐเซ‹เชจเซ€ เช•เซ‹เชˆเชชเชฃ เชฎเชพเชจเซเชฏเชคเชพ เชตเช—เชฐ เชŸเซ‡เชฎเซเชชเชฒเซ‡เชŸเชจเซ‡ เชธเชฐเชณ เชฐเซ€เชคเซ‡ เชฐเซ‹เชฒเช†เช‰เชŸ เช•เชฐเซ‡ เช›เซ‡. เชฎเชจเซ‡ เชจเชฅเซ€ เชฒเชพเช—เชคเซเช‚ เช•เซ‡ เชคเชฎเชพเชฐเซ‡ เชฌเชงเชพ เชซเซ‡เชฐเชซเชพเชฐเซ‹เชจเซ‡ เชœเชฎเชพเชตเชคเชพ เชชเชนเซ‡เชฒเชพ เชถเชพ เชฎเชพเชŸเซ‡ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเชตเซเช‚ เชœเซ‹เชˆเช เชคเซ‡ เชฎเชพเชŸเซ‡ เช•เซ‹เชˆ เชธเชฎเชœเซ‚เชคเซ€เชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

เช† เชจเชฟเชทเซเชซเชณเชคเชพ เชชเช›เซ€, เชนเซเช‚ เชคเชฐเชค เชœ เชฌเชฆเชฒเชพเชˆ เช—เชฏเซ‹ เชœเชฎเชพเชตเชŸ เชชเชพเช‡เชชเชฒเชพเช‡เชจ, เช…เชชเชกเซ‡เชŸ เช†เชฆเซ‡เชถเชจเซ‡ เช†เชฆเซ‡เชถ เชธเชพเชฅเซ‡ เชฌเชฆเชฒเซ€เชจเซ‡ เชฌเชจเชพเชตเซ‹-เชชเชฐเชฟเชตเชฐเซเชคเชจ-เชธเซ‡เชŸ

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

เชชเชพเช  2: เชธเซเชŸเซ‡เชŸเชซเซเชฒ เชธเช‚เชธเชพเชงเชจเซ‹เชจเซ‡ เชฌเชฆเชฒเชตเชพ เช…เชฅเชตเชพ เชฆเซ‚เชฐ เช•เชฐเชตเชพเชฅเซ€ เชฐเซ‹เช•เชตเชพ เชฎเชพเชŸเซ‡ เชธเซเชŸเซ‡เช• เชจเซ€เชคเชฟเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹

เช•เซ‡เชŸเชฒเซ€เช•เชตเชพเชฐ เชซเช•เซเชค เชซเซ‡เชฐเชซเชพเชฐเซ‹ เชœเซ‹เชตเซเช‚ เชชเซ‚เชฐเชคเซเช‚ เชจเชฅเซ€. เช†เชชเชฃเซ‡ เชฌเชงเชพ เชฎเชพเชฃเชธ เช›เซ€เช เช…เชจเซ‡ เช†เชชเชฃเซ‡ เชฌเชงเชพ เชญเซ‚เชฒเซ‹ เช•เชฐเซ€เช เช›เซ€เช. เช…เชฎเซ‡ เชšเซ‡เชจเซเชœเชธเซ‡เชŸเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซเชฏเซเช‚ เชคเซ‡เชจเชพ เชฅเซ‹เชกเชพ เชธเชฎเชฏ เชชเช›เซ€, เชฎเชพเชฐเชพ เชธเชพเชฅเซ€ เช–เซ‡เชฒเชพเชกเซ€เช เช…เชœเชพเชฃเชคเชพเช‚ เชœ เชเช• เชœเชฎเชพเชตเชŸ เช•เชฐเซ€ เชœเซ‡เชจเชพ เชชเชฐเชฟเชฃเชพเชฎเซ‡ เชกเซ‡เชŸเชพเชฌเซ‡เช เช…เชชเชกเซ‡เชŸ เชฅเชฏเซเช‚. เช•เช‚เชˆเชชเชฃ เช–เชฐเชพเชฌ เชฅเชฏเซเช‚ เชจเชฅเซ€ เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡ เชเช• เชชเชฐเซ€เช•เซเชทเชฃ เชตเชพเชคเชพเชตเชฐเชฃ เชนเชคเซเช‚.

เชญเชฒเซ‡ เช…เชฎเชพเชฐเซ€ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ‹เช เชซเซ‡เชฐเชซเชพเชฐเซ‹เชจเซ€ เชธเซ‚เชšเชฟ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เช•เชฐเซ€ เช…เชจเซ‡ เชชเซเชทเซเชŸเชฟ เชฎเชพเชŸเซ‡ เชชเซ‚เช›เซเชฏเซเช‚, เชฌเชฆเชฒเซ‹ เชฌเชฆเชฒเซ‹ เช…เชตเช—เชฃเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เช•เชพเชฐเชฃ เช•เซ‡ เชซเซ‡เชฐเชซเชพเชฐเซ‹เชจเซ€ เชธเซ‚เชšเชฟ เชเชŸเชฒเซ€ เชฎเซ‹เชŸเซ€ เชนเชคเซ€ เช•เซ‡ เชคเซ‡ เชธเซเช•เซเชฐเซ€เชจ เชชเชฐ เชซเชฟเชŸ เชจ เชนเชคเซ€. เช…เชจเซ‡ เชชเชฐเซ€เช•เซเชทเชฃ เชตเชพเชคเชพเชตเชฐเชฃเชฎเชพเช‚ เช† เชเช• เชธเชพเชฎเชพเชจเซเชฏ เช…เชชเชกเซ‡เชŸ เชนเซ‹เชตเชพเชฅเซ€, เชซเซ‡เชฐเชซเชพเชฐเซ‹ เชชเชฐ เชตเชงเซ เชงเซเชฏเชพเชจ เช†เชชเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชจ เชนเชคเซเช‚.

เชเชตเชพ เชธเช‚เชธเชพเชงเชจเซ‹ เช›เซ‡ เชœเซ‡เชจเซ‡ เชคเชฎเซ‡ เช•เซเชฏเชพเชฐเซ‡เชฏ เชฌเชฆเชฒเชตเชพ เช…เชฅเชตเชพ เชฆเซ‚เชฐ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เชคเชพ เชจเชฅเซ€. เช† เชธเซเชŸเซ‡เชŸเชซเซเชฒ เชธเซ‡เชตเชพเช“ เช›เซ‡, เชœเซ‡เชฎ เช•เซ‡ 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"

เชชเชพเช  3: เช—เซเชชเซเชค เชชเชฐเชฟเชฎเชพเชฃเซ‹ เชธเชพเชฅเซ‡ เชธเซเชŸเซ‡เช• เช…เชชเชกเซ‡เชŸ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ UsePreviousValue เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹

เชœเซเชฏเชพเชฐเซ‡ เชคเชฎเซ‡ RDS mysql เชเชจเซเชŸเชฟเชŸเซ€ เชฌเชจเชพเชตเซ‹ เช›เซ‹, เชคเซเชฏเชพเชฐเซ‡ AWS เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเซ‡ MasterUsername เช…เชจเซ‡ MasterUserPassword เชชเซเชฐเชฆเชพเชจ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชธเซเชคเซเชฐเซ‹เชค เช•เซ‹เชกเชฎเชพเช‚ เชฐเชนเชธเซเชฏเซ‹ เชจ เชฐเชพเช–เชตเชพเชจเซเช‚ เชตเชงเซ เชธเชพเชฐเซเช‚ เชนเซ‹เชตเชพเชฅเซ€ เช…เชจเซ‡ เชนเซเช‚ เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เชฌเชงเซเช‚ เชธเซเชตเชšเชพเชฒเชฟเชค เช•เชฐเชตเชพ เชฎเชพเช‚เช—เชคเซ‹ เชนเชคเซ‹, เชฎเซ‡เช‚ เชเช• "เชธเซเชฎเชพเชฐเซเชŸ เชฎเชฟเช•เซ‡เชจเชฟเชเชฎ" เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เซเชฏเซเช‚ เชœเซเชฏเชพเช‚ เชœเชฎเชพเชตเชŸ เชชเชนเซ‡เชฒเชพเช‚ เช“เชณเช–เชชเชคเซเชฐเซ‹ s3 เชฎเชพเช‚เชฅเซ€ เชฎเซ‡เชณเชตเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡, เช…เชจเซ‡ เชœเซ‹ เช“เชณเช–เชชเชคเซเชฐเซ‹ เชจ เชฎเชณเซ‡, เชคเซ‹ เชจเชตเชพ เช“เชณเช–เชชเชคเซเชฐเซ‹ เชœเชจเชฐเซ‡เชŸ เชฅเชพเชฏ เช›เซ‡ เช…เชจเซ‡ s3 เชฎเชพเช‚ เชธเช‚เช—เซเชฐเชนเชฟเชค.

เช† เช“เชณเช–เชชเชคเซเชฐเซ‹ เชชเช›เซ€ เช•เซเชฒเชพเช‰เชกเชซเซ‹เชฐเซเชฎเซ‡เชถเชจ create-change-set เช†เชฆเซ‡เชถเชจเซ‡ เชชเชฐเชฟเชฎเชพเชฃเซ‹ เชคเชฐเซ€เช•เซ‡ เชชเชธเชพเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชธเชพเชฅเซ‡ เชชเซเชฐเชฏเซ‹เช— เช•เชฐเชคเซ€ เชตเช–เชคเซ‡, เชเชตเซเช‚ เชฌเชจเซเชฏเซเช‚ เช•เซ‡ s3 เชธเชพเชฅเซ‡เชจเซเช‚ เชœเซ‹เชกเชพเชฃ เช–เซ‹เชตเชพเชˆ เช—เชฏเซเช‚, เช…เชจเซ‡ เชฎเชพเชฐเซ€ โ€œเชธเซเชฎเชพเชฐเซเชŸ เชฎเชฟเช•เซ‡เชจเชฟเชเชฎโ€ เช เชคเซ‡เชจเซ‡ เชจเชตเชพ เช“เชณเช–เชชเชคเซเชฐเซ‹ เชœเชจเชฐเซ‡เชŸ เช•เชฐเชตเชพเชจเชพ เชธเช‚เช•เซ‡เชค เชคเชฐเซ€เช•เซ‡ เช—เชฃเซ€.

เชœเซ‹ เชฎเซ‡เช‚ เช‰เชคเซเชชเชพเชฆเชจเชฎเชพเช‚ เช† เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซเชฏเซเช‚ เช…เชจเซ‡ เช•เชจเซ‡เช•เซเชถเชจเชจเซ€ เชธเชฎเชธเซเชฏเชพ เชซเชฐเซ€ เช†เชตเซ€, เชคเซ‹ เชคเซ‡ เชจเชตเชพ เช“เชณเช–เชชเชคเซเชฐเซ‹ เชธเชพเชฅเซ‡ เชธเซเชŸเซ‡เช•เชจเซ‡ เช…เชชเชกเซ‡เชŸ เช•เชฐเชถเซ‡. เช† เชšเซ‹เช•เซเช•เชธ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เช•เช‚เชˆเชชเชฃ เช–เชฐเชพเชฌ เชฅเชถเซ‡ เชจเชนเซ€เช‚. เชœเซ‹ เช•เซ‡, เชฎเซ‡เช‚ เช† เช…เชญเชฟเช—เชฎ เช›เซ‹เชกเซ€ เชฆเซ€เชงเซ‹ เช…เชจเซ‡ เชฌเซ€เชœเชพ เชเช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซเช‚ เชถเชฐเซ‚ เช•เชฐเซเชฏเซเช‚, เชฎเชพเชคเซเชฐ เชเช• เชœ เชตเชพเชฐ เช“เชณเช–เชชเชคเซเชฐเซ‹ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซเชฏเชพ - เชœเซเชฏเชพเชฐเซ‡ เชธเซเชŸเซ‡เช• เชฌเชจเชพเชตเชคเซ€ เชตเช–เชคเซ‡. เช…เชจเซ‡ เชชเช›เซ€เชฅเซ€, เชœเซเชฏเชพเชฐเซ‡ เชธเซเชŸเซ‡เช•เชจเซ‡ เช…เชชเชกเซ‡เชŸ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ, เชคเซเชฏเชพเชฐเซ‡ เชชเซ‡เชฐเชพเชฎเซ€เชŸเชฐเชจเชพ เช—เซเชชเซเชค เชฎเซ‚เชฒเซเชฏเชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเชตเชพเชจเซ‡ เชฌเชฆเชฒเซ‡, เชนเซเช‚ เชซเช•เซเชค เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชถ UsePreviousValue=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"

เชชเชพเช  4: เชฐเซ‹เชฒเชฌเซ‡เช• เช—เซ‹เช เชตเชฃเซ€เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹

เชฎเซ‡เช‚ เชœเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเซเชฏเซเช‚ เชนเชคเซเช‚ เชคเซ‡ เช…เชจเซเชฏ เชŸเซ€เชฎเซ‡ เชซเช‚เช•เซเชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเชฏเซ‹ เช•เซเชฒเชพเช‰เชกเชซเซ‹เชฐเซเชฎเซ‡เชถเชจเช•เชนเซ‡เชตเชพเชฏ เช›เซ‡ เชฐเซ‹เชฒเชฌเซ‡เช• เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ. เชนเซเช‚ เชคเซ‡ เชชเชนเซ‡เชฒเชพเช‚ เช†เชตเซเชฏเซ‹ เชจ เชนเชคเซ‹ เช…เชจเซ‡ เชเชกเชชเชฅเซ€ เชธเชฎเชœเชพเชฏเซเช‚ เช•เซ‡ เชคเซ‡ เชฎเชพเชฐเชพ เชธเซเชŸเซ‡เช•เซเชธเชจเซ‡ เชตเชงเซ เช เช‚เชกเซ เชฌเชจเชพเชตเชถเซ‡. เชนเชตเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชชเชฃ เชนเซเช‚ เช•เซเชฒเชพเช‰เชกเชซเซ‹เชฐเซเชฎเซ‡เชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฎเชพเชฐเชพ เช•เซ‹เชกเชจเซ‡ 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"

เชชเชพเช  5: เช–เชพเชคเชฐเซ€ เช•เชฐเซ‹ เช•เซ‡ เชคเชฎเซ‡ เชจเชฎเซ‚เชจเชพเชจเซเช‚ เชจเชตเซ€เชจเชคเชฎ เชธเช‚เชธเซเช•เชฐเชฃ เชœเชฎเชพเชตเซเชฏเซเช‚ เช›เซ‡

เช•เซเชฒเชพเช‰เชกเชซเซ‹เชฐเซเชฎเซ‡เชถเชจ เชŸเซ‡เชฎเซเชชเชฒเซ‡เชŸเชจเซเช‚ เชฒเซ‡เชŸเซ‡เชธเซเชŸ เชตเชฐเซเชเชจ เช•เชฐเชคเชพเช‚ เช“เช›เซเช‚ เชœเชฎเชพเชตเชตเซเช‚ เชธเชฐเชณ เช›เซ‡, เชชเชฐเช‚เชคเซ เช†เชฎ เช•เชฐเชตเชพเชฅเซ€ เช˜เชฃเซเช‚ เชจเซเช•เชธเชพเชจ เชฅเชถเซ‡. เช† เช…เชฎเชพเชฐเซ€ เชธเชพเชฅเซ‡ เชเช•เชตเชพเชฐ เชฅเชฏเซเช‚: เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช เช—เชฟเชŸเชฎเชพเช‚เชฅเซ€ เชจเชตเซ€เชจเชคเชฎ เชซเซ‡เชฐเชซเชพเชฐเซ‹เชจเซ‡ เช†เช—เชณ เชงเชชเชพเชตเซเชฏเซ‹ เชจ เชนเชคเซ‹ เช…เชจเซ‡ เช…เชœเชพเชฃเชคเชพเช‚ เชธเซเชŸเซ‡เช•เชจเชพ เช…เช—เชพเช‰เชจเชพ เชธเช‚เชธเซเช•เชฐเชฃเชจเซ‡ เชœเชฎเชพเชตเซเชฏเซเช‚ เชนเชคเซเช‚. เช†เชจเชพ เชชเชฐเชฟเชฃเชพเชฎเซ‡ เช† เชธเซเชŸเซ‡เช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชคเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชฎเชพเชŸเซ‡ เชกเชพเช‰เชจเชŸเชพเช‡เชฎ เชฅเชฏเซ‹.

เชถเชพเช–เชพเชจเซ‡ เชชเซเชฐเชคเชฟเชฌเชฆเซเชง เช•เชฐเชคเชพ เชชเชนเซ‡เชฒเชพ เชคเซ‡ เช…เชช เชŸเซ เชกเซ‡เชŸ เช›เซ‡ เช•เซ‡ เช•เซ‡เชฎ เชคเซ‡ เชœเซ‹เชตเชพ เชฎเชพเชŸเซ‡ เชšเซ‡เช• เช‰เชฎเซ‡เชฐเชตเชพ เชœเซ‡เชŸเชฒเซเช‚ เชธเชฐเชณ เช›เซ‡ (เช—เชฟเชŸ เชคเชฎเชพเชฐเซเช‚ เชธเช‚เชธเซเช•เชฐเชฃ เชจเชฟเชฏเช‚เชคเซเชฐเชฃ เชธเชพเชงเชจ เช›เซ‡ เชเชฎ เชงเชพเชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช):

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: เชตเซเชนเซ€เชฒเชจเซ‡ เชซเชฐเซ€เชฅเซ€ เชถเซ‹เชงเชถเซ‹ เชจเชนเซ€เช‚

เชธเชพเชฅเซ‡ เชœเชฎเชพเชตเชŸ เช•เชฐเชตเชพ เชœเซ‡เชตเซเช‚ เชฒเชพเช—เซ‡ เช›เซ‡ เช•เซเชฒเชพเช‰เชกเชซเซ‹เชฐเซเชฎเซ‡เชถเชจ - เชคเซ‡ เชธเชฐเชณ เช›เซ‡. เชคเชฎเชพเชฐเซ‡ เชซเช•เซเชค aws cli เช†เชฆเซ‡เชถเซ‹ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ bash เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ‹เชจเชพ เชธเชฎเซ‚เชนเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

4 เชตเชฐเซเชท เชชเชนเซ‡เชฒเชพเช‚ เชฎเซ‡เช‚ aws เช•เซเชฒเชพเช‰เชกเชซเซ‹เชฐเซเชฎเซ‡เชถเชจ เช•เซเชฐเชฟเชเชŸ-เชธเซเชŸเซ…เช• เช•เชฎเชพเชจเซเชก เชคเชฐเซ€เช•เซ‡ เช“เชณเช–เชพเชคเซ€ เชธเชฐเชณ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ‹ เชธเชพเชฅเซ‡ เชถเชฐเซ‚เช†เชค เช•เชฐเซ€ เชนเชคเซ€. เชŸเซ‚เช‚เช• เชธเชฎเชฏเชฎเชพเช‚ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชนเชตเซ‡ เชธเชฐเชณ เชฐเชนเซ€ เชจ เชนเชคเซ€. เชถเซ€เช–เซ‡เชฒเชพ เชฆเชฐเซ‡เช• เชชเชพเช เซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ‡ เชตเชงเซ เชจเซ‡ เชตเชงเซ เชœเชŸเชฟเชฒ เชฌเชจเชพเชตเซ€ เช›เซ‡. เชคเซ‡ เชฎเชพเชคเซเชฐ เชฎเซเชถเซเช•เซ‡เชฒ เชœ เชจเชนเซ€เช‚, เชชเชฃ เชญเซ‚เชฒเซ‹เชฅเซ€ เชญเชฐเซ‡เชฒเซเช‚ เชนเชคเซเช‚.

เชนเซเช‚ เชนเชพเชฒเชฎเชพเช‚ เชเช• เชจเชพเชจเช•เชกเชพ เช†เชˆเชŸเซ€ เชตเชฟเชญเชพเช—เชฎเชพเช‚ เช•เชพเชฎ เช•เชฐเซเช‚ เช›เซเช‚. เช…เชจเซเชญเชต เชฆเชฐเซเชถเชพเชตเซ‡ เช›เซ‡ เช•เซ‡ เชฆเชฐเซ‡เช• เชŸเซ€เชฎ เชชเชพเชธเซ‡ เช•เซเชฒเชพเช‰เชกเชซเซ‹เชฐเซเชฎเซ‡เชถเชจ เชธเซเชŸเซ‡เช•เซเชธ เชœเชฎเชพเชตเชตเชพเชจเซ€ เชชเซ‹เชคเชพเชจเซ€ เชฐเซ€เชค เช›เซ‡. เช…เชจเซ‡ เชคเซ‡ เช–เชฐเชพเชฌ เช›เซ‡. เชฆเชฐเซ‡เช• เชตเซเชฏเช•เซเชคเชฟ เชธเชฎเชพเชจ เช…เชญเชฟเช—เชฎ เช…เชชเชจเชพเชตเซ‡ เชคเซ‹ เชธเชพเชฐเซเช‚ เชฐเชนเซ‡เชถเซ‡. เชธเชฆเชญเชพเช—เซเชฏเซ‡, เช•เซเชฒเชพเช‰เชกเชซเซ‹เชฐเซเชฎเซ‡เชถเชจ เชธเซเชŸเซ‡เช•เซเชธเชจเซ‡ เช—เซ‹เช เชตเชตเชพเชฎเชพเช‚ เช…เชจเซ‡ เช—เซ‹เช เชตเชตเชพเชฎเชพเช‚ เชคเชฎเชพเชฐเซ€ เชธเชนเชพเชฏ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช˜เชฃเชพ เชธเชพเชงเชจเซ‹ เช‰เชชเชฒเชฌเซเชง เช›เซ‡.

เช† เชชเชพเช  เชคเชฎเชจเซ‡ เชญเซ‚เชฒเซ‹ เชŸเชพเชณเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเชถเซ‡.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹