Need mitu pilti on olemas? Osa neist oli tellitud, ĂŒks oli kokku pandud ja jĂ€rgmine on vĂ€hese kuue valiku levinud rakendus.

Alustasin töötamist cloudformationiga neli aastat tagasi. Selle aja jooksul olen purustanud palju infrastruktuure, sealhulgas ka neid, mis olid juba tootmises. Kuid iga kord, kui ma midagi purustasin, Ôppisin ma midagi uut. Selle kogemuse pÔhjal jagan mÔningaid kÔige olulisemaid Ôppetunde, mille olen Ôppinud.

Need mitu pilti on olemas? Osa neist oli tellitud, ĂŒks oli kokku pandud ja jĂ€rgmine on vĂ€hese kuue valiku levinud rakendus.

Õppetund 1: kontrollige muudatusi enne nende kĂ€ivitamist

Selle Ôppetunni Ôppisin peaaegu kohe, kui alustasin töötamist cloudformationiga. Ei mÀleta, mida ma tol hetkel purustasin, aga mÀletan, et kasutasin kÀsku aws cloudformation update. See kÀsk lihtsalt rakendab mall ilma igasuguste muudatuste kontrollimiseta, mis kraavi tÔugatakse. Ma ei arva, et vajate selgitusi, miks on vajalik kÔik muudatused enne nende kÀivitamist kontrollida.

PÀrast seda ebaÔnnestumist muutsin ma kohe deployment pipeline'i, asendades kÀsku 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"

Kuna muudatuste komplekt on loodud, ei mÔjuta see olemasolevat steki. Erinevalt kÀsklusest update ei pÔhjusta muudatuste komplekt tegelikku juurutamist. Selle asemel loob see nimekirja muudatustest, mida saate vaadata enne juurutamist. Saate muudatusi vaadata AWS konsoli liideses. Kui eelistate aga automatiseerida kÔike, 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Àsklus peaks andma vÀljundi, mis sarnaneb jÀrgmisele:

--------------------------------------------------------------------
|                         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, Delete vĂ”i kus ReplacementNeeded — True. Need on kĂ”ige ohtlikumad muudatused ja tavaliselt toovad nad kaasa teabe kaotuse.

Kui muudatused on ĂŒle vaadatud, saab need juurutada.

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"

Tund 2: kasutage stack policy'd, et vÀltida ressursside asendamist vÔi kustutamist oleku sÀilitamisega

MĂ”nikord ei piisa lihtsalt muudatuste ĂŒlevaatusest. Me kĂ”ik oleme inimesed ja teeme vigu. Peagi pĂ€rast seda, kui hakkasime kasutama muudatuseteemasid, tegi minu meeskonnakaaslane alateadlikult juurutuse, mis tĂ”i kaasa andmebaasi vĂ€rskendamise. Suurt midagi ei juhtunud, sest see oli testimis keskkond.

Kuigi meie skriptid nĂ€itasid muudatuste loetelu ja kĂŒsisid kinnitust, jĂ€i Replace muudatus tĂ€helepanuta, sest muudatuste loetelu oli nii pikk, et see ei mahtunud ekraanile. Ja kuna see oli tavaline vĂ€rskendus testimis keskkonnas, ei pööratud muudatustele nii palju tĂ€helepanu.

On olemas ressursse, mida te kunagi ei soovi asendada ega kustutada. Need on stateful teenused, nagu RDS andmebaasiinstants vĂ”i elastichsearch klaster jne. Oleks hea, kui aws keelaks automaatselt juurutamise, kui teostatav operatsioon nĂ”uab sellise ressursi kustutamist. Õnneks on cloudformationil sisseehitatud viis seda teha. Seda nimetatakse stack policy'ks ja rohkem teavet selle kohta leiate dokumentatsioonis:

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 steeki salajaste parameetritega

Kui loote RDS MySQL ĂŒksuse, nĂ”uab AWS teilt MasterUsername ja MasterUserPassword esitamise. Kuna on parem mitte salvestada salajasi andmeid lĂ€htekoodi, ja kuna soovisin automatiseerida absoluutselt kĂ”ike, olen rakendanud "nutikat mehhanismi", kus enne juurutamist saadakse mandaadid S3-st ja kui mandaate ei leita, genereeritakse uued mandaadid ja salvestatakse S3-sse.

