Need 6 Ôppetundi cloudformation'i kasutamisest jÀÀvad mulle Igaveseks meelde.

Alustasin tööd cloudformation 4 aastat tagasi. Sellest ajast saiya murdnud palju infrastruktuure, sealhulgas neid, mis olid juba tootmises. Kuid iga kord, kui ma midagi rikkusin, Ôppisin uut. Selle kogemuse pÔhjal jagan mÔningaid kÔige olulisemaid Ôppetunde, mida olen Ôppinud.

Need 6 Ôppetundi cloudformation'i kasutamisest jÀÀvad mulle Igaveseks meelde.

Õppetund 1: kontrollige muudatusi enne nende rakendamist

Ma Ă”ppisin seda Ă”ppetundi ĂŒsna varsti pĂ€rast seda, kui alustasin tööd cloudformation. Ei mĂ€leta tĂ€pselt, mida ma siis rikkusin, kuid mĂ€letan, et kasutasin kĂ€sku aws cloudformation update. See kĂ€sk lihtsalt rakendab mallid ilma ĂŒhtegi muudatust eelnevalt kontrollimata, mis rakendatakse. Ma ei arva, et selgitusi oleks vaja, miks on oluline kĂ”ik muudatused enne nende rakendamist kontrollida.

PÀrast seda ebaÔnnestumist muutsin ma kohe deploymendi toru, asendades kÀsu update kÀsuga 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"

Kui muudatusete kogum on loodud, ei mÔjuta see olemasolevat steeki. Erinevalt kÀskust update ei pÔhjusta muudatusete kogumi kasutamine tegelikku rakendamist. Selle asemel loob see muudatused, mida saate vaadata enne rakendamist. Saate muudatusi vaadata aws konsoolis. Kuid kui eelistate automatiseerida kÔike, mis vÔimalik, kontrollige neid CLI-s:

# 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

See kÀsk peaks andma vÀljundi, mis sarnaneb jÀrgmisega:

--------------------------------------------------------------------
|                         DescribeChangeSet                        |
+---------+--------------------+----------------------+------------+
| Action  | ReplacementNeeded  |      Resource        | ResourceId |
+---------+--------------------+----------------------+------------+
|  Modify | True               |  AWS::ECS::Cluster   |  MyCluster |
|  Replace| True               |  AWS::RDS::DBInstance|  MyDB      |
|  Add    | None               |  AWS::SNS::Topic     |  MyTopic   |
+---------+--------------------+----------------------+------------+

Pöörake erilist tĂ€helepanu muudatustele, kus Action on Replace, Kustutage vĂ”i kus ReplacementNeeded — True. Need on kĂ”ige ohtlikumad muudatused, mis tavaliselt toovad kaasa andmete kaotuse.

Kui muudatused on lÀbi vaadatud, saab neid rakendada

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"

Õppetund 2: kasutage steeki poliitikat, et vĂ€ltida ressursside asendamist vĂ”i kustutamist oleku sĂ€ilitamisega

MÔnikord ei piisa lihtsalt muudatuste vaatamisest. Me kÔik oleme inimesed ja teeme vigu. Peagi pÀrast seda, kui hakkasime kasutama muudatusetappe, tegi mu meeskonnakaaslane tahtmatult juurutuse, mis viis andmebaasi uuendamiseni. Midagi kohutavat ei juhtunud, sest see oli testimiskeskkond.

Kuigi meie skriptid nĂ€itasid muudatuste loendit ja kĂŒsisid kinnitust, jĂ€i muutmine asendada tĂ€helepanuta, sest muudatuste loetelu oli nii suur, et see ei mahtunud ekraanile. Ja kuna see oli tavaline uuendus testimiskeskkonnas, ei pööratud muutustele nii suurt tĂ€helepanu.

On ressursse, mida te kunagi ei sooviks asendada ega kustutada. Need on olekuga teenused, nagu RDS andmebaasi eksemplar vĂ”i elastichsearch klaster jne. Oleks hea, kui AWS keeldub automaatselt juurutamast, kui teostatav toiming nĂ”uab sellise ressursi kustutamist. Õnneks on CloudFormationil selleks sisseehitatud meetod. Seda nimetatakse stack policy'ks ja sellest saab rohkem teada. dokumentatsioon:

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"

Õppetund 3: kasutage UsePreviousValue, kui vĂ€rskendate steki saladuslike parameetritega

Kui loote RDS mysql ĂŒksuse, nĂ”uab AWS, et te esitaksite MasterUsername ja MasterUserPassword. Kuna parem ei ole hoida saladusi lĂ€htekoodis ja ma tahtsin automatiseerida absoluutselt kĂ”ik, rakendasin "nutikat mehhanismi", mille korral enne juurutamist saadakse sisselogimisandmed S3-st, ja kui andmeid ei leita, genereeritakse uued ja salvestatakse S3-sse.

