Életem hátralévő részében megtanultam ezt a 6 leckét a felhőképzéssel való munkavégzésről.

elkezdtem dolgozni felhőképződés 4 évvel ezelőtt. Azóta sok infrastruktúrát feltörtem, még azokat is, amelyek már gyártásban voltak. De valahányszor elrontottam valamit, tanultam valami újat. Ezen a tapasztalaton keresztül megosztom a legfontosabb leckéket, amelyeket megtanultam.

Életem hátralévő részében megtanultam ezt a 6 leckét a felhőképzéssel való munkavégzésről.

1. lecke: Tesztelje a változtatásokat a telepítés előtt

Nem sokkal azután tanultam meg ezt a leckét, hogy elkezdtem vele dolgozni felhőképződés. Nem emlékszem, hogy akkor pontosan mit rontottam el, de arra határozottan emlékszem, hogy használtam a parancsot aws cloudformation frissítés. Ez a parancs egyszerűen kiadja a sablont a telepítendő változtatások ellenőrzése nélkül. Nem hiszem, hogy szükség lenne magyarázatra arra, hogy miért kell minden változtatást tesztelni a telepítés előtt.

E kudarc után azonnal megváltoztam telepítési csővezeték, az update parancsot a paranccsal helyettesítve létrehozás-változtatás-készlet

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

A módosításkészlet létrehozása után nincs hatással a meglévő veremre. A frissítési paranccsal ellentétben a Changeset megközelítés nem váltja ki a tényleges telepítést. Ehelyett létrehoz egy listát a módosításokról, amelyeket áttekinthet a telepítés előtt. A változásokat az aws konzol felületén tekintheti meg. De ha inkább mindent automatizál, amit csak lehet, akkor ellenőrizze őket a CLI-ben:

# 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

Ennek a parancsnak a következőhöz hasonló kimenetet kell produkálnia:

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

Fordítson különös figyelmet azokra a változásokra, ahol az Action van Cserélje, töröl vagy hol ReplacementNeeded – igaz. Ezek a legveszélyesebb változások, és általában információvesztéshez vezetnek.

A változtatások áttekintése után telepíthetők

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"

2. lecke: Használjon veremházirendet, hogy megakadályozza az állapotalapú erőforrások lecserélését vagy eltávolítását

Néha nem elég csupán a változások megtekintése. Mindannyian emberek vagyunk, és mindannyian követünk el hibákat. Röviddel azután, hogy elkezdtük használni a changeseteket, csapattársam tudtán kívül hajtott végre egy központi telepítést, amely adatbázis frissítést eredményezett. Semmi rossz nem történt, mert ez egy tesztkörnyezet volt.

Annak ellenére, hogy szkriptjeink megjelenítették a módosítások listáját, és megerősítést kértek, a Csere módosítás kimaradt, mert a változtatások listája olyan nagy volt, hogy nem fért el a képernyőn. És mivel ez egy tesztkörnyezetben szokásos frissítés volt, nem sok figyelmet fordítottak a változtatásokra.

Vannak olyan források, amelyeket soha nem szeretne lecserélni vagy eltávolítani. Ezek állapotteljes szolgáltatások, például egy RDS-adatbázispéldány vagy egy elaszticsearch-fürt stb. Jó lenne, ha az aws automatikusan visszautasítaná a telepítést, ha a végrehajtott művelet egy ilyen erőforrás törlését igényelné. Szerencsére a felhőformálásnak beépített módja van ennek. Ezt veremházirendnek hívják, és bővebben itt olvashat dokumentáció:

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"

3. lecke: Használja a UsePreviousValue értéket a verem titkos paraméterekkel történő frissítéséhez

Amikor létrehoz egy RDS mysql entitást, az AWS megköveteli a MasterUsername és a MasterUserPassword megadását. Mivel jobb nem titkolózni a forráskódban, és abszolút mindent automatizálni akartam, bevezettem egy "okos mechanizmust", ahol a telepítés előtt az s3-ból megkapják a hitelesítési adatokat, és ha nem találhatók meg a hitelesítő adatok, akkor új hitelesítő adatok generálódnak és s3-ban tárolva.

