เจฎเฉˆเจ‚ เจ†เจชเจฃเฉ€ เจฌเจพเจ•เฉ€ เจฆเฉ€ เจœเจผเจฟเฉฐเจฆเจ—เฉ€ เจฒเจˆ เจ•เจฒเจพเจ‰เจกเจซเจพเจฐเจฎเฉ‡เจธเจผเจจ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฆเฉ‡ เจ‡เจน 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"

เจ‡เฉฑเจ• เจตเจพเจฐ เจ‡เฉฑเจ• เจคเจฌเจฆเฉ€เจฒเฉ€ เจธเฉˆเฉฑเจŸ เจฌเจฃ เจœเจพเจฃ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจ‡เจธเจฆเจพ เจฎเฉŒเจœเฉ‚เจฆเจพ เจธเจŸเฉˆเจ• 'เจคเฉ‡ เจ•เฉ‹เจˆ เจชเฉเจฐเจญเจพเจต เจจเจนเฉ€เจ‚ เจนเฉเฉฐเจฆเจพเฅค เจ…เฉฑเจชเจกเฉ‡เจŸ เจ•เจฎเจพเจ‚เจก เจฆเฉ‡ เจ‰เจฒเจŸ, changeset เจชเจนเฉเฉฐเจš เจ…เจธเจฒ เจคเฉˆเจจเจพเจคเฉ€ เจจเฉ‚เฉฐ เจšเจพเจฒเฉ‚ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเฉ€ เจนเฉˆเฅค เจ‡เจธเจฆเฉ€ เจฌเจœเจพเจ, เจ‡เจน เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจธเฉ‚เจšเฉ€ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจœเจฟเจธเจฆเฉ€ เจคเฉเจธเฉ€เจ‚ เจคเฉˆเจจเจพเจคเฉ€ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจธเจฎเฉ€เจ–เจฟเจ† เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค เจคเฉเจธเฉ€เจ‚ 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   |
+---------+--------------------+----------------------+------------+

เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ 'เจคเฉ‡ เจตเจฟเจธเจผเฉ‡เจธเจผ เจงเจฟเจ†เจจ เจฆเจฟเจ“ เจœเจฟเฉฑเจฅเฉ‡ เจเจ•เจธเจผเจจ เจนเฉˆ เจฌเจฆเจฒเฉ‹, เจนเจŸเจพเจ“ เจœเจพเจ‚ เจ•เจฟเฉฑเจฅเฉ‡ Replacement Needed - เจธเฉฑเจš เจนเฉˆ. เจ‡เจน เจธเจญ เจคเฉ‹เจ‚ เจ–เจผเจคเจฐเจจเจพเจ• เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจนเจจ เจ…เจคเฉ‡ เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจœเจพเจฃเจ•เจพเจฐเฉ€ เจฆเฉ‡ เจจเฉเจ•เจธเจพเจจ เจฆเจพ เจ•เจพเจฐเจจ เจฌเจฃเจฆเฉ€เจ†เจ‚ เจนเจจเฅค

เจ‡เฉฑเจ• เจตเจพเจฐ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจฆเฉ€ เจธเจฎเฉ€เจ–เจฟเจ† เจนเฉ‹เจฃ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจคเฉˆเจจเจพเจค เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ

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 เจกเฉ‡เจŸเจพเจฌเฉ‡เจธ เจ‰เจฆเจพเจนเจฐเจจ เจœเจพเจ‚ เจ‡เฉฑเจ• elasticsearch เจ•เจฒเฉฑเจธเจŸเจฐ, เจ†เจฆเจฟเฅค เจ‡เจน เจšเฉฐเจ—เจพ เจนเฉ‹เจตเฉ‡เจ—เจพ เจœเฉ‡เจ•เจฐ 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 เจจเจพเจฒ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจ–เจคเจฎ เจนเฉ‹ เจ—เจฟเจ† เจธเฉ€, เจ…เจคเฉ‡ เจฎเฉ‡เจฐเฉ€ "เจธเจฎเจพเจฐเจŸ เจตเจฟเจงเฉ€" เจจเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจจเจตเฉ‡เจ‚ เจชเฉเจฐเจฎเจพเจฃ เจชเฉฑเจคเจฐ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจ‡เฉฑเจ• เจธเฉฐเจ•เฉ‡เจค เจตเจœเฉ‹เจ‚ เจฎเฉฐเจจเจฟเจ†เฅค

