เดŽเดจเตเดฑเต† เดœเต€เดตเดฟเดคเด•เดพเดฒเด‚ เดฎเตเดดเตเดตเตป เด•เตเดฒเต—เดกเตโ€Œเดซเต‹เตผเดฎเต‡เดทเดจเตเดฎเดพเดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดฑเต† เดˆ 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-เตฝ เดธเต‚เด•เตเดทเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต.

เดˆ เด•เตเดฐเต†เดกเตปเดทเตเดฏเดฒเตเด•เตพ เด•เตเดฒเต—เดกเต เดซเต‹เตผเดฎเต‡เดทเตป เด•เตเดฐเดฟเดฏเต‡เดฑเตเดฑเต-เดšเต‡เดžเตเดšเต-เดธเต†เดฑเตเดฑเต เด•เดฎเดพเตปเดกเดฟเดฒเต‡เด•เตเด•เต เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด•เดณเดพเดฏเดฟ เด•เตˆเดฎเดพเดฑเตเด‚. เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเดฐเต€เด•เตเดทเดฃเด‚ เดจเดŸเดคเตเดคเตเดฎเตเดชเต‹เตพ, 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: เดฑเต‹เตพเดฌเดพเด•เตเด•เต เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•

เดžเดพเตป เด•เต‚เดŸเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเดšเตเดš เดฎเดฑเตเดฑเตŠเดฐเต เดŸเต€เด‚ เดซเด‚เด—เตโ€Œเดทเตป เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฎเต‡เด˜เดฎเดพเดฑเตเดฑเด‚, เดตเดฟเดณเดฟเดšเตเดšเต เดฑเต‹เตพเดฌเดพเด•เตเด•เต เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป. เดžเดพเตป เด‡เดคเต เดฎเตเดฎเตเดชเต เด•เดฃเตเดŸเดฟเดŸเตเดŸเดฟเดฒเตเดฒ, เด…เดคเต เดŽเดจเตเดฑเต† เดธเตเดฑเตเดฑเดพเด•เตเด•เตเด•เตพ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเดจเตเดจเดคเต เด•เต‚เดŸเตเดคเตฝ เดคเดฃเตเดชเตเดชเดฟเด•เตเด•เตเดฎเต†เดจเตเดจเต เดชเต†เดŸเตเดŸเต†เดจเตเดจเต เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เดฟ. เด•เตเดฒเต—เดกเต เดซเต‹เตผเดฎเต‡เดทเตป เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฒเดพเด‚เดกเดฏเดฟเดฒเต‡เด•เตเด•เต‹ เด‡เดธเดฟเดŽเดธเดฟเดฒเต‡เด•เตเด•เต‹ เดŽเดจเตเดฑเต† เด•เต‹เดกเต เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเดฎเตเดชเต‹เดดเต†เดฒเตเดฒเดพเด‚ เดžเดพเตป เด‡เดชเตเดชเต‹เตพ เด‡เดคเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต.

เด‡เดคเต เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต: เดจเดฟเด™เตเด™เตพ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เตเด• CloudWatch เด…เดฒเดพเดฑเด‚ เดชเดฐเดพเดฎเต€เดฑเตเดฑเดฑเดฟเตฝ --rollback-configurationเดจเดฟเด™เตเด™เตพ เด’เดฐเต เดฎเดพเดฑเตเดฑเด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ. เดชเดฟเดจเตเดจเต€เดŸเต, เดจเดฟเด™เตเด™เตพ เด’เดฐเต เด•เต‚เดŸเตเดŸเด‚ เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดฎเตเดชเต‹เตพ, 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-เตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดเดฑเตเดฑเดตเตเด‚ เดชเตเดคเดฟเดฏ เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดตเดฐเตเดคเตเดคเดฟเดฏเดฟเดฒเตเดฒ, เด•เต‚เดŸเดพเดคเต† เดธเตเดฑเตเดฑเดพเด•เตเด•เดฟเดจเตเดฑเต† เดฎเตเตป เดชเดคเดฟเดชเตเดชเต เด…เดฑเดฟเดฏเดพเดคเต† เดตเดฟเดจเตเดฏเดธเดฟเดšเตเดšเต. เด‡เดคเต เดˆ เดธเตเดฑเตเดฑเดพเด•เตเด•เต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดš เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเดฑเต† เดชเตเดฐเดตเตผเดคเตเดคเดจเดฐเดนเดฟเดคเดฎเดพเดฏ เดธเดฎเดฏเดคเตเดคเดฟเดจเต เด•เดพเดฐเดฃเดฎเดพเดฏเดฟ.

