แแแแแฌแงแ แแฃแจแแแแ แฆแ แฃแแแแก แคแแ แแแ แแแ 4 แฌแแแก แฌแแ. แแแก แจแแแแแ แแแแ แ แแแคแ แแกแขแ แฃแฅแขแฃแ แ แแแแแ แฆแแแ, แแฃแแแแช แแก, แ แแช แฃแแแ แฌแแ แแแแแแจแ แแงแ. แแแแ แแ แงแแแแแแแแก, แ แแชแ แ แแฆแแชแแก แแแคแฃแญแแแแ, แ แแฆแแช แแฎแแแก แแกแฌแแแแแแแ. แแ แแแแแชแแแแแแแแแ แแ แแแแแแแแ แแแ แ แแแแแแแแ แงแแแแแแ แแแแจแแแแแแแแ แแแแแแแแแก, แ แแช แแแกแฌแแแแ.
แแแแแแแแแ 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 |
+---------+--------------------+----------------------+------------+
แแแแกแแแฃแแ แแแฃแแ แงแฃแ แแแฆแแแ แแแแฅแชแแแ แชแแแแแแแแแก, แกแแแแช แแ แแก แแแฅแแแแแแ Replace, แฌแแจแแ แแ แกแแ แฉแแแแชแแแแแ แกแแญแแ แแ - แแแ แแแแแ. แแก แแ แแก แงแแแแแแ แกแแจแแจแ แชแแแแแแแแแ แแ แฉแแแฃแแแแ แแ แแฌแแแแก แแแคแแ แแแชแแแก แแแแแ แแแแก.
แชแแแแแแแแแแก แแแแฎแแแแแก แจแแแแแ, แแกแแแ แจแแแซแแแแ แแแแแแแกแแแก
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 แแแขแแแแขแฃแ แแ แฃแแ แก แแขแงแแแก แแแแแแแแแแแ, แแฃ แจแแกแ แฃแแแแฃแแ แแแแ แแชแแ แแแแแฎแแแก แแกแแแ แ แแกแฃแ แกแแก แฌแแจแแแก. แกแแแแแแแแ แแ, cloudformation-แก แแฅแแก แฉแแจแแแแแฃแแ แแแ แแแแก แแแกแแแแแแแแแ. แแแแก แฐแฅแแแ แกแขแแแแก แแแแแขแแแ แแ แแแแก แจแแกแแฎแแ แแแขแ แจแแแแซแแแแ แฌแแแแแแฎแแ แแฅ
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-แจแ.
แแก แกแแ แแแคแแแแขแแแ แจแแแแแ แแแแแแชแแแ แ แแแแ แช แแแ แแแแขแ แแแ 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: แแแแแแงแแแแ rollback แแแแคแแแฃแ แแชแแ
แกแฎแแ แแฃแแแแ, แแแกแแแแแช แแแฃแจแแแแแ, แแแแแแงแแแ แคแฃแแฅแชแแ แฆแ แฃแแแแก แคแแ แแแ แแแแแแฃแ แแแ แฃแแแ แแแแ แฃแแแแแก แแแแคแแแฃแ แแชแแ. แแฅแแแแ แแ แจแแแฎแแแแ แแ แแ แกแฌแ แแคแแ แแแแฎแแแ, แ แแ แแก แแแแแ แฃแคแ แ แแแแแ แ แแแฎแแแก แฉแแแก แกแขแแแแแแก แแแแแแแแแแก. แแฎแแ แแ แแแงแแแแ แแแก แงแแแแ แฏแแ แแ, แ แแชแ แฉแแแก แแแแก แแแแแแแแ แแ ECS-แแ แแแงแแแแ แฆแ แฃแแแแแแแ แคแแ แแแ แแแแก แแแแแงแแแแแแ.
แ แแแแ แแฃแจแแแแก: แแฅแแแ แแแฃแแแแแ 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
แแฎแแ แแแแแแจแ แจแแแซแแแแ แแแแแงแแแแแฃแ แแฅแแแก แ แแแแ แช rollback แขแ แแแแ แ แฎแแแกแแฌแงแแแ แงแฃแแแก แจแแกแ แฃแแแแแกแแก:
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 แแแแงแแคแแแแแแจแ. แแแแแชแแแแแแแ แแฉแแแแ, แ แแ แแแแแแฃแ แแฃแแแก แแฅแแก แฆแ แฃแแแแแแแ แคแแ แแแ แแแแก แกแขแแแแแแก แแแแแแแแแแก แกแแแฃแแแ แ แแแ. แแ แแก แชแฃแแแ. แฃแแแแแกแ แแฅแแแแ, แแฃ แงแแแแ แแ แแแแแ แ แแแแแแแ แแงแ. แกแแแแแแแแ แแ, แแ แกแแแแแก แแ แแแแแ แฎแแแกแแฌแงแ, แ แแแแแแช แแแแแฎแแแ แแแแ แฆแ แฃแแแแแแแ แคแแ แแแ แแแแก แกแขแแแแแแก แแแแแแแแแแกแ แแ แแแแคแแแฃแ แแชแแแจแ.
แแก แแแแแแแแแแแ แแแแแฎแแแ แแแแ แแแแแแแ แแแชแแแแ แจแแชแแแแแแ.
แฌแงแแ แ: www.habr.com