ืœืžื“ืชื™ ืืช 6 ื”ืฉื™ืขื•ืจื™ื ื”ืืœื” ืฉืœ ืขื‘ื•ื“ื” ืขื Cloudformation ืœืžืฉืš ืฉืืจื™ืช ื—ื™ื™.

ื”ืชื—ืœืชื™ ืœืขื‘ื•ื“ ืขื ืชืฆื•ืจืช ืขื ืŸ ืœืคื ื™ 4 ืฉื ื™ื. ืžืื– ืฉื‘ืจืชื™ ื”ืจื‘ื” ืชืฉืชื™ื•ืช, ืืคื™ืœื• ื›ืืœื” ืฉื›ื‘ืจ ื”ื™ื• ื‘ื™ื™ืฆื•ืจ. ืื‘ืœ ื‘ื›ืœ ืคืขื ืฉืคื™ืฉืœืชื™ ืžืฉื”ื•, ืœืžื“ืชื™ ืžืฉื”ื• ื—ื“ืฉ. ื“ืจืš ื”ืชื ืกื•ืช ื–ื•, ืื—ืœื•ืง ื›ืžื” ืžื”ืฉื™ืขื•ืจื™ื ื”ื—ืฉื•ื‘ื™ื ื‘ื™ื•ืชืจ ืฉืœืžื“ืชื™.

ืœืžื“ืชื™ ืืช 6 ื”ืฉื™ืขื•ืจื™ื ื”ืืœื” ืฉืœ ืขื‘ื•ื“ื” ืขื Cloudformation ืœืžืฉืš ืฉืืจื™ืช ื—ื™ื™.

ืฉื™ืขื•ืจ 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 console. ืื‘ืœ ืื ืืชื” ืžืขื“ื™ืฃ ืœื”ืคื•ืš ืืช ื›ืœ ืžื” ืฉืืชื” ื™ื›ื•ืœ ืœืื•ื˜ื•ืžื˜ื™, ื‘ื“ื•ืง ืื•ืชื ื‘-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 ืื• ืืฉื›ื•ืœ ื—ื™ืคื•ืฉ ืฉืœ elastics, ื•ื›ื•'. ื–ื” ื™ื”ื™ื” ื ื—ืžื“ ืื 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 ื“ื•ืจืฉ ืžืžืš ืœืกืคืง ืฉื ืžืฉืชืžืฉ ื•ื‘ืกื™ืก ืžืฉืชืžืฉ ืจืืฉื™. ืžื›ื™ื•ื•ืŸ ืฉืขื“ื™ืฃ ืœื ืœืฉืžื•ืจ ืกื•ื“ื•ืช ื‘ืงื•ื“ ื”ืžืงื•ืจ ื•ืจืฆื™ืชื™ ืœื”ืคื•ืš ืืช ื”ื›ืœ ืœืื•ื˜ื•ืžื˜ื™, ื”ื˜ืžืขืชื™ "ืžื ื’ื ื•ืŸ ื—ื›ื" ืฉื‘ื• ืœืคื ื™ ื”ืคืจื™ืกื” ื”ืื™ืฉื•ืจื™ื ื™ืชืงื‘ืœื• ืž-s3, ื•ืื ื”ืื™ืฉื•ืจื™ื ืœื ื™ื™ืžืฆืื•, ื ื•ืฆืจื™ื ืื™ืฉื•ืจื™ื ื—ื“ืฉื™ื ื• ืžืื•ื—ืกืŸ ื‘-s3.

ืื™ืฉื•ืจื™ื ืืœื” ื™ื•ืขื‘ืจื• ืœืื—ืจ ืžื›ืŸ ื›ืคืจืžื˜ืจื™ื ืœืคืงื•ื“ืช cloudformation 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 ื‘ืืžืฆืขื•ืช Cloudformation.

ืื™ืš ื–ื” ืขื•ื‘ื“: ืืชื” ืžืฆื™ื™ืŸ ืื–ืขืงืช CloudWatch ื‘ืคืจืžื˜ืจ --ืชืฆื•ืจืช ื”ื—ื–ืจื” ืœืื—ื•ืจื›ืืฉืจ ืืชื” ื™ื•ืฆืจ ืขืจื›ืช ืฉื™ื ื•ื™ื™ื. ืžืื•ื—ืจ ื™ื•ืชืจ, ื›ืืฉืจ ืืชื” ืžื‘ืฆืข ืกื˜ ืฉื™ื ื•ื™ื™ื, aws ืขื•ืงื‘ืช ืื—ืจ ื”ืื–ืขืงื” ืœืžืฉืš ื“ืงื” ืื—ืช ืœืคื—ื•ืช. ื–ื” ืžื‘ื˜ืœ ืืช ื”ืคืจื™ืกื” ืื ื”ืื–ืขืงื” ืžืฉื ื” ืžืฆื‘ ืœ-ALARM ื‘ืžื”ืœืš ืชืงื•ืคื” ื–ื•.