เดถเดพเด–เดฏเดฟเตฝ เดเตผเดชเตเดชเต†เดŸเตเดจเตเดจเดคเดฟเดจเต เดฎเตเดฎเตเดชเต เด…เดคเต เด•เดพเดฒเดฟเด•เดฎเดพเดฃเต‹ เดŽเดจเตเดจเดฑเดฟเดฏเดพเตป เด’เดฐเต เดšเต†เด•เตเด•เต เดšเต‡เตผเด•เตเด•เตเดจเตเดจเดคเต เดชเต‹เดฒเต† เดตเดณเดฐเต† เดฒเดณเดฟเดคเดฎเดพเดฃเต (เดœเดฟเดฑเตเดฑเต เดจเดฟเด™เตเด™เดณเตเดŸเต† เดชเดคเดฟเดชเตเดชเต เดจเดฟเดฏเดจเตเดคเตเดฐเดฃ เด‰เดชเด•เดฐเดฃเดฎเดพเดฃเต†เดจเตเดจเต เด•เดฐเตเดคเตเด•):

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 เด•เดฎเดพเตปเดกเตเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เด•เต‚เดŸเตเดŸเด‚ เดฌเดพเดทเต เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เตพ เด†เดตเดถเตเดฏเดฎเดพเดฃเต.

4 เดตเตผเดทเด‚ เดฎเตเดฎเตเดชเต เดžเดพเตป aws cloudformation create-stack เด•เดฎเดพเตปเดกเต เดŽเดจเตเดจ เดฒเดณเดฟเดคเดฎเดพเดฏ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเดพเดฃเต เด†เดฐเด‚เดญเดฟเดšเตเดšเดคเต. เดคเดพเดฎเดธเดฟเดฏเดพเดคเต† เดคเดฟเดฐเด•เตเด•เดฅ เดฒเดณเดฟเดคเดฎเดฒเตเดฒเดพเดคเดพเดฏเดฟ. เดชเด เดฟเดšเตเดš เด“เดฐเต‹ เดชเดพเด เดตเตเด‚ เดคเดฟเดฐเด•เตเด•เดฅเดฏเต† เด•เต‚เดŸเตเดคเตฝ เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเด•เตเด•เดฟ. เด‡เดคเต เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเต เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ, เดฌเด—เตเด•เดณเตเด‚ เดจเดฟเดฑเดžเตเดžเดคเดพเดฏเดฟเดฐเตเดจเตเดจเต.

เดžเดพเตป เด‡เดชเตเดชเต‹เตพ เด’เดฐเต เดšเต†เดฑเดฟเดฏ เดเดŸเดฟ เดกเดฟเดชเตเดชเดพเตผเดŸเตเดŸเตเดฎเต†เดจเตเดฑเดฟเตฝ เดœเต‹เดฒเดฟ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เด“เดฐเต‹ เดŸเต€เดฎเดฟเดจเตเด‚ เด•เตเดฒเต—เดกเต เดซเต‹เตผเดฎเต‡เดทเตป เดธเตเดฑเตเดฑเดพเด•เตเด•เตเด•เตพ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เดพเตป เด…เดคเดฟเดจเตเดฑเต‡เดคเดพเดฏ เดฐเต€เดคเดฟเดฏเตเดฃเตเดŸเต†เดจเตเดจเต เด…เดจเตเดญเดตเด‚ เดคเต†เดณเดฟเดฏเดฟเดšเตเดšเดฟเดŸเตเดŸเตเดฃเตเดŸเต. เด…เดคเต เดฎเต‹เดถเดฎเดพเดฃเต. เดŽเดฒเตเดฒเดพเดตเดฐเตเด‚ เด’เดฐเต‡ เดธเดฎเต€เดชเดจเด‚ เดธเตเดตเต€เด•เดฐเดฟเดšเตเดšเดพเตฝ เดจเดจเตเดจเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚. เดญเดพเด—เตเดฏเดตเดถเดพเตฝ, เด•เตเดฒเต—เดกเต เดซเต‹เตผเดฎเต‡เดทเตป เดธเตเดฑเตเดฑเดพเด•เตเด•เตเด•เตพ เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เดพเดจเตเด‚ เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เดจเดฟเด™เตเด™เดณเต† เดธเดนเดพเดฏเดฟเด•เตเด•เตเดจเตเดจ เดจเดฟเดฐเดตเดงเดฟ เดŸเต‚เดณเตเด•เตพ เดฒเดญเตเดฏเดฎเดพเดฃเต.

เดคเต†เดฑเตเดฑเตเด•เตพ เด’เดดเดฟเดตเดพเด•เตเด•เดพเตป เดˆ เดชเดพเด เด™เตเด™เตพ เดจเดฟเด™เตเด™เดณเต† เดธเดนเดพเดฏเดฟเด•เตเด•เตเด‚.

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•