αααα»αα αΆααααααΎαααααΎααΆαααΆαα½α ααααααΆαααα 4 ααααΆαβααααααα α ααΆααααΈαααααααα αααα»αααΆααααααα αααααΆαα ααΆααααααααααΆα αααΎα ααΌααααΈααααααααααα·ααα½α α αΎααααααα ααα»ααααααΆαααααααααααα»αααααααααα’αααΈαα½α αααα»αααΆααααα’αααΈααααΈα ααΆαααααααα·αααααααα αααα»αααΉαα ααααααααααααααααΆααααα½αα ααα½αααααααα»αααΆααααα
αααααααΈα‘α ααΆαααααααΆαααααΆααααααΌααα»αααΉαααΆααα±ααααααΎααααΆαα
αααα»αααΆααααααααααααααααΆαααααααΆααααΈαααα»αα αΆααααααΎαααααΎααΆαααΆαα½α ααααααΆαααα. αααα»αβαα·αβα αΆαβααΆβα’αααΈβαααβαααα»αβααΌα βαααβαα ααα»ααααβαααα»αβα αααΆααβααΆβα αΆαβααΆβαααα»αβααΆαβααααΎβααΆαααβαααααΆ Aws cloudformation update. ααΆαααβαααααΆβαααβααααΆααβααβααΆααβα ααβααΌαβααααΌβαααβαα·αβααΆαβααΆαβαααααΆααβααΈβααΆαβααααΆααβααααΌαβαααβααΉαβααααΌαβααΆααβα±ααβααααΎβααααΆααβα‘αΎαα αααα»αβαα·αβαα·αβααΆβααΆαβααααααβααΆβαα½αβααΊβααααΌαβααΆαβαααααΆααβααΌαβα ααα»βαααβα’αααβαα½αβααΆαααααβααΆαβααααΆααβααααΌαβααΆααβα’ααβαα»αβαααβααΆααβα±ααβααααΎβααααΆααα
αααααΆααααΈαααΆαααααα αααα»αααΆαααααΆααααααΌαααααΆαα ααααααααα ααααΆαααΆαααααααΆααααα½αααΆααααααααΆα’αΆααααααααααΆααααααααΆ αααααΎα-ααααΆααααααΌα-ααααα
# 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 |
+---------+--------------------+----------------------+------------+
ααα α·ααααα»αααΆααααΆαα·αααα ααααααΆαααααΆααααααΌαααααααααααααααααΆα αααα½α, Delete α¬ααααααααΆ ααααΌαααΆααααα½α - αα·α. ααΆαααααααΊααΆααΆαααααΆααααααΌααααααααααααΆαααααα»α α αΎαααΆααααααΆααΆαα±ααααΆαααααααααααΆαα
αα ααααααααΆαααααΆααααααΌαααααΌαααΆααα·αα·ααα αα½αααα’αΆα ααααΌαααΆαααααΆαααααααΆα
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 α¬αααα»ααααααααααΊαα ααααΆαααα’ ααΆααααααΎααααααΆααα·ααΈαααααααΆααααααΆαα½αααΎααααΈααααΎααΏααααα αααααααΌαααΆαααα α
ααΆ ααααααααΆαααα α αΎαα’αααα’αΆα
α’αΆαααααααα’αααΈααΆαα
αααα»α
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 entity AWS αααααΌαα±ααα’αααααααα MasterUsername αα·α MasterUserPassword α αααααΆαααΆααΆααΆααααααΎαααΆααα»ααααααΆααΆααααααΆαααα αααα»αααΌαααααα α αΎααααα»αα ααααααΎα’αααΈαααααααααΆαααααααααααΆα αααα»αααΆαα’αα»αααα "ααααααΆαααααΆααα" ααααα»ααααααΆααα±ααααααΎααααΆαα αα·αα·ααααααΆααααΉαααααΌαααΆαααα½αααΈ s3 α αΎαααααα·αααΎααααααΆααααααΆαααα·αααααΌαααΆαααααΎα αα·αα·ααααααΆααααααΈααααΌαααΆααααααΎα αα·α αααααΆαα»ααααα»α s3 α
αααααΆαααααα·αα·ααααααΆααααΆαααααααΉαααααΌαααΆααααααΌαααΆαααΆαααΆαααααααα ααΆααααΆααααααααΆαααααΎα-ααααΆααααααΌα-ααααααααααΎααααα αααααααααα»ααα·αααααααΆαα½αααααααΈα ααΆααΆαααΎαα‘αΎαααΆααΆαααααΆαααα s3 ααααΌαααΆαααΆααααα α αΎα "ααααααΆαααααΆααα" αααααααα»αααΆαα αΆαααα»αααΆααΆαααααΆαα½αααΎααααΈαααααΎαααααααΆααααααΆααααααΈα
ααααα·αααΎαααα»αα αΆααααααΎαααααΎααααααΈαααααα αααα»αααΆαααα·α α αΎααααα αΆααααΆααααααΆααααΆαααΎαα‘αΎαααααααα ααΆααΉαααααΎαα αα α»ααααααααΆααααααΆαα½αααΉααα·αα·ααααααΆααααααΈα αααα»αααααΈαα·ααααααααααΆαα’αααΈα’αΆαααααααΉαααΎαα‘αΎαααα ααααααΆαααΆααααα αααα»αααΆαααααααα αααα·ααΈααΆαααααααα α αΎαα αΆααααααΎαααααΎαα½ααααααααα ααααααααααααααΆααααααΆααα’ααααααααΆαααααααααα - αα ααααααααΎααααα α αΎαααααααα αα αααααααααααααΌαααΆαααΆαα’αΆααααα αααα½αα±ααααΆααααααΆααααααααααααΆαααααααΆαααΆαααααα αααα»αααΉαααααΎαααΆαααΆαααα UsePreviousValue=αα·α:
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
αααα»ααα½ααααααααααα»αααΆαααααΎααΆαααΆαα½αααΆαααααΎαα»αααΆα ααααααΆαααα, ααΆαα α ααΆαααααααα ααΆαααααααα rollback. αααα»ααα·αααΆαααααααΆααααΆααΈαα»ααααα α αΎαααΆαααΉαααΆααΆααΉαααααΎα±ααααΆαααΆαααααααΆαααααααααααα»αααΆαααααααααΆααααΆααα»αα α₯α‘αΌαααααααα»αααααΎααΆααΆαααααααααααα»αααΆαααααααΆααααααΌααααααααα»ααα lambda α¬ ECS αααααααΎ cloudformation α
αααααααααΆααααΎαααΆα: α’ααααααααΆαα ααα‘αααααα·α CloudWatch αα αααα»ααααΆαααΆαααααα --rollback-ααΆαααααααα ααΆαααααααααα αααα’ααααααααΎααααα»αααααΆααααααΌαα ααααααα αα αααα’αααααααα·ααααα·αααα»αααααΆαααααΆααααααΌα ααα aws ααΆαααΆαααα‘αααααα·ααααΆαα αα ααΆαααα½αααΆααΈα ααΆβααααα·αβααΆαβααΆααβα±ααβααααΎβαα·α ααααα·αααΎβααααααααβααααΌαβααααΆαααΆαβαα ALARM αααα»αα’αα‘α»ααααβαααα
ααΆαααααααααααΆα§ααΆα αααααααΆααααααααααααΌ ααααααΆααααααααααα»ααααααΎα ααα‘αααααα·α cloudwatchαααααΆαααΆα cloud user metric ααΆα ααα½αααααα α»ααααα»α cloud logs (ααααααααααΌαααΆααααααΎαααΆαααα ααααααααααα):
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 ααΊααΆα§ααααααααα½ααα·αα·αααααααααααα’ααα)α
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
αααααααΈα¦α αα»ααααααΎααααα‘αΎααα·α
ααΆα’αΆα α αΆααααΌα ααΆααΆαααααααΆαααΆαα½α ααααααΆαααα - ααΆβααΆααααα½αα α’αααααααΆααααααααΌαααΆαααααααΈα bash ααΆα αααΎααααααααα·ααααα·ααΆααααααααΆ aws cli α
ααΆαααΈ 4 ααααΆααα»α αααα»αααΆαα αΆααααααΎαααΆαα½α scripts ααΆααααα α ααΆ aws cloudformation create-stack commandα αα·αααΌαααα»ααααΆαααααααΈααα·αααΆαααααααααα αααααααΈαα½ααααααααααΆαααααΎα±ααααααααΈαααΆαααααααα»αααααΆαα ααΆβαα·αβααααΉαβααβαα·ααΆαβααα»αααααβαα ααα»ααααβααβααααααβαα βαααβααα α»αβαααα
αα αα α»αααααααααα»αααααΎααΆααα ααααα IT ααΌα αα½αα αααα·αααααααΆααααα αΆαααΆαααα»αααΈαα½ααααΆααα·ααΈααααΆαααααα½ααααα»αααΆαααΆαααααααΆαααααα»ααααααΎααααα α αΎααααααΆααΏαα’αΆαααααα ααΆβααΉαβααα’βααΆαβααααα·αβααΎβα’αααβααΆααβααααΆβααΆαβααααΎβαα·ααΈβααΌα βααααΆα ααΆααααΆαααα’ ααΆαα§αααααααΆα αααΎααααα’αΆα ααααΆαααΎααααΈαα½αα’ααααααα»αααΆαααΆαααααααΆα αα·αααααααα ααΆααααααααααααα»ααααααΎααααα
αααααααΆαααααααΉααα½αα’ααααααααΆαααα α»αα
ααααα: www.habr.com