Ман ин 6 дарси кор бо абрро дар тӯли тамоми умр омӯхтам.

Ман ба кор шурӯъ кардам ташаккулёбии абрӣ 4 сол пеш. Аз он вақт инҷониб ман бисёр инфрасохторҳоро вайрон кардам, ҳатто онҳое, ки аллакай дар истеҳсол буданд. Аммо ҳар дафъае, ки ман чизеро вайрон мекардам, ман чизи навро омӯхтам. Тавассути ин таҷриба ман баъзе аз муҳимтарин дарсҳои гирифтаамро нақл мекунам.

Ман ин 6 дарси кор бо абрро дар тӯли тамоми умр омӯхтам.

Дарси 1: Тағиротро пеш аз ҷойгиркунии онҳо санҷед

Ман ин дарсро чанде пас аз кор карданам омӯхтам ташаккулёбии абрӣ. Ман дар ёд надорам, ки он вақт маҳз чиро шикаста будам, аммо ҳатман дар ёд дорам, ки фармонро истифода кардам Навсозии формати aws. Ин фармон танҳо шаблонро бе ягон тасдиқи тағиротҳое, ки ҷойгир карда мешаванд, мебарорад. Ман фикр намекунам, ки ягон тавзеҳоте лозим нест, ки чаро шумо бояд ҳамаи тағиротҳоро пеш аз ҷойгиркунии онҳо санҷед.

Пас аз ин нокомӣ ман дарҳол дигар шуд интиқоли қубурӣ, иваз кардани фармони навсозӣ бо фармон эҷод-тағйир-маҷмӯа

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

Пас аз сохтани маҷмӯи тағирот, он ба стеки мавҷуда таъсир намерасонад. Баръакси фармони навсозӣ, равиши тағирот ба густариши воқеӣ роҳ намедиҳад. Ба ҷои ин, он рӯйхати тағиротҳоро эҷод мекунад, ки шумо метавонед пеш аз ҷойгиркунӣ дида бароед. Шумо метавонед тағиротро дар интерфейси консол aws дидан кунед. Аммо агар шумо хоҳед, ки ҳама чизро автоматӣ кунед, пас онҳоро дар 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

Ин фармон бояд баромади шабеҳи зеринро тавлид кунад:

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

Диққати махсус ба тағирот дар куҷост, ки Action аст Иваз кунед, Нобуд ё дар куҷо Иваз кардан лозим аст - Дуруст. Ин тағиротҳои хатарноктаринанд ва одатан ба гум шудани иттилоот оварда мерасонанд.

Пас аз баррасии тағирот, онҳо метавонанд ҷойгир карда шаванд

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: Сиёсати стекро барои пешгирӣ кардани иваз ё нест кардани захираҳои давлатӣ истифода баред

Баъзан дидани тағирот кофӣ нест. Мо ҳама инсонем ва ҳама хато мекунем. Чанде пас аз он ки мо ба истифодаи тағиротҳо шурӯъ кардем, ҳамкори ман надониста ҷойгиркунӣ анҷом дод, ки дар натиҷа навсозии пойгоҳи додаҳо шуд. Ҳеҷ чизи бад рӯй надодааст, зеро он муҳити санҷишӣ буд.

Гарчанде ки скриптҳои мо рӯйхати тағиротро нишон медоданд ва барои тасдиқ дархост мекарданд, тағироти Иваз кардан гузаронида шуд, зеро рӯйхати тағирот хеле калон буд, ки он дар экран мувофиқ набуд. Ва азбаски ин як навсозии муқаррарӣ дар муҳити санҷиш буд, ба тағирот аҳамияти зиёд дода нашуд.

Захираҳо вуҷуд доранд, ки шумо ҳеҷ гоҳ иваз кардан ё нест кардан намехоҳед. Инҳо хидматҳои пурраи давлатӣ мебошанд, ба монанди мисоли пойгоҳи додаи RDS ё кластери elasticsearch ва ғайра. Хуб мешуд, агар aws ба таври худкор ҷойгиркуниро рад кунад, агар амалиёти иҷрошаванда ҳазфи чунин захираро талаб кунад. Хушбахтона, cloudformation як роҳи дарунсохтаи ин корро дорад. Ин сиёсати стек номида мешавад ва шумо метавонед дар ин бора бештар хонед хуччатхо:

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: Ҳангоми навсозии стек бо параметрҳои махфӣ UsePreviousValue -ро истифода баред

Вақте ки шумо як объекти RDS mysql эҷод мекунед, AWS аз шумо талаб мекунад, ки номи MasterUsername ва MasterUserPassword пешниҳод кунед. Азбаски беҳтар аст, ки сиррро дар коди ибтидоӣ нигоҳ надорам ва ман мехостам ҳама чизро автоматӣ кунам, ман як "механизми интеллектуалӣ" -ро татбиқ кардам, ки пеш аз ҷойгиркунӣ маълумот аз s3 гирифта мешавад ва агар маълумоти эътимоднома пайдо нашавад, эътимодномаҳои нав тавлид мешаванд ва дар s3 нигоҳ дошта мешавад.