See andmed edastatakse jĂ€rgnevalt cloudformation create-change-set kĂ€sule parameetritena. Skripti katsetamise ajal juhtus, et ĂŒhendus s3-ga kadus ning minu „nutikas mehhanism” tĂ”lgendas seda kui signaali uute andmete genereerimiseks.

Kui ma oleksin hakanud seda skripti tootmiskeskkonnas kasutama ja ĂŒhenduse probleem oleks uuesti ilmnenud, oleks see uuendanud steki uute andmetega. Selles konkreetses olukorras ei juhtuks midagi halba. Kuid ma loobusin sellisest lĂ€henemisest ja hakkasin kasutama teistsugust, andes andmed ainult ĂŒks kord — steki loomisel. Ja hiljem, kui stek nĂ”uab uuendamist, kasutaksin ma saladusvÀÀrtuse parameetri nĂ€itamise asemel 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"

Tund 4: kasutage rollback configuration

Teine kĂ€sk, millega ma töötasin, kasutas funktsiooni cloudformationiga, mida nimetatakse rollback configuration. Ma pole varem temaga kohtunud ja mĂ”istsin kiiresti, et see muudab minu stekkide juurutamise veelgi Ă€gedamaks. NĂŒĂŒd kasutan seda iga kord, kui juurutatakse oma koodi lambda vĂ”i ECS kaudu cloudformationi abil.

Kuidas see töötab: te nĂ€itate CloudWatch alarmi ARN parameetris —rollback-configuration, kui loote muudatusete kogumit. Hiljem, kui te muudatusete kogumit tĂ€idate, jĂ€lgib AWS alarmi vĂ€hemalt ĂŒhe minuti. See tĂŒhistab juurutamise, kui selle aja jooksul alarm muutub seisundisse ALARM.

Allpool on nÀide mallist cloudformationiga, kus ma loon cloudwatch alarmi, mis jÀlgib kohandatud pilvemeetrit vigade arvu cloudi logides (meetrit luuakse lÀbi MetricFilter):

Ressursid:
  # see nÀitaja jÀlgib vigade arvu cloudwatch logides. Antud
  # juhul eeldatakse, et logid on json vormingus ja veateated on
  # mÀÀratletud tasemega "error". Vaata FilterPattern
  ErrorMetricFilter:
    TĂŒĂŒp: AWS::Logs::MetricFilter
    Atribuudid:
      LogGroupName: !Ref LogGroup
      FilterPattern: !Sub '{$.level = "error"}'
      MetricTransformations:
      - MetricNamespace: !Sub "${AWS::StackName}-log-errors"
        MetricName: Errors
        MetricValue: 1
        DefaultValue: 0

  ErrorAlarm:
    TĂŒĂŒp: AWS::CloudWatch::Alarm
    Atribuudid:
      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: jah

Praegu alarm vÔib olla kasutatud kui rollback trigger komplekti tööriistade tÀitmiseks:

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"

Tund 5: veenduge, et te juurutate kÔige uuema versiooni malli

Cloudformation'i ƥablooni paigaldamine ei ole keeruline, kuid see vÔib pÔhjustada suuri probleeme. Meil oli kunagi selline olukord: arendaja ei saatnud viimaseid muudatusi Gitist ja kÀivitas tahtmatult eelmise versiooni virna. See viis rakenduse seiskumiseni, mis kasutas seda virna.

Midagi lihtsat, nÀiteks haru kehtivuse kontrollimine enne juurutamist, oleks hea mÔte (eeldades, et git on teie versioonihaldusvahend):

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

if [[ "$HEADHASH" != "$UPSTREAMHASH" ]] ; then
   echo "Haru ei ole asjakohane. Katkestan"
   exit 1
fi

Õppetund 6: Ă€ra leiuta ratast

Juurutamine vĂ”ib tunduda, et cloudformationiga — on lihtne. Teil on lihtsalt vaja hunnikut bash-skripte, mis tĂ€idavad aws cli kĂ€ske.

Neli aastat tagasi alustasin ma lihtsate skriptidega, mis kutsusid aws cloudformation create-stack kÀsku. Varsti ei olnud skript enam lihtne. Iga Ôpitud Ôppetund muutis skripti jÀrjest keerukamaks. See polnud 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 cloudformationi 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 cloudformationi virnu.

Need Ôppetunnid aitavad teil vÀltida vigu.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster