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.

Ă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 tableSee 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. :
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: yesPraegu 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