เจœเฉ‡ เจฎเฉˆเจ‚ เจ‡เจธ เจธเจ•เฉเจฐเจฟเจชเจŸ เจจเฉ‚เฉฐ เจ‰เจคเจชเจพเจฆเจจ เจตเจฟเฉฑเจš เจตเจฐเจคเจฃเจพ เจธเจผเฉเจฐเฉ‚ เจ•เฉ€เจคเจพ เจ…เจคเฉ‡ เจ•เฉเจจเฉˆเจ•เจธเจผเจจ เจธเจฎเฉฑเจธเจฟเจ† เจฆเฉเจฌเจพเจฐเจพ เจนเฉ‹ เจ—เจˆ, เจคเจพเจ‚ เจ‡เจน เจจเจตเฉ‡เจ‚ เจชเฉเจฐเจฎเจพเจฃ เจชเฉฑเจคเจฐเจพเจ‚ เจจเจพเจฒ เจธเจŸเฉˆเจ• เจจเฉ‚เฉฐ เจ…เจชเจกเฉ‡เจŸ เจ•เจฐเฉ‡เจ—เจพเฅค เจ‡เจธ เจตเจฟเจธเจผเฉ‡เจธเจผ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš, เจ•เฉเจ เจตเฉ€ เจฌเฉเจฐเจพ เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเฉ‡เจ—เจพ. เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจฎเฉˆเจ‚ เจ‡เจธ เจชเจนเฉเฉฐเจš เจจเฉ‚เฉฐ เจ›เฉฑเจก เจฆเจฟเฉฑเจคเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเฉ€ เจธเจผเฉเจฐเฉ‚ เจ•เจฐ เจฆเจฟเฉฑเจคเฉ€ เจนเฉˆ, เจธเจฟเจฐเจซ เจ‡เฉฑเจ• เจตเจพเจฐ เจชเฉเจฐเจฎเจพเจฃ เจชเฉฑเจคเจฐ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ - เจธเจŸเฉˆเจ• เจฌเจฃเจพเจ‰เจฃ เจตเฉ‡เจฒเฉ‡. เจ…เจคเฉ‡ เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš, เจœเจฆเฉ‹เจ‚ เจธเจŸเฉˆเจ• เจจเฉ‚เฉฐ เจ…เฉฑเจชเจกเฉ‡เจŸ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ, เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ เจฆเฉ‡ เจ—เฉเจชเจค เจฎเฉเฉฑเจฒ เจจเฉ‚เฉฐ เจฆเจฐเจธเจพเจ‰เจฃ เจฆเฉ€ เจฌเจœเจพเจ, เจฎเฉˆเจ‚ เจฌเจธ เจตเจฐเจคเจพเจ‚เจ—เจพ PreviousValue=เจธเจนเฉ€ เจตเจฐเจคเฉ‹เจ‚:

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 เจ…เจฒเจพเจฐเจฎ เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ เจตเจฟเฉฑเจš --เจฐเฉ‹เจฒเจฌเฉˆเจ•-เจธเฉฐเจฐเจšเจจเจพเจœเจฆเฉ‹เจ‚ เจคเฉเจธเฉ€เจ‚ เจ‡เฉฑเจ• เจคเจฌเจฆเฉ€เจฒเฉ€ เจฌเจฃเจพเจ‰เจ‚เจฆเฉ‡ เจนเฉ‹เฅค เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš, เจœเจฆเฉ‹เจ‚ เจคเฉเจธเฉ€เจ‚ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจฆเจพ เจ‡เฉฑเจ• เจธเฉˆเฉฑเจŸ เจšเจฒเจพเจ‰เจ‚เจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ 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 เจ•เจฒเจพเจ‰เจกเจซเจพเจฐเจฎเฉ‡เจธเจผเจจ เจฌเจฃเจพเจ“-เจธเจŸเฉˆเจ• เจ•เจฎเจพเจ‚เจก เจ•เจฟเจนเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจœเจฒเจฆเฉ€ เจนเฉ€ เจธเจ•เฉเจฐเจฟเจชเจŸ เจธเจงเจพเจฐเจจ เจจเจนเฉ€เจ‚ เจฐเจนเฉ€เฅค เจธเจฟเฉฑเจ–เฉ‡ เจ—เจ เจนเจฐ เจธเจฌเจ• เจจเฉ‡ เจธเจ•เฉเจฐเจฟเจชเจŸ เจจเฉ‚เฉฐ เจนเฉ‹เจฐ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจฌเจฃเจพ เจฆเจฟเฉฑเจคเจพ เจนเฉˆเฅค เจ‡เจน เจจเจพ เจธเจฟเจฐเจซเจผ เจ”เจ–เจพ เจธเฉ€, เจธเจ—เฉ‹เจ‚ เจฌเฉฑเจ—เจพเจ‚ เจจเจพเจฒ เจตเฉ€ เจญเจฐเจฟเจ† เจนเฉ‹เจ‡เจ† เจธเฉ€เฅค

