Π― Π½Π°ΡΠ°Π» ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ cloudformation 4 Π³ΠΎΠ΄Π° Π½Π°Π·Π°Π΄. Π‘ ΡΠ΅Ρ ΠΏΠΎΡ Ρ ΡΠ»ΠΎΠΌΠ°Π» ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡ, Π΄Π°ΠΆΠ΅ ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΆΠ΅ Π±ΡΠ»ΠΈ Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΠΈ. ΠΠΎ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° Ρ ΡΡΠΎ-ΡΠΎ ΠΏΠΎΡΡΠΈΠ», ΡΠ·Π½Π°Π²Π°Π» Π½ΠΎΠ²ΠΎΠ΅. ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ ΡΡΠΎΠΌΡ ΠΎΠΏΡΡΡ, Ρ ΠΏΠΎΠ΄Π΅Π»ΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΈΠ· ΡΠ°ΠΌΡΡ Π²Π°ΠΆΠ½ΡΡ ΡΡΠΎΠΊΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Ρ Π²ΡΡΡΠΈΠ».
Π£ΡΠΎΠΊ 1: ΠΏΡΠΎΠ²Π΅ΡΡΠΉΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡ ΠΈΡ
Π― ΡΡΠ²ΠΎΠΈΠ» ΡΡΠΎΡ ΡΡΠΎΠΊ Π²ΡΠΊΠΎΡΠ΅ ΠΊΠ°ΠΊ Π½Π°ΡΠ°Π» ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ cloudformation. ΠΠ΅ ΠΏΠΎΠΌΠ½Ρ, ΡΡΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ ΡΠΎΠ³Π΄Π° ΡΠ»ΠΎΠΌΠ°Π», Π½ΠΎ ΡΠΎΡΠ½ΠΎ ΠΏΠΎΠΌΠ½Ρ, ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» ΠΊΠΎΠΌΠ°Π½Π΄Ρ aws cloudformation update. ΠΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΡΠΎΡΡΠΎ Π²ΡΠΊΠ°ΡΡΠ²Π°Π΅Ρ ΡΠ°Π±Π»ΠΎΠ½ Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡ. ΠΠ΅ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΡΠ΅Π±ΡΡΡΡΡ ΠΎΠ±ΡΡΡΠ½Π΅Π½ΠΈΡ, Π΄Π»Ρ ΡΠ΅Π³ΠΎ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ Π²ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡ ΠΈΡ .
ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΠ²Π°Π»Π°, Ρ ΡΡΠ°Π·Ρ ΠΆΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ» deployment pipeline, Π·Π°ΠΌΠ΅Π½ΠΈΠ² ΠΊΠΎΠΌΠ°Π½Π΄Ρ update ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ create-change-set
# 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"
ΠΠΎΠ³Π΄Π° Π½Π°Π±ΠΎΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΡΠΎΠ·Π΄Π°Π½, ΠΎΠ½ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ Π²Π»ΠΈΡΠ΅Ρ Π½Π° ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠΉ ΡΡΠ΅ΠΊ. Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ update, ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π½Π°Π±ΠΎΡΠ° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΡ. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΎΠ½ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π΄ΠΎ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΡ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅ ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ 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 |
+---------+--------------------+----------------------+------------+
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ ΠΎΡΠΎΠ±ΠΎΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ, Π³Π΄Π΅ Action ΡΡΠΎ Replace, Delete ΠΈΠ»ΠΈ Π³Π΄Π΅ ReplacementNeeded β True. ΠΡΠΎ ΡΠ°ΠΌΡΠ΅ ΠΎΠΏΠ°ΡΠ½ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΈ ΠΎΠ±ΡΡΠ½ΠΎ ΠΎΠ½ΠΈ ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡ ΠΊ ΠΏΠΎΡΠ΅ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ.
ΠΠΎΠ³Π΄Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΡΠΌΠΎΡΡΠ΅Π½Ρ, ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡ
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: ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ stack policy Π΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΡ Π·Π°ΠΌΠ΅Π½Ρ ΠΈΠ»ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΡΠ΅ΡΡΡΡΠΎΠ² Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ
ΠΠ½ΠΎΠ³Π΄Π° ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΡΠΌΠΎΡΡΠ° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π½Π΅Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ. ΠΡΠ΅ ΠΌΡ Π»ΡΠ΄ΠΈ ΠΈ Π²ΡΠ΅ Π΄ΠΎΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΎΡΠΈΠ±ΠΊΠΈ. ΠΡΠΊΠΎΡΠ΅ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ Π½Π°ΡΠ°Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π°Π±ΠΎΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΌΠΎΠΉ ΡΠΎΠ²Π°ΡΠΈΡ ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ Π½Π΅ΠΎΡΠΎΠ·Π½Π°Π½Π½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΠ» ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΠ΅, ΡΡΠΎ ΠΏΡΠΈΠ²Π΅Π»ΠΎ ΠΊ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ . ΠΠΈΡΠ΅Π³ΠΎ ΡΡΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π½Π΅ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ»ΠΎ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΡΠΎ Π±ΡΠ»Π° ΡΡΠ΅Π΄Π° ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ Π½Π°ΡΠΈ ΡΠΊΡΠΈΠΏΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π»ΠΈ ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΈ ΠΏΡΠΎΡΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Replace Π±ΡΠ»ΠΎ ΠΏΡΠΎΠΏΡΡΠ΅Π½ΠΎ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΠΏΠΈΡΠΎΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π±ΡΠ» Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ Π±ΠΎΠ»ΡΡΠΈΠΌ, ΡΡΠΎ Π½Π΅ ΠΏΠΎΠΌΠ΅ΡΠ°Π»ΡΡ Π½Π° ΡΠΊΡΠ°Π½Π΅. Π ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠΎ Π±ΡΠ»ΠΎ ΠΎΠ±ΡΡΠ½ΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π² ΡΡΠ΅Π΄Π΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΠΌ ΡΠ΄Π΅Π»ΡΠ»ΠΎΡΡ Π½Π΅ ΡΠ°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΡ.
ΠΡΡΡ ΡΠ΅ΡΡΡΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²Ρ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π·Π°Ρ
ΠΎΡΠΈΡΠ΅ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΠΈΠ»ΠΈ ΡΠ΄Π°Π»ΠΈΡΡ. ΠΡΠΎ statefull ΡΠ΅ΡΠ²ΠΈΡΡ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
RDS ΠΈΠ»ΠΈ ΠΊΠ»Π°ΡΡΠ΅Ρ elastichsearch ΠΈ Ρ. Π΄. ΠΡΠ»ΠΎ Π±Ρ Ρ
ΠΎΡΠΎΡΠΎ, Π΅ΡΠ»ΠΈ Π±Ρ aws Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΡΠΊΠ°Π·ΡΠ²Π°Π» Π² ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΠΈ, Π΅ΡΠ»ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠ°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅Ρ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΠ΅ΡΡΡΡΠ°. Π ΡΡΠ°ΡΡΡΡ, cloudformation ΠΈΠΌΠ΅Π΅Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ. ΠΡΠΎ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ stack policy, ΠΈ ΠΎΠ± ΡΡΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΠ»ΡΡΠ΅ ΡΠ·Π½Π°ΡΡ Π²
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 configuration
ΠΡΡΠ³Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°, Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ Ρ ΡΠ°Π±ΠΎΡΠ°Π», ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»Π° ΡΡΠ½ΠΊΡΠΈΡ cloudformation, Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΡ rollback configuration. Π― Π½Π΅ Π²ΡΡΡΠ΅ΡΠ°Π»ΡΡ Ρ Π½Π΅ΠΉ ΡΠ°Π½ΡΡΠ΅ ΠΈ Π±ΡΡΡΡΠΎ ΠΏΠΎΠ½ΡΠ», ΡΡΠΎ ΡΡΠΎ ΡΠ΄Π΅Π»Π°Π΅Ρ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠΈΡ ΡΡΠ΅ΠΊΠΎΠ² Π΅ΡΠ΅ ΠΊΡΡΡΠ΅. Π’Π΅ΠΏΠ΅ΡΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° ΡΠ°Π·Π²ΠΎΡΠ°ΡΠΈΠ²Π°Ρ ΡΠ²ΠΎΠΉ ΠΊΠΎΠ΄ Π² lambda ΠΈΠ»ΠΈ ECS Ρ ΠΏΠΎΠΌΠΎΡΡΡ cloudformation.
ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ: Π²Ρ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΠ΅ CloudWatch alarm arn Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ΅ —rollback-configuration, ΠΊΠΎΠ³Π΄Π° ΡΠΎΠ·Π΄Π°Π΅ΡΠ΅ Π½Π°Π±ΠΎΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. ΠΠΎΠ·ΠΆΠ΅, ΠΊΠΎΠ³Π΄Π° Π²Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ Π½Π°Π±ΠΎΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, aws ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅Ρ alarm Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΠΎΠ΄Π½ΠΎΠΉ ΠΌΠΈΠ½ΡΡΡ. ΠΠ½ ΠΎΡΠΊΠ°ΡΡΠ²Π°Π΅Ρ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ alarm ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π½Π° ALARM.
ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ ΠΎΡΡΡΠ²ΠΊΠ° ΡΠ°Π±Π»ΠΎΠ½Π° cloudformation, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Ρ ΡΠΎΠ·Π΄Π°Ρ cloudwatch 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 ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ ΠΊΠ°ΠΊ 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: Π½Π΅ ΠΈΠ·ΠΎΠ±ΡΠ΅ΡΠ°ΠΉΡΠ΅ Π²Π΅Π»ΠΎΡΠΈΠΏΠ΅Π΄
ΠΠΎΠΆΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡΡΡ, ΡΡΠΎ ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΠ΅ Ρ cloudformation β ΡΡΠΎ Π»Π΅Π³ΠΊΠΎ. ΠΠ°ΠΌ ΠΏΡΠΎΡΡΠΎ Π½ΡΠΆΠ½Π° ΠΊΡΡΠ° ΡΠΊΡΠΈΠΏΡΠΎΠ² bash, Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ aws cli.
4 Π³ΠΎΠ΄Π° Π½Π°Π·Π°Π΄ Ρ Π½Π°ΡΠΈΠ½Π°Π» Ρ ΠΏΡΠΎΡΡΡΡ ΡΠΊΡΠΈΠΏΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°Π·ΡΠ²Π°ΡΡ aws cloudformation create-stack ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ. ΠΡΠΊΠΎΡΠ΅ ΡΠΊΡΠΈΠΏΡ ΡΠΆΠ΅ Π½Π΅ Π±ΡΠ» ΠΏΡΠΎΡΡΡΠΌ. ΠΠ°ΠΆΠ΄ΡΠΉ Π²ΡΡΡΠ΅Π½Π½ΡΠΉ ΡΡΠΎΠΊ Π΄Π΅Π»Π°Π» ΡΠΊΡΠΈΠΏΡ Π²ΡΠ΅ Π±ΠΎΠ»Π΅Π΅ ΠΈ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠΌ. ΠΡΠ»ΠΎ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎ, Π½ΠΎ ΠΈ Ρ ΠΊΡΡΠ΅ΠΉ Π±Π°Π³ΠΎΠ².
Π‘Π΅ΠΉΡΠ°Ρ Ρ ΡΠ°Π±ΠΎΡΠ°Ρ Π² Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΌ ΠΠ’-ΠΎΡΠ΄Π΅Π»Π΅. ΠΠΏΡΡ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π΅ΡΡΡ ΡΠ²ΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠ°Π·Π²Π΅ΡΡΡΠ²Π°Π½ΠΈΡ ΡΡΠ΅ΠΊΠΎΠ² cloudformation. Π ΡΡΠΎ ΠΏΠ»ΠΎΡ ΠΎ. ΠΡΠ»ΠΎ Π±Ρ Π»ΡΡΡΠ΅, Π΅ΡΠ»ΠΈ Π±Ρ Π²ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ Π΅Π΄ΠΈΠ½ΡΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄. Π ΡΡΠ°ΡΡΡΡ, ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠΎΠΌΠΎΠ³Π°ΡΡ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡ ΠΈ Π½Π°ΡΡΡΠΎΠΈΡΡ ΡΡΠ΅ΠΊΠΈ cloudformation.
ΠΡΠΈ ΡΡΠΎΠΊΠΈ ΠΏΠΎΠΌΠΎΠ³ΡΡ Π²Π°ΠΌ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΎΡΠΈΠ±ΠΎΠΊ.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com