Mwen te aprann 6 leson sa yo nan travay ak cloudformation pou tout rès lavi mwen.

Mwen te kòmanse travay avèk yo fòmasyon nwaj 4 ane de sa. Depi lè sa a mwen kraze anpil enfrastrikti, menm sa ki te deja nan pwodiksyon. Men, chak fwa mwen dezòd yon bagay, mwen aprann yon bagay nouvo. Atravè eksperyans sa a, mwen pral pataje kèk nan leson ki pi enpòtan mwen te aprann yo.

Mwen te aprann 6 leson sa yo nan travay ak cloudformation pou tout rès lavi mwen.

Leson 1: Teste chanjman anvan deplwaye yo

Mwen te aprann leson sa a touswit apre mwen te kòmanse travay avèk yo fòmasyon nwaj. Mwen pa sonje ki sa egzakteman mwen te kraze lè sa a, men mwen definitivman sonje ke mwen te itilize kòmandman an aws cloudformation aktyalizasyon. Kòmandman sa a tou senpleman woule modèl la san okenn validation nan chanjman yo pral deplwaye. Mwen pa panse okenn eksplikasyon ki nesesè pou poukisa ou ta dwe teste tout chanjman anvan deplwaye yo.

Apre echèk sa a, mwen imedyatman chanje deplwaman tiyo, ranplase lòd aktyalizasyon a ak kòmandman an kreye-chanjman-ansanm

# 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"

Yon fwa yo kreye yon chanjman, li pa gen okenn efè sou pil ki deja egziste a. Kontrèman ak lòd aktyalizasyon an, apwòch chanjman an pa deklanche deplwaman aktyèl la. Olye de sa, li kreye yon lis chanjman ke ou ka revize anvan deplwaman. Ou ka wè chanjman ki fèt nan koòdone konsole aws la. Men, si ou prefere otomatize tout sa ou kapab, Lè sa a, tcheke yo nan CLI a:

# 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

Kòmand sa a ta dwe pwodwi pwodiksyon ki sanble ak sa ki annapre yo:

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

Peye atansyon espesyal sou chanjman kote Aksyon ye Ranplase, Efase oswa ki kote Ranplasman Nesesite - Vre. Sa yo se chanjman ki pi danjere e anjeneral mennen nan pèt enfòmasyon.

Yon fwa yo te revize chanjman yo, yo ka deplwaye

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"

Leson 2: Sèvi ak règleman pile pou anpeche resous eta yo ranplase oswa retire

Pafwa tou senpleman gade chanjman yo pa ase. Nou tout se moun e nou tout fè erè. Yon ti tan apre nou te kòmanse itilize chanjman, koekipye mwen an te fè yon deplwaman san yo pa konnen, ki te lakòz yon aktyalizasyon baz done a. Pa gen anyen mal ki te pase paske se te yon anviwònman tès.

Menmsi scripts nou yo te montre yon lis chanjman epi yo te mande konfimasyon, yo te sote chanjman an Ranplase paske lis chanjman yo te tèlman gwo ke li pa t 'anfòm sou ekran an. Epi kòm sa a te yon aktyalizasyon nòmal nan yon anviwònman tès, yo pa t peye anpil atansyon sou chanjman yo.

Gen resous ou pa janm vle ranplase oswa retire. Sa yo se sèvis eta, tankou yon egzanp baz done RDS oswa yon gwoup elasticsearch, elatriye. Li ta bon si aws ta otomatikman refize deplwaman si operasyon an ke yo te fè ta mande pou efase yon resous sa yo. Erezman, cloudformation gen yon fason entegre pou fè sa. Yo rele sa politik pile, epi ou ka li plis sou li nan dokiman:

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"

Leson 3: Sèvi ak UsePreviousValue lè w mete ajou yon pil ak paramèt sekrè

Lè ou kreye yon antite RDS mysql, AWS mande pou ou bay yon MasterUsername ak MasterUserPassword. Depi li pi bon pou pa kenbe sekrè nan kòd sous la epi mwen te vle otomatize absoliman tout bagay, mwen te aplike yon "mekanis entelijan" kote anvan deplwaman yo pral jwenn kalifikasyon yo nan s3, epi si kalifikasyon yo pa jwenn, nouvo kalifikasyon yo pwodwi ak ki estoke nan s3.

Lè sa a, kalifikasyon sa yo pral pase kòm paramèt nan lòd la cloudformation create-change-set. Pandan y ap fè eksperyans ak script la, li te rive ke koneksyon an nan s3 te pèdi, ak "mekanis entelijan" mwen an trete li kòm yon siyal jenere nouvo kalifikasyon.

Si mwen te kòmanse itilize script sa a nan pwodiksyon ak pwoblèm koneksyon an te rive ankò, li ta mete ajou pil la ak nouvo kalifikasyon. Nan ka sa a an patikilye, pa gen anyen move ki pral rive. Sepandan, mwen te abandone apwòch sa a epi mwen te kòmanse itilize yon lòt, bay kalifikasyon yon sèl fwa - lè m ap kreye pile a. Epi pita, lè chemine a bezwen mete ajou, olye pou yo espesifye valè sekrè paramèt la, mwen ta tou senpleman itilize UsePreviousValue=vre:

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"

Leson 4: Sèvi ak konfigirasyon rollback

Yon lòt ekip mwen te travay ak itilize fonksyon an fòmasyon nwaj, rele konfigirasyon rollback. Mwen pa t 'vin jwenn li anvan epi byen vit reyalize ke li ta fè deplwaye pil mwen yo menm pi fre. Koulye a, mwen sèvi ak li chak fwa mwen deplwaye kòd mwen an lambda oswa ECS lè l sèvi avèk cloudformation.

Ki jan li fonksyone: ou presize CloudWatch alam arn v paramèt --rollback-konfigirasyonlè ou kreye yon chanjman. Apre sa, lè ou egzekite yon seri chanjman, aws kontwole alam la pou omwen yon minit. Li woule deplwaman an si alam chanje eta a nan ALAM pandan tan sa a.

Anba a se yon egzanp yon ekstrè modèl fòmasyon nwajnan ki mwen kreye alam cloudwatch, ki swiv yon metrik itilizatè nwaj kòm kantite erè nan mòso nwaj yo (mèt la se pwodwi atravè 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

Koulye a, alam ka itilize kòm Rollback deklanche lè w ap egzekite bwat zouti:

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"

Leson 5: Asire w ou deplwaye dènye vèsyon modèl la

Li fasil pou deplwaye yon vèsyon mwens pase dènye modèl cloudformation la, men si w fè sa, sa pral lakòz anpil domaj. Sa te rive nou yon fwa: yon pwomotè pa t 'pouse dènye chanjman yo soti nan Git ak enkonsyaman deplwaye yon vèsyon anvan chemine a. Sa a te lakòz D 'pou aplikasyon an ki te itilize chemine sa a.

Yon bagay ki senp tankou ajoute yon chèk pou wè si branch lan ajou anvan ou komèt li ta bon (si git se zouti kontwòl vèsyon ou):

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

Leson 6: Pa re-envante wou a

Li ka sanble tankou deplwaye ak fòmasyon nwaj - li fasil. Ou jis bezwen yon pakèt scripts bash egzekite kòmandman aws cli.

4 ane de sa mwen te kòmanse ak scripts senp yo rele kòmandman aws cloudformation create-stack. Byento script la pa t senp ankò. Chak leson te aprann fè script la pi plis ak plis konplèks. Li pa te sèlman difisil, men tou, li te plen ak pinèz.

Kounye a mwen travay nan yon ti depatman IT. Eksperyans yo montre ke chak ekip gen pwòp fason pa yo deplwaye pil nwaj yo. E sa pa bon. Li ta pi bon si tout moun te pran menm apwòch la. Erezman, gen anpil zouti ki disponib pou ede w deplwaye ak konfigirasyon pil nwaj yo.

Leson sa yo ap ede ou evite erè.

Sous: www.habr.com

Add nouvo kòmantè