Ech hunn dës 6 Lektioune geléiert mat der Cloudformatioun fir de Rescht vu mengem Liewen ze schaffen.

Ech ugefaang mat ze schaffen Wollek Formatioun Virun 4 Joer. Zanterhier hunn ech vill Infrastrukturen gebrach, och déi, déi schonn an der Produktioun waren. Awer all Kéier wann ech eppes verstoppt hunn, hunn ech eppes Neies geléiert. Duerch dës Erfahrung wäert ech e puer vun de wichtegste Lektioune deelen, déi ech geléiert hunn.

Ech hunn dës 6 Lektioune geléiert mat der Cloudformatioun fir de Rescht vu mengem Liewen ze schaffen.

Lektioun 1: Test Ännerungen ier se ofgesat ginn

Ech hunn dës Lektioun geschwënn geléiert nodeems ech ugefaang hunn mat ze schaffen Wollek Formatioun. Ech erënnere mech net wat ech dunn gebrach hunn, awer ech erënnere mech definitiv datt ech de Kommando benotzt hunn aws Cloudformation Update. Dëse Kommando rullt einfach d'Schabloun aus ouni Validatioun vun den Ännerungen déi ofgesat ginn. Ech denken net datt eng Erklärung néideg ass firwat Dir all Ännerungen sollt testen ier Dir se ofsetzt.

No dësem Echec hunn ech direkt geännert Installatioun pipeline, ersetzt den Update Kommando mam Kommando schafen-Ännerung-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"

Wann e Changement erstallt ass, huet et keen Effekt op de existente Stack. Am Géigesaz zum Update Kommando ausléist d'Ännereet-Approche net déi aktuell Deployment. Amplaz erstellt et eng Lëscht vun Ännerungen déi Dir virum Deployment iwwerpréift. Dir kënnt d'Ännerungen an der aws Konsol Interface gesinn. Awer wann Dir léiwer alles automatiséiert wat Dir kënnt, da kontrolléiert se am 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

Dëse Kommando soll Ausgang ähnlech wéi déi folgend produzéieren:

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

Opgepasst besonnesch op Ännerungen wou Action ass schounen, läsche oder wou Ersatz néideg - richteg. Dëst sinn déi geféierlechst Ännerungen a féieren normalerweis zu Informatiounsverloscht.

Wann d'Ännerungen iwwerpréift goufen, kënne se agesat ginn

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"

Lektioun 2: Benotzt Stack Politik fir ze verhënneren datt statesch Ressourcen ersat oder geläscht ginn

Heiansdo ass einfach d'Ännerunge kucken net genuch. Mir sinn all Mënsch a mir maachen all Feeler. Kuerz nodeems mir ugefaang Changementsets ze benotzen, huet mäi Teamkolleg onbewosst eng Deployment gemaach, déi zu engem Datebankupdate gefouert huet. Näischt Schlecht ass geschitt well et en Testëmfeld war.

Och wann eis Skripte eng Lëscht vun Ännerungen ugewisen hunn an no Bestätegung gefrot hunn, gouf d'Ännerung Ersatz iwwersprongen well d'Lëscht vun den Ännerungen sou grouss war datt se net um Bildschierm gepasst huet. A well dëst en normalen Update an engem Testëmfeld war, gouf net vill Opmierksamkeet op d'Ännerunge bezuelt.

Et gi Ressourcen déi Dir ni wëllt ersetzen oder ewechhuelen. Dëst sinn statefull Servicer, wéi eng RDS Datebank Instanz oder en elasticsearch Stärekoup, etc.. Et wier flott wann aws automatesch Deployment refuséieren wann d'Operatioun déi duerchgefouert gëtt, esou eng Ressource ze läschen. Glécklecherweis huet d'Cloudformatioun e agebaute Wee fir dëst ze maachen. Dëst gëtt Stack Politik genannt, an Dir kënnt méi doriwwer liesen an Dokumentatioun:

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"

Lektioun 3: Benotzt UsePreviousValue wann Dir e Stack mat geheime Parameteren aktualiséiert

Wann Dir eng RDS mysql Entitéit erstellt, erfuerdert AWS datt Dir e MasterUsername a MasterUserPassword gitt. Well et besser ass net Geheimnisser am Quellcode ze halen an ech wollt absolut alles automatiséieren, hunn ech e "Smart Mechanismus" implementéiert wou virum Ofbau d'Umeldungsinformatiounen aus s3 kritt ginn, a wann d'Umeldungsinformatiounen net fonnt ginn, ginn nei Umeldungsinformatiounen generéiert an gespäichert an s3.

