Bdejt naħdem magħhom formazzjoni tas-sħab 4 snin ilu. Minn dak iż-żmien 'l hawn kissejt ħafna infrastrutturi, anke dawk li kienu diġà fil-produzzjoni. Imma kull darba li tħawwad xi ħaġa, tgħallimt xi ħaġa ġdida. Permezz ta’ din l-esperjenza, se naqsam xi wħud mill-aktar lezzjonijiet importanti li tgħallimt.
Lezzjoni 1: Ittestja l-bidliet qabel ma tużahom
Tgħallimt din il-lezzjoni ftit wara li bdejt naħdem magħhom formazzjoni tas-sħab. Ma niftakarx eżattament x'kisser dak iż-żmien, imma żgur niftakar li użajt il-kmand aws cloudformation aġġornament. Dan il-kmand sempliċement joħroġ il-mudell mingħajr ebda validazzjoni tal-bidliet li se jiġu skjerati. Ma naħsibx li hemm bżonn ta' ebda spjegazzjoni għaliex għandek tittestja l-bidliet kollha qabel ma tużahom.
Wara dan il-falliment, bdejt immedjatament pipeline tal-iskjerament, li tissostitwixxi l-kmand tal-aġġornament bil-kmand toħloq-bidla-sett
# 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"
Ladarba jinħoloq changeset, ma jkollu l-ebda effett fuq il-munzell eżistenti. B'differenza mill-kmand tal-aġġornament, l-approċċ tas-sett tal-bidla ma jwassalx għall-iskjerament attwali. Minflok, toħloq lista ta 'bidliet li tista' tirrevedi qabel l-iskjerament. Tista' tara l-bidliet fl-interface tal-aws console. Imma jekk tippreferi tawtomatizza dak kollu li tista', imbagħad iċċekkjahom fis-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
Dan il-kmand għandu jipproduċi output simili għal dan li ġej:
--------------------------------------------------------------------
| DescribeChangeSet |
+---------+--------------------+----------------------+------------+
| Action | ReplacementNeeded | Resource | ResourceId |
+---------+--------------------+----------------------+------------+
| Modify | True | AWS::ECS::Cluster | MyCluster |
| Replace| True | AWS::RDS::DBInstance| MyDB |
| Add | None | AWS::SNS::Topic | MyTopic |
+---------+--------------------+----------------------+------------+
Oqgħod attent ħafna għall-bidliet fejn hemm Azzjoni Ibdel, Ħassar jew fejn Sostituzzjoni meħtieġa - Veru. Dawn huma l-aktar bidliet perikolużi u ġeneralment iwasslu għal telf ta 'informazzjoni.
Ladarba l-bidliet ikunu ġew riveduti, jistgħu jiġu skjerati
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"
Lezzjoni 2: Uża l-politika tal-munzell biex tevita li r-riżorsi stateful jiġu sostitwiti jew imneħħija
Xi drabi sempliċement tara l-bidliet mhux biżżejjed. Aħna lkoll umani u lkoll nagħmlu żbalji. Ftit wara li bdejna nużaw changesets, sieħbi bla ma kien jaf wettaq skjerament li rriżulta f'aġġornament tad-database. Ma ġara xejn ħażin għax kien ambjent ta’ ttestjar.
Anke jekk l-iskripts tagħna wrew lista ta 'bidliet u talbu konferma, il-bidla Ibdel inqabżet minħabba li l-lista ta' bidliet kienet tant kbira li ma kinitx toqgħod fuq l-iskrin. U peress li dan kien aġġornament normali f'ambjent ta 'ttestjar, ma ngħatatx wisq attenzjoni għall-bidliet.
Hemm riżorsi li qatt ma trid tissostitwixxi jew tneħħi. Dawn huma servizzi sħaħ, bħal istanza tad-database RDS jew raggruppament elasticsearch, eċċ. Ikun sabiħ li aws awtomatikament jirrifjuta l-iskjerament jekk l-operazzjoni li qed titwettaq tkun teħtieġ li tħassar tali riżors. Fortunatament, cloudformation għandha mod inkorporat biex tagħmel dan. Din tissejjaħ politika tal-munzell, u tista' taqra aktar dwarha fiha
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"
Lezzjoni 3: Uża UsePreviousValue meta taġġorna munzell b'parametri sigrieti
Meta toħloq entità RDS mysql, AWS teħtieġ li tipprovdi MasterUsername u MasterUserPassword. Peress li huwa aħjar li ma nżommx sigrieti fil-kodiċi tas-sors u ridt nawtomatizza assolutament kollox, implimentajt "mekkaniżmu intelliġenti" fejn qabel l-iskjerament il-kredenzjali se jinkisbu minn s3, u jekk il-kredenzjali ma jinstabux, jiġu ġġenerati kredenzjali ġodda u maħżuna f's3.
Dawn il-kredenzjali mbagħad jiġu mgħoddija bħala parametri lill-kmand tal-ħolqien-bidla-sett ta' cloudformation. Waqt l-esperimentazzjoni bl-iskrittura, ġara li l-konnessjoni ma 's3 intilfet, u l-"mekkaniżmu intelliġenti" tiegħi trattat bħala sinjal biex jiġġenera kredenzjali ġodda.
Jekk bdejt nuża dan l-iskript fil-produzzjoni u l-problema tal-konnessjoni reġgħet seħħet, taġġorna l-munzell b'kredenzjali ġodda. F'dan il-każ partikolari, mhu se jiġri xejn ħażin. Madankollu, abbandunajt dan l-approċċ u bdejt nuża ieħor, billi pprovdi kredenzjali darba biss - meta ħoloq il-munzell. U aktar tard, meta l-munzell jeħtieġ aġġornament, minflok ma nispeċifika l-valur sigriet tal-parametru, nixtieq sempliċement nuża UsePreviousValue=veru:
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"
Lezzjoni 4: Uża konfigurazzjoni ta' rollback
Tim ieħor li ħdimt miegħu uża l-funzjoni formazzjoni tas-sħab, imsejħa konfigurazzjoni ta' rollback. Ma kontx iltqajt magħha qabel u malajr induna li se tagħmel l-iskjerament tal-munzell tiegħi saħansitra aktar frisk. Issa nużaha kull darba li niskjera l-kodiċi tiegħi għal lambda jew ECS billi tuża cloudformation.
Kif taħdem: inti tispeċifika CloudWatch allarm arn v parametru --rollback-configurationmeta inti toħloq changeset. Aktar tard, meta tesegwixxi sett ta 'bidliet, aws jimmonitorja l-allarm għal mill-inqas minuta. Jagħmel lura l-iskjerament jekk l-allarm jibdel l-istat għal ALARM matul dan iż-żmien.
Hawn taħt hemm eżempju ta' silta tal-mudell formazzjoni tas-sħabli fih noħloq allarm cloudwatch, li jsegwi metrika tal-utent tas-sħab bħala n-numru ta' żbalji fir-reġistri tas-sħab (il-metrika hija ġġenerata permezz 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
Issa allarm jistgħu jintużaw bħala żmantellament trigger meta tesegwixxi l-kaxxa tal-għodda:
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"
Lezzjoni 5: Kun żgur li tuża l-aħħar verżjoni tal-mudell
Huwa faċli li tuża verżjoni inqas mill-aħħar tal-mudell tal-formazzjoni tas-sħab, iżda jekk tagħmel hekk tikkawża ħafna ħsara. Dan ġara lilna darba: żviluppatur ma mbuttax l-aħħar bidliet minn Git u bla ma kien jaf skjera verżjoni preċedenti tal-munzell. Dan irriżulta f'ħin ta' waqfien għall-applikazzjoni li użat dan il-munzell.
Xi ħaġa sempliċi daqs li żżid kontroll biex tara jekk il-fergħa hijiex aġġornata qabel ma tikkommetti ruħha magħha tkun tajba (jekk wieħed jassumi li git hija l-għodda tal-kontroll tal-verżjoni tiegħek):
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
Lezzjoni 6: Tivvintax ir-rota mill-ġdid
Jista 'jidher bħala skjerament ma' formazzjoni tas-sħab - huwa faċli. Għandek bżonn biss mazz ta 'skripts bash li jeżegwixxu kmandi aws cli.
4 snin ilu bdejt bi skripts sempliċi imsejħa l-aws cloudformation create-stack kmand. Dalwaqt l-iskrittura ma baqgħetx sempliċi. Kull lezzjoni meħuda għamlet l-iskript aktar u aktar kumpless. Kien mhux biss diffiċli, iżda wkoll mimli bugs.
Bħalissa naħdem f'dipartiment żgħir tal-IT. L-esperjenza wriet li kull tim għandu l-mod tiegħu kif juża munzelli ta 'cloudformation. U dan huwa ħażin. Ikun aħjar jekk kulħadd jieħu l-istess approċċ. Fortunatament, hemm ħafna għodod disponibbli biex jgħinuk tuża u tikkonfigura munzelli ta 'cloudformation.
Dawn il-lezzjonijiet jgħinuk tevita l-iżbalji.
Sors: www.habr.com