Пас аз он ин эътимодномаҳо ҳамчун параметр ба фармони cloudformation create-change-set интиқол дода мешаванд. Ҳангоми озмоиш бо скрипт чунин рӯй дод, ки пайвастшавӣ бо s3 гум шуд ва "механизми интеллектуалӣ"-и ман онро ҳамчун сигнал барои тавлиди эътимодномаҳои нав баррасӣ кард.

Агар ман ба истифодаи ин скрипт дар истеҳсолот шурӯъ кардам ва мушкилоти пайвастшавӣ дубора рӯй дод, он стекро бо маълумоти нав навсозӣ мекард. Дар ин ҳолат, ҳеҷ чизи бад рӯй нахоҳад дод. Аммо, ман аз ин равиш даст кашидам ва истифодаи дигареро оғоз кардам, танҳо як маротиба эътимоднома пешниҳод кардам - ​​ҳангоми сохтани стек. Ва баъдтар, вақте ки стек ба навсозӣ ниёз дорад, ба ҷои муайян кардани арзиши махфии параметр, ман танҳо истифода мебарам 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: Истифодаи конфигуратсияи бозгашт

Дастаи дигаре, ки ман бо он кор мекардам, ин функсияро истифода бурд ташаккулёбии абрӣдаъват кард конфигуратсияи бозгашт. Ман қаблан онро надида будам ва зуд фаҳмидам, ки ин ҷойгиркунии стекҳои маро боз ҳам сардтар мекунад. Ҳоло ман онро ҳар дафъа истифода мебарам, ки коди худро дар lambda ё ECS бо истифода аз cloudformation ҷойгир мекунам.

Чӣ тавр он кор мекунад: шумо муайян мекунед Ҳушдори CloudWatch дар параметр --баргашт-конфигуратсиявақте ки шумо маҷмӯи тағиротро эҷод мекунед. Баъдтар, вақте ки шумо маҷмӯи тағиротҳоро иҷро мекунед, aws ҳушдорро ҳадди аққал як дақиқа назорат мекунад. Агар ҳушдор дар давоми ин вақт ҳолати ҳушдорро ба ALARM иваз кунад, он ҷойгиркуниро бармегардонад.

Дар зер намунаи иқтибос аз шаблон оварда шудааст ташаккулёбии абрӣки дар он ман эчод мекунам ҳушдор дар абр, ки метрикаи корбари абрро ҳамчун шумораи хатогиҳо дар гузоришҳои абр пайгирӣ мекунад (метрика тавассути тавлид мешавад 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

Акнун ҳушдор ҳамчун истифода бурдан мумкин аст бозгашт триггер ҳангоми иҷро кардани қуттии асбобҳо:

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: Боварӣ ҳосил кунед, ки шумо версияи охирини қолабро ҷойгир мекунед

Ҷойгир кардани версияи камтар аз охирини қолаби формати абрӣ осон аст, аммо ин кор боиси зарари зиёд мегардад. Ин як бор бо мо рӯй дод: таҳиякунанда тағйироти охиринро аз Git пахш накард ва надониста версияи қаблии стекро ҷойгир кард. Ин боиси бекористии барномае гардид, ки ин стекро истифода мебарад.

Як чизи оддӣ ба монанди илова кардани чек барои дидани он, ки филиал пеш аз анҷом додани он навсозӣ мешавад, хуб мебуд (фарз мекунем, ки git воситаи идоракунии версияи шумост):

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: Чархро аз нав ихтироъ накунед

Чунин ба назар мерасад, ки бо ташаккулёбии абрӣ — осон аст. Ба шумо танҳо як даста скриптҳои bash лозим аст, ки фармонҳои aws cli-ро иҷро мекунанд.

4 сол пеш ман бо скриптҳои оддӣ бо номи фармони aws cloudformation create-stack оғоз кардам. Дере нагузашта скрипт дигар оддӣ набуд. Хар як дарси омухташуда сценарияро торафт мураккабтар мегардонд. Ин на танхо душвор, балки пур аз хатохо хам буд.

Ҳоло ман дар як шӯъбаи хурди IT кор мекунам. Таҷриба нишон медиҳад, ки ҳар як даста роҳи худро барои ҷойгиркунии стекҳои абрӣ дорад. Ва ин бад аст. Бехтар мешуд, ки хама як хел муносибат мекарданд. Хушбахтона, асбобҳои зиёде мавҷуданд, ки ба шумо барои ҷойгир кардан ва танзим кардани стекҳои абрии абрӣ кӯмак мерасонанд.

Ин дарсҳо ба шумо кӯмак мекунанд, ки хатогиҳоро пешгирӣ кунед.

Манбаъ: will.com

Илова Эзоҳ