Dës Umeldungsinformatiounen ginn dann als Parameter un de Cloudformation create-change-set Kommando weiderginn. Beim Experimentéiere mam Skript ass et geschitt datt d'Verbindung mat s3 verluer ass, a mäi "Smart Mechanismus" huet et als Signal behandelt fir nei Umeldungsinformatiounen ze generéieren.

Wann ech ugefaang dëst Skript an der Produktioun ze benotzen an de Verbindungsproblem ass erëm geschitt, da géif et de Stack mat neien Umeldungsinformatiounen aktualiséieren. An dësem bestëmmte Fall wäert näischt Schlechtes geschéien. Wéi och ëmmer, ech hunn dës Approche opginn an hunn ugefaang eng aner ze benotzen, déi Umeldungsinformatiounen nëmmen eemol ubidden - wann Dir de Stack erstellt. A méi spéit, wann de Stack aktualiséiert muss ginn, anstatt de geheime Wäert vum Parameter ze spezifizéieren, géif ech einfach benotzen UsePreviousValue=true:

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"

Lektioun 4: Benotzt rollback Configuratioun

Eng aner Equipe, mat där ech geschafft hunn, huet d'Funktioun benotzt Wollek Formatioun, genannt rollback Configuratioun. Ech war et net virdru begéint a séier gemierkt datt et meng Stacks nach méi cool mécht. Elo benotzen ech et all Kéier wann ech mäi Code op Lambda oder ECS ofsetzen mat Cloudformatioun.

Wéi et funktionnéiert: Dir spezifizéiert CloudWatch Alarm arn am Parameter --rollback-configurationwann Dir e Changement erstellt. Méi spéit, wann Dir eng Rei vun Ännerungen ausféiert, iwwerwaacht aws den Alarm op d'mannst eng Minutt. Et rullt den Ofbau zréck wann den Alarm während dëser Zäit den Zoustand op ALARM ännert.

Drënner ass e Beispill vun engem Schabloun Extrait Wollek Formatiounan deem ech schafen cloudwatch Alarm, déi eng Cloud User Metrik verfollegt wéi d'Zuel vu Feeler an de Cloud Logbicher (d'Metrik gëtt via 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

Elo Alarm ka benotzt ginn als erëm zeréck Ausléiser wann Dir Toolbox ausféiert:

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"

Lektioun 5: Gitt sécher datt Dir déi lescht Versioun vun der Schabloun installéiert

Et ass einfach eng manner wéi déi lescht Versioun vun der Cloudformation Schabloun z'installéieren, awer dëst ze maachen wäert vill Schued verursaachen. Dëst ass eis eemol geschitt: en Entwéckler huet déi lescht Ännerunge vum Git net gedréckt an onbewosst eng fréier Versioun vum Stack ofgesat. Dëst huet zu Downtime gefouert fir d'Applikatioun déi dëse Stack benotzt huet.

Eppes sou einfach wéi e Scheck derbäizefügen fir ze kucken ob d'Branche aktuell ass ier Dir et engagéiert wier gutt (ugeholl datt Git Äert Versiounskontrollinstrument ass):

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

Lektioun 6: Erfannen d'Rad net nei

Et kann schéngen wéi deployéieren mat Wollek Formatioun - et ass einfach. Dir braucht just eng Rëtsch Bash Scripten déi aws cli Kommandoen ausféieren.

Virun 4 Joer hunn ech ugefaang mat einfache Skripte genannt aws Cloudformation create-stack Kommando. Geschwënn war de Skript net méi einfach. All geléiert Lektioun huet de Skript ëmmer méi komplex gemaach. Et war net nëmme schwéier, mee och voller Käfere.

Ech schaffen am Moment an engem klengen IT Departement. D'Erfahrung huet gewisen datt all Team säin eegene Wee huet fir Cloudformation Stacks z'installéieren. An dat ass schlecht. Et wier besser, wann jidderee déi selwecht Approche géif huelen. Glécklecherweis sinn et vill Tools verfügbar fir Iech ze hëllefen d'Cloudformation Stacks z'installéieren an ze konfiguréieren.

Dës Lektioune hëllefen Iech Feeler ze vermeiden.

Source: will.com

Setzt e Commentaire