Min van 6 dersên xebata bi cloudformation heta dawiya jiyana xwe fêr kir.

Min dest bi xebatê kir damezrandina ewr 4 sal berê. Ji hingê ve min gelek binesaziyên ku berê di hilberînê de bûn jî şikandin. Lê her cara ku min tiştek tevlihev dikir, ez fêrî tiştek nû bûm. Bi vê serpêhatiyê, ez ê hin dersên herî girîng ên ku min fêr bûm parve bikim.

Min van 6 dersên xebata bi cloudformation heta dawiya jiyana xwe fêr kir.

Ders 1: Guherandinên berî ku wan bicîh bikin ceribandin

Piştî ku min dest bi xebatê kir, ez vê dersê zû fêr bûm damezrandina ewr. Nayê bîra min wê hingê min bi rastî çi şikand, lê bê guman tê bîra min ku min ferman bikar anî aws nûvekirina cloudformation. Ev ferman bi tenê şablonê bêyî pejirandina guheztinên ku dê werin bicîh kirin derdixe. Ez nafikirim ku ravekirinek hewce nebe ji bo vê yekê çima divê hûn hemî guhartinan berî ku wan bicîh bikin ceribandin.

Piştî vê têkçûnê, ez yekser guherî pipeline, li şûna fermana nûvekirinê bi fermanê afirandin-guhertin-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"

Dema ku guheztinek were afirandin, ew ti bandorek li ser staka heyî nake. Berevajî fermana nûvekirinê, nêzîkatiya guheztinê rêvekirina rastîn nade. Di şûna wê de, ew navnîşek guhertinan diafirîne ku hûn dikarin berî bicîhkirinê binirxînin. Hûn dikarin guhertinên di navgîniya konsolê ya aws de bibînin. Lê heke hûn tercîh dikin ku her tiştê ku hûn dikarin otomatîk bikin, wê hingê wan di CLI-yê de kontrol bikin:

# 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

Divê ev ferman encamek mîna ya jêrîn hilberîne:

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

Bi taybetî bala xwe bidin guhertinên ku Action lê ye Diberdaxistin, Vemirandina an li ku derê ReplacementNeeded - Rast. Ev guhertinên herî xeternak in û bi gelemperî dibin sedema windakirina agahdariyê.

Dema ku guherandin hatine vekolîn, ew dikarin werin bicîh kirin

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"

Ders 2: Siyaseta stackê bikar bînin da ku rê li ber guheztin an rakirina çavkaniyên dewletî bigirin

Carinan tenê dîtina guhertinan ne bes e. Em hemî mirov in û em hemî xeletiyan dikin. Demek kin piştî ku me dest bi karanîna guheztinan kir, hevalê min bi nezanî vesazkirinek kir ku di encamê de nûvekirina databasê bû. Tiştek xirab çênebû ji ber ku ew hawîrdorek ceribandinê bû.

Her çend nivîsarên me navnîşek guhertinan nîşan dan û ji bo pejirandinê xwestin jî, guhertina Replace hate paşguh kirin ji ber ku navnîşa guhertinan ew qas mezin bû ku li ser ekranê cîh nedigirt. Û ji ber ku ev di hawîrdorek ceribandinê de nûvekirinek normal bû, pir guh nedan guhertinan.

Çavkaniyên ku hûn qet naxwazin şûna an jêbirin hene. Ev karûbarên dewletî ne, wek mînakek databasa RDS an komeke elasticsearch, hwd. Dê xweş be ku aws bixweber veqetandinê red bike ger operasyona ku tê kirin pêdivî bi jêbirina çavkaniyek weha hebe. Xwezî, cloudformation ji bo vê yekê rêyek çêkirî heye. Vê polîtîkaya stackê tê gotin, û hûn dikarin li ser wê bêtir bixwînin belgekirin:

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"

Ders 3: Dema ku stekek bi pîvanên veşartî nûve dike UsePreviousValue bikar bînin

Dema ku hûn saziyek mysql ya RDS-ê diafirînin, AWS ji we re hewce dike ku navek MasterUsername û MasterUserPassword peyda bikin. Ji ber ku çêtir e ku meriv di koda çavkaniyê de nepenî nehêle û min xwest ku ez bi tevahî her tiştî otomatîk bikim, min "mekanîzmayek jîr" bicîh kir ku berî bicîhkirinê pêbawerî dê ji s3 were wergirtin, û heke pêbawer nehatin dîtin, pêbaweriyên nû têne çêkirin û di s3 de hilanîn.

