Π­Ρ‚ΠΈ 6 ΡƒΡ€ΠΎΠΊΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹ с cloudformation я усвоил Π½Π° всю Тизнь

Π― Π½Π°Ρ‡Π°Π» Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с cloudformation 4 Π³ΠΎΠ΄Π° Π½Π°Π·Π°Π΄. Π‘ Ρ‚Π΅Ρ… ΠΏΠΎΡ€ я сломал ΠΌΠ½ΠΎΠ³ΠΎ инфраструктур, Π΄Π°ΠΆΠ΅ Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΈ Π² ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ. Но ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° я Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΡ€Ρ‚ΠΈΠ», ΡƒΠ·Π½Π°Π²Π°Π» Π½ΠΎΠ²ΠΎΠ΅. Благодаря этому ΠΎΠΏΡ‹Ρ‚Ρƒ, я подСлюсь Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΈΠ· самых Π²Π°ΠΆΠ½Ρ‹Ρ… ΡƒΡ€ΠΎΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я Π²Ρ‹ΡƒΡ‡ΠΈΠ».

Π­Ρ‚ΠΈ 6 ΡƒΡ€ΠΎΠΊΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹ с cloudformation я усвоил Π½Π° всю Тизнь

Π£Ρ€ΠΎΠΊ 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