Ezek a hitelesítő adatok ezután paraméterként kerülnek átadásra a cloudformation create-change-set parancsnak. A szkripttel való kísérletezés során előfordult, hogy megszakadt a kapcsolat az s3-mal, és az „okos mechanizmusom” azt jelként kezelte, hogy új hitelesítő adatokat generáljon.

Ha elkezdem használni ezt a szkriptet éles környezetben, és a kapcsolódási probléma ismét megismétlődik, akkor az új hitelesítő adatokkal frissítené a veremet. Ebben a konkrét esetben semmi rossz nem fog történni. Azonban felhagytam ezzel a megközelítéssel, és egy másikat kezdtem használni, amely csak egyszer adtam meg a hitelesítő adatokat - a verem létrehozásakor. És később, amikor a verem frissítésre szorul, a paraméter titkos értékének megadása helyett egyszerűen a 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"

4. lecke: Használja a visszaállítási konfigurációt

Egy másik csapat, akivel dolgoztam, használta a funkciót felhőképződéshívott visszaállítási konfiguráció. Korábban nem találkoztam vele, és hamar rájöttem, hogy így még menőbb lesz a veremek telepítése. Mostantól minden alkalommal használom, amikor a kódomat lambda- vagy ECS-rendszerbe helyezem felhőformálás segítségével.

Hogyan működik: megadod CloudWatch riasztás arn paraméterben --rollback-configurationváltozáskészlet létrehozásakor. Később, amikor végrehajtja a módosításokat, az aws legalább egy percig figyeli a riasztást. Visszaállítja a telepítést, ha ezalatt a riasztás állapota ALARM-ra változik.

Az alábbiakban egy példa egy sablonrészletre látható felhőképződésamelyben létrehozom cloudwatch riasztó, amely egy felhő-felhasználói metrikát követ nyomon a felhőnaplókban lévő hibák számaként (a mérőszámot 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

Most riasztás mint rollback trigger az eszköztár végrehajtásakor:

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"

5. lecke: Ügyeljen arra, hogy telepítse a sablon legújabb verzióját

Könnyű telepíteni a felhőformálási sablon legfrissebb verzióját, de ez sok kárt okoz. Ez egyszer megtörtént velünk: egy fejlesztő nem nyomta le a Git legújabb módosításait, és tudtán kívül telepítette a verem egy korábbi verzióját. Ez leállást eredményezett az ezt a veremet használó alkalmazásban.

Valami olyan egyszerű, mint egy ellenőrzés hozzáadása, hogy megbizonyosodjon arról, hogy az ág naprakész-e, mielőtt elkötelezné magát (feltéve, hogy a git a verzióvezérlő eszköz):

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

6. lecke: Ne találd fel újra a kereket

Úgy tűnhet, mint a telepítés felhőképződés - könnyű. Csak egy csomó bash szkriptre van szüksége az aws cli parancsok végrehajtásához.

4 évvel ezelőtt az aws cloudformation create-stack parancsnak nevezett egyszerű szkriptekkel kezdtem. Hamarosan a forgatókönyv már nem volt egyszerű. Minden egyes tanulság egyre bonyolultabbá tette a forgatókönyvet. Nem csak nehéz volt, de tele is volt hibákkal.

Jelenleg egy kis informatikai osztályon dolgozom. A tapasztalat azt mutatja, hogy minden csapatnak megvan a maga módja a felhőformálási veremek telepítésére. És ez rossz. Jobb lenne, ha mindenki ugyanazt a megközelítést alkalmazná. Szerencsére számos eszköz áll rendelkezésre a felhőformálási veremek telepítéséhez és konfigurálásához.

Ezek a leckék segítenek elkerülni a hibákat.

Forrás: will.com

Hozzászólás