SeejĂ€rel edastatakse need sisselogimisandmed parameetritena kĂ€sule cloudformation create-change-set. Skripti katsetuste ajal juhtus, et ĂŒhendus S3-ga katkestati ja minu "nutikas mehhanism" tĂ”lgendas seda signaalina uute sisselogimisandmete genereerimiseks.

Kui ma hakkaksin seda skripti töökeskkonnas kasutama ja ĂŒhenduse loomise probleem esineks jĂ€lle, uuendaks see kuhja uutega mandaate. Antud juhul ei juhtu midagi halba. Ometi loobusin sellisest lĂ€henemisviisist ja hakkasin kasutama teistsugust, andes mandaate ainult korra — kuhja loomisel. Ja hiljem, kui kuhja tuleb uuendada, kasutaksin ma selle asemel, et mÀÀrata parameetri salajast vÀÀrtust, lihtsalt 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"

Õppetund 4: kasutage rollback konfiguratsiooni

Teine kĂ€sk, millega ma töötasin, kasutas funktsiooni cloudformation, mida nimetatakse rollback konfiguratsioon. Ma polnud selle nĂ€inud varem ja taipasin kiiresti, et see muudab minu kuhjade levitamist veelgi paremaks. NĂŒĂŒd kasutan seda iga kord, kui kĂ€itun oma koodi lambda vĂ”i ECS abil cloudformationi kaudu.

Kuidas see töötab: mÀÀrate CloudWatch alarm arn parameetrisse —rollback-configuration, kui loote muudatuste komplekti. Hiljem, kui teete muudatuste komplekti, jĂ€lgib aws alarmi vĂ€hemalt ĂŒhe minuti. See tĂŒhistab levitamise tagasi, kui selle aja jooksul alarm muudetakse olekuks ALARM.

Allpool on nÀide mallilÔigust cloudformation, kus ma loon cloudwatch alarm, mis jÀlgib kohandatud pilve metrikat, milleks on veateated pilve logides (metrika luuakse lÀbi MetricFilter):

Resources:
  # see metrika jÀlgib arvu vigu cloudwatch logides. Selles
  # konkreetses juhul eeldatakse, et logid on json formaadis ja vealogid on
  # tuvastatud taseme "error" jÀrgi. Vaata 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 minut
      EvaluationPeriods: 1
      Threshold: 0
      TreatMissingData: notBreaching
      ActionsEnabled: yes

Praegu alarm vÔib olla kasutatud kui rollback kÀivitaja muudatuste komplekti tÀitmisel:

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"

Õppetund 5: veenduge, et te kasutate kĂ”ige vĂ€rskemat malli versiooni

On lihtne juurutada mitte kÔige vÀrskemat cloudformation malli versiooni, kuid see vÔib pÔhjustada tÔsiseid probleeme. Meil juhtus kunagi nii: arendaja ei saatnud viimaseid muudatusi Gitist ja juurutaski alateadlikult varasema versiooni. See tÔi kaasa rakenduse seiske, mis kasutas seda virna.

Lihtne kontroll, nÀiteks kontrollimine, kas haru on ajakohane, enne juurutamise sooritamist, oleks hea mÔte (eeldades, et git on teie versioonihaldustööriist):

git fetch
HEADHASH=$(git rev-parse HEAD)
UPSTREAMHASH=$(git rev-parse master@{upstream})

if [[ "$HEADHASH" != "$UPSTREAMHASH" ]] ; then
   echo "Haru ei ole ajakohane originaaliga. TĂŒhistamine"
   exit 1
fi

Õppetund 6: Ă€rge leiutage ratast

VĂ”ib tunduda, et juurutamine on cloudformation — see on lihtne. Teil on lihtsalt vaja rida bash skripte, mis tĂ€idavad aws cli kĂ€sklusi.

Neli aastat tagasi alustasin ma lihtsate skriptidega, mis kasutasid kĂ€sku aws cloudformation create-stack. Varsti ei olnud skripti enam lihtne. Iga Ă”pitud Ă”ppetund muudab skripti ĂŒha keerulisemaks. See ei olnud mitte ainult keeruline, vaid ka tĂ€is vigu.

Praegu töötan ma vĂ€ikeses IT-osakonnas. Kogemus nĂ€itab, et igal meeskonnal on oma viis cloudformation virnade juurutamiseks. Ja see on halb. Oleks parem, kui kĂ”ik kasutaksid ĂŒhtset lĂ€henemist. Õnneks on palju tööriistu, mis aitavad juurutada ja seadistada cloudformation virnu.

Need Ôppetunnid aitavad teil vÀltida vigu.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster