Nakat-on ko niining 6 ka mga leksyon sa pagtrabaho uban sa cloudformation sa tibuok nakong kinabuhi.

Nagsugod ko sa pagtrabaho uban sa pagporma sa panganod 4 ka tuig na ang milabay. Sukad niadto daghan na kog naguba nga mga imprastraktura, bisan ang mga naa na sa produksiyon. Apan sa matag higayon nga magsamok ko, nakakat-on ko og bag-ong butang. Pinaagi niini nga kasinatian, akong ipaambit ang pipila sa labing importante nga mga leksyon nga akong nakat-unan.

Nakat-on ko niining 6 ka mga leksyon sa pagtrabaho uban sa cloudformation sa tibuok nakong kinabuhi.

Leksyon 1: Sulayi ang mga pagbag-o sa dili pa kini i-deploy

Nakat-unan nako kini nga leksyon pagkahuman nako nagsugod sa pagtrabaho pagporma sa panganod. Wala ko kahinumdom kung unsa gyud ang akong nabuak kaniadto, apan nakahinumdom gyud ko nga gigamit nako ang mando aws cloudformation update. Kini nga sugo yano nga nag-roll out sa template nga walay bisan unsa nga validation sa mga kausaban nga i-deploy. Sa akong hunahuna wala’y kinahanglan nga katin-awan kung ngano nga kinahanglan nimo nga sulayan ang tanan nga mga pagbag-o sa wala pa i-deploy kini.

Human niini nga kapakyasan, nausab dayon ko pag-deploy sa tubo, ilisan ang update command sa command paghimo-pagbag-o-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"

Sa higayon nga ang usa ka changeset nahimo, kini walay epekto sa kasamtangan nga stack. Dili sama sa update nga sugo, ang changeset nga pamaagi wala mag-trigger sa aktuwal nga pag-deploy. Hinuon, naghimo kini usa ka lista sa mga pagbag-o nga mahimo nimong susihon sa wala pa i-deploy. Mahimo nimong tan-awon ang mga pagbag-o sa interface sa aws console. Apan kung gusto nimo nga i-automate ang tanan nga imong mahimo, unya susihon kini sa 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

Kini nga sugo kinahanglan nga magpatunghag output nga susama sa mosunod:

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

Hatagi og espesyal nga pagtagad ang mga pagbag-o kung asa ang Aksyon Ibalik, Tangtanga o asa Gikinahanglan ang Pagpuli - Tinuod. Kini ang labing delikado nga mga pagbag-o ug sagad nga hinungdan sa pagkawala sa kasayuran.

Kung masusi na ang mga pagbag-o, mahimo na silang i-deploy

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"

Leksyon 2: Gamita ang stack policy aron mapugngan ang stateful resources nga mapulihan o matangtang

Usahay ang pagtan-aw lang sa mga pagbag-o dili igo. Kitang tanan tawo ug kitang tanan masayop. Wala madugay human mi nagsugod sa paggamit sa mga changeset, ang akong kauban sa team wala mahibalo nga mihimo og deployment nga miresulta sa pag-update sa database. Wala’y daotan nga nahitabo tungod kay kini usa ka palibot sa pagsulay.

Bisan kung ang among mga script nagpakita sa usa ka lista sa mga pagbag-o ug nangayo alang sa kumpirmasyon, ang Pag-ilis nga pagbag-o gilaktawan tungod kay ang lista sa mga pagbag-o dako kaayo nga dili kini mohaum sa screen. Ug tungod kay kini usa ka normal nga pag-update sa usa ka palibot sa pagsulay, wala’y daghang pagtagad ang gihatag sa mga pagbag-o.

Adunay mga kapanguhaan nga dili nimo gusto ilisan o tangtangon. Kini mga statefull nga mga serbisyo, sama sa usa ka RDS database instance o usa ka elasticsearch cluster, ug uban pa. Maayo kung ang aws awtomatik nga magdumili sa pag-deploy kung ang operasyon nga gihimo kinahanglan nga tangtangon ang ingon nga kapanguhaan. Maayo na lang, ang cloudformation adunay usa ka built-in nga paagi aron mahimo kini. Gitawag kini nga palisiya sa stack, ug mahimo nimong mabasa ang dugang bahin niini sa dokumentasyon:

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"

Leksyon 3: Gamita ang UsePreviousValue kung mag-update sa usa ka stack nga adunay sekreto nga mga parameter

Kung maghimo ka usa ka RDS mysql entity, ang AWS kinahanglan nimo nga maghatag usa ka MasterUsername ug MasterUserPassword. Tungod kay mas maayo nga dili itago ang mga sekreto sa source code ug gusto nako nga i-automate ang tanan, gipatuman nako ang usa ka "smart mechanism" diin sa dili pa i-deploy ang mga kredensyal makuha gikan sa s3, ug kung ang mga kredensyal dili makit-an, ang mga bag-ong kredensyal namugna ug gitipigan sa s3.

Kini nga mga kredensyal ipasa isip mga parameter sa cloudformation create-change-set command. Samtang nag-eksperimento sa script, nahitabo nga ang koneksyon sa s3 nawala, ug ang akong "smart nga mekanismo" nagtratar niini isip usa ka signal aron makamugna og bag-ong mga kredensyal.

Kung nagsugod ako sa paggamit niini nga script sa produksiyon ug ang problema sa koneksyon nahitabo pag-usab, kini mag-update sa stack sa bag-ong mga kredensyal. Niini nga partikular nga kaso, walay daotang mahitabo. Bisan pa, gibiyaan nako kini nga pamaagi ug nagsugod sa paggamit sa lain, nga naghatag mga kredensyal kausa ra - sa paghimo sa stack. Ug sa ulahi, kung kinahanglan nga i-update ang stack, imbis nga ipiho ang sekreto nga kantidad sa parameter, gamiton ra nako UsePreviousValue=tinuod:

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"

Leksyon 4: Gamita ang rollback configuration

Ang laing team nga akong gitrabahoan migamit sa function pagporma sa panganod, gitawag rollback configuration. Wala pa nako kini makit-an kaniadto ug dali nga nakaamgo nga kini maghimo sa pag-deploy sa akong mga stack nga labi ka bugnaw. Karon gigamit nako kini sa matag higayon nga i-deploy nako ang akong code sa lambda o ECS gamit ang cloudformation.

Giunsa kini paglihok: imong gitino CloudWatch alarma sa parameter --rollback-konfigurasyonkung maghimo ka ug changeset. Sa ulahi, kung maghimo ka usa ka hugpong sa mga pagbag-o, ang aws mag-monitor sa alarma bisan usa ka minuto. Gipabalik niini ang deployment kung ang alarma mausab ang estado sa ALARM niining panahona.

Sa ubos usa ka pananglitan sa usa ka kinutlo sa template pagporma sa panganoddiin ako nagbuhat alarma sa cloudwatch, nga nagsubay sa sukdanan sa user sa panganod isip ang gidaghanon sa mga sayop sa cloud logs (ang metric gihimo pinaagi sa 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

Karon alarma mahimong gamiton ingon pagbalik trigger sa diha nga nagpatuman sa toolbox:

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"

Leksyon 5: Siguroha nga imong i-deploy ang pinakabag-o nga bersyon sa template

Sayon ra ang pag-deploy sa dili kaayo bag-o nga bersyon sa template sa cloudformation, apan ang paghimo niini makapahinabog daghang kadaot. Nahitabo kini kanamo kausa: ang usa ka developer wala magduso sa labing bag-ong mga pagbag-o gikan sa Git ug wala nahibal-an nga nag-deploy sa miaging bersyon sa stack. Kini miresulta sa downtime alang sa aplikasyon nga migamit niini nga stack.

Usa ka butang nga yano sama sa pagdugang sa usa ka tseke aron mahibal-an kung ang sanga bag-o ba sa wala pa kini buhaton nga maayo (sa paghunahuna nga ang git mao ang imong tool sa pagkontrol sa bersyon):

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

Leksyon 6: Ayaw pag-usab sa ligid

Kini daw sama sa pagdeploy uban sa pagporma sa panganod - sayon ​​ra. Kinahanglan nimo ang usa ka hugpong sa mga bash script nga nagpatuman sa mga aws cli nga mga mando.

4 ka tuig ang milabay nagsugod ko sa yano nga mga script nga gitawag nga aws cloudformation create-stack command. Sa wala madugay ang script dili na yano. Ang matag leksyon nga nakat-unan naghimo sa script nga labi ka komplikado. Dili lamang kini lisud, apan puno usab sa mga bug.

Nagtrabaho ko karon sa usa ka gamay nga departamento sa IT. Gipakita sa kasinatian nga ang matag team adunay kaugalingon nga paagi sa pag-deploy sa mga stack sa cloudformation. Ug kana daotan. Mas maayo kung parehas ang pamaagi sa tanan. Maayo na lang, adunay daghang mga himan nga magamit aron matabangan ka sa pag-deploy ug pag-configure sa mga stack sa cloudformation.

Kini nga mga leksyon makatabang kanimo sa paglikay sa mga kasaypanan.

Source: www.habr.com

Idugang sa usa ka comment