เจฎเฉˆเจ‚ เจตเจฐเจคเจฎเจพเจจ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ›เฉ‹เจŸเฉ‡ IT เจตเจฟเจญเจพเจ— เจตเจฟเฉฑเจš เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเจพเจ‚เฅค เจคเจœเจฐเจฌเฉ‡ เจจเฉ‡ เจฆเจฟเจ–เจพเจ‡เจ† เจนเฉˆ เจ•เจฟ เจนเจฐเฉ‡เจ• เจŸเฉ€เจฎ เจ•เฉ‹เจฒ เจ•เจฒเจพเจ‰เจกเจซเจพเจฐเจฎเฉ‡เจธเจผเจจ เจธเจŸเฉˆเจ• เจจเฉ‚เฉฐ เจคเจพเจ‡เจจเจพเจค เจ•เจฐเจจ เจฆเจพ เจ†เจชเจฃเจพ เจคเจฐเฉ€เจ•เจพ เจนเฉˆเฅค เจ…เจคเฉ‡ เจ‡เจน เจฌเฉเจฐเจพ เจนเฉˆ. เจšเฉฐเจ—เจพ เจนเฉ‹เจตเฉ‡เจ—เจพ เจœเฉ‡เจ•เจฐ เจนเจฐ เจ•เฉ‹เจˆ เจ‡เฉฑเจ•เฉ‹ เจœเจฟเจนเฉ€ เจชเจนเฉเฉฐเจš เจ…เจชเจฃเจพเจตเฉ‡เฅค เจ–เฉเจธเจผเจ•เจฟเจธเจฎเจคเฉ€ เจจเจพเจฒ, เจ•เจฒเจพเจ‰เจกเจซเจพเจฐเจฎเฉ‡เจธเจผเจจ เจธเจŸเฉˆเจ• เจจเฉ‚เฉฐ เจคเฉˆเจจเจพเจค เจ…เจคเฉ‡ เจ•เฉŒเจ‚เจซเจฟเจ—เจฐ เจ•เจฐเจจ เจตเจฟเฉฑเจš เจคเฉเจนเจพเจกเฉ€ เจฎเจฆเจฆ เจ•เจฐเจจ เจฒเจˆ เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจŸเฉ‚เจฒ เจ‰เจชเจฒเจฌเจง เจนเจจเฅค

เจ‡เจน เจธเจฌเจ• เจ—เจฒเจคเฉ€เจ†เจ‚ เจคเฉ‹เจ‚ เจฌเจšเจฃ เจตเจฟเฉฑเจš เจคเฉเจนเจพเจกเฉ€ เจฎเจฆเจฆ เจ•เจฐเจจเจ—เฉ‡เฅค

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