Dê dûv re van pêbaweran wekî parametre ji fermana afirandina-guhertin-set-sazkirina cloudformation re derbas bibin. Dema ku bi senaryoyê re ceribandin, qewimî ku pêwendiya bi s3 re winda bû, û "mekanîzmaya zîrek" min ew wekî nîşanek hilberandina pêbaweriyên nû nirxand.

Ger min dest bi karanîna vê skrîptê di hilberînê de kir û pirsgirêka pêwendiyê dîsa qewimî, ew ê stackê bi pêbaweriyên nû nûve bike. Di vê rewşa taybetî de, tiştek xirab dê bibe. Lêbelê, min dev ji vê nêzîkatiyê berda û dest bi karanîna yekek din kir, ku pêbaweriyan tenê carekê peyda kir - dema ku stackê diafirîne. Û paşê, gava ku stêk pêdivî ye ku nûvekirin, li şûna ku ez nirxa veşartî ya parametreyê diyar bikim, ez ê bi tenê bikar bînim UsePreviousValue=rast:

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"

Ders 4: Veavakirina vegerê bikar bînin

Tîmek din a ku ez pê re xebitîm fonksiyonê bikar anî damezrandina ewr, gazî kirin veavakirina rollback. Min berê rastî wê nehatibû û zû fêm kir ku ew ê bicîhkirina stûnên min hê sartir bike. Naha ez wê her carê ku ez koda xwe li lambda an ECS-ê bi karanîna cloudformation ve dişînim wê bikar tînim.

Çawa dixebite: hûn diyar dikin CloudWatch alarm arn di parametreyê de --vegerandin-veavakiringava ku hûn guheztinek çêdikin. Dûv re, gava ku hûn komek guhertinan pêk tînin, aws bi kêmî ve yek hûrdem alarmê dişopîne. Ger alarm di vê demê de rewşa ALARM-ê biguherîne ew verastkirinê vedigerîne.

Li jêr mînakek jêkek şablonê heye damezrandina ewrku ez diafirînim alarma cloudwatch, ku metrîka bikarhênerê ewr wekî hejmara xeletiyên di têketinên ewr de dişopîne (metric bi riya 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

Now hawar dikare wekî bikar bînin berbiçav gava ku qutiya amûrê bi darve dike, bişkîne:

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"

Ders 5: Piştrast bikin ku hûn guhertoya herî dawî ya şablonê bicîh dikin

Sazkirina guhertoyek kêm-zêde ya şablona cloudformation hêsan e, lê kirina wiya dê bibe sedema gelek zirarê. Ev yek carek hat serê me: pêşdebirek guheztinên herî paşîn ji Git dernexist û bi nezanî guhertoyek berê ya stackê bicîh kir. Vê yekê ji bo sepana ku vê stêkê bikar anî bû sedema domandinê.

Tiştek bi hêsanî wekî lêzêdekirina kontrolê ji bo dîtina ka şax nûve ye berî ku pê ve girêbide dê baş be (bihesibînin ku git amûrek kontrolkirina guhertoya we ye):

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

Ders 6: Tekerê ji nû ve îcad nekin

Dibe ku ew bi danasînê re xuya dike damezrandina ewr - ev hesanî ye. Hûn tenê hewceyê komek nivîsarên bash in ku emrên aws cli bicîh dikin.

4 sal berê min bi nivîsarên hêsan ên bi navê fermana aws cloudformation create-stack dest pê kir. Zû zû senaryo êdî ne hêsan bû. Her dersa ku hîn dibû senaryo bêtir û bêtir tevlihev dikir. Ew ne tenê dijwar bû, lê di heman demê de tijî xelet bû.

Ez niha di beşa piçûk a IT de dixebitim. Tecrûbeyê destnîşan kir ku her tîm awayê xwe yê bicihkirina stûnên ewr-formasyonê heye. Û ev xerab e. Ger her kes heman nêzîkatiyê bigirta dê çêtir be. Xwezî, gelek amûrên berdest hene ku ji we re bibin alîkar ku hûn stakên ewrformasyonê bicîh bikin û mîheng bikin.

Van dersan dê ji we re bibin alîkar ku hûn ji xeletiyan dûr bisekinin.

Source: www.habr.com

Add a comment