Tgħallimt dawn is-6 lezzjonijiet ta 'ħidma ma' cloudformation għall-bqija ta 'ħajti.

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.

Tgħallimt dawn is-6 lezzjonijiet ta 'ħidma ma' cloudformation għall-bqija ta 'ħajti.

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 dokumentazzjoni:

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

Żid kumment