ืœื”ืœืŸ ื“ื•ื’ืžื” ืœืงื˜ืข ืชื‘ื ื™ืช ืชืฆื•ืจืช ืขื ืŸืฉื‘ื• ืื ื™ ื™ื•ืฆืจ ืื–ืขืงืช ืฉืขื•ืŸ ืขื ืŸ, ืืฉืจ ืขื•ืงื‘ ืื—ืจ ืžื“ื“ ืžืฉืชืžืฉ ื‘ืขื ืŸ ื›ืžืกืคืจ ื”ืฉื’ื™ืื•ืช ื‘ื™ื•ืžื ื™ ื”ืขื ืŸ (ื”ืžื“ื“ ื ื•ืฆืจ ื‘ืืžืฆืขื•ืช MetricFilter):

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: ื•ื“ื ืฉืืชื” ืคื•ืจืก ืืช ื”ื’ืจืกื” ื”ืขื“ื›ื ื™ืช ื‘ื™ื•ืชืจ ืฉืœ ื”ืชื‘ื ื™ืช

ืงืœ ืœืคืจื•ืก ื’ืจืกื” ืคื—ื•ืช ืžื”ืขื“ื›ื ื™ืช ืฉืœ ืชื‘ื ื™ืช Cloudformation, ืืš ืคืขื•ืœื” ื–ื• ืชื’ืจื•ื ืœื ื–ืง ืจื‘. ื–ื” ืงืจื” ืœื ื• ืคืขื ืื—ืช: ืžืคืชื— ืœื ื“ื—ืฃ ืืช ื”ืฉื™ื ื•ื™ื™ื ื”ืื—ืจื•ื ื™ื ืž-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: ืืœ ืชืžืฆื™ื ืืช ื”ื’ืœื’ืœ ืžื—ื“ืฉ

ื–ื” ืื•ืœื™ ื ืจืื” ื›ืžื• ืคืจื™ืกื” ืขื ืชืฆื•ืจืช ืขื ืŸ - ื–ื” ืงืœ. ืืชื” ืจืง ืฆืจื™ืš ื—ื‘ื•ืจื” ืฉืœ ืกืงืจื™ืคื˜ื™ื ืฉืœ bash ื”ืžื‘ืฆืขื™ื ืคืงื•ื“ื•ืช aws cli.

ืœืคื ื™ 4 ืฉื ื™ื ื”ืชื—ืœืชื™ ืขื ืกืงืจื™ืคื˜ื™ื ืคืฉื•ื˜ื™ื ืฉื ืงืจืื™ื ื”ืคืงื•ื“ื” aws cloudformation create-stack. ืขื“ ืžื”ืจื” ื”ืชืกืจื™ื˜ ื›ื‘ืจ ืœื ื”ื™ื” ืคืฉื•ื˜. ื›ืœ ืฉื™ืขื•ืจ ืฉื ืœืžื“ ื”ืคืš ืืช ื”ืชืกืจื™ื˜ ืœืžื•ืจื›ื‘ ื™ื•ืชืจ ื•ื™ื•ืชืจ. ื–ื” ื”ื™ื” ืœื ืจืง ืงืฉื”, ืืœื ื’ื ืžืœื ื‘ืื’ื™ื.

ื›ื™ื•ื ืื ื™ ืขื•ื‘ื“ ื‘ืžื—ืœืงืช IT ืงื˜ื ื”. ื”ื ื™ืกื™ื•ืŸ ื”ืจืื” ืฉืœื›ืœ ืฆื•ื•ืช ื™ืฉ ื“ืจืš ืžืฉืœื• ืœืคืจื•ืก ืขืจื™ืžื•ืช ืขื ืŸ. ื•ื–ื” ืจืข. ืขื“ื™ืฃ ืฉื›ื•ืœื ื™ื ืงื˜ื• ื‘ืื•ืชื” ื’ื™ืฉื”. ืœืžืจื‘ื” ื”ืžื–ืœ, ื™ืฉื ื ื›ืœื™ื ืจื‘ื™ื ื–ืžื™ื ื™ื ื›ื“ื™ ืœืขื–ื•ืจ ืœืš ืœืคืจื•ืก ื•ืœื”ื’ื“ื™ืจ ืขืจื™ืžื•ืช Cloudformation.

ืฉื™ืขื•ืจื™ื ืืœื” ื™ืขื–ืจื• ืœืš ืœื”ื™ืžื ืข ืžื˜ืขื•ื™ื•ืช.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”