Men umrim davomida bulutli shakllanish bilan ishlashning ushbu 6 ta saboqlarini o'rgandim.

bilan ishlay boshladim bulut shakllanishi 4 yil oldin. O'shandan beri men ko'plab infratuzilmalarni, hatto ishlab chiqarishda bo'lganlarini ham buzdim. Ammo har safar biror narsani buzganimda, men yangi narsalarni o'rgandim. Ushbu tajriba orqali men o'rgangan eng muhim saboqlarim bilan o'rtoqlashaman.

Men umrim davomida bulutli shakllanish bilan ishlashning ushbu 6 ta saboqlarini o'rgandim.

1-dars: O'zgarishlarni joylashtirishdan oldin ularni sinab ko'ring

Men bu saboqni men bilan ishlashni boshlaganimdan keyin bilib oldim bulut shakllanishi. O'shanda aniq nimani buzganimni eslay olmayman, lekin men buyruqni ishlatganimni aniq eslayman aws bulut formatini yangilash. Bu buyruq qo'llaniladigan o'zgarishlarni tasdiqlamasdan, shablonni oddiygina chiqaradi. Nima uchun barcha o'zgarishlarni ularni joylashtirishdan oldin sinab ko'rishingiz kerakligi haqida hech qanday tushuntirish kerak deb o'ylamayman.

Ushbu muvaffaqiyatsizlikdan keyin men darhol o'zgardim tarqatish quvurlari, yangilash buyrug'ini buyruq bilan almashtirish yaratish-o'zgartirish-to'plam

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

O'zgarishlar to'plami yaratilgandan so'ng, u mavjud stekga ta'sir qilmaydi. Yangilash buyrug'idan farqli o'laroq, o'zgarishlar to'plami yondashuvi haqiqiy joylashtirishni ishga tushirmaydi. Buning o'rniga, siz joylashtirishdan oldin ko'rib chiqishingiz mumkin bo'lgan o'zgarishlar ro'yxatini yaratadi. O'zgarishlarni aws konsol interfeysida ko'rishingiz mumkin. Ammo agar siz hamma narsani avtomatlashtirishni xohlasangiz, ularni CLI-da tekshiring:

# 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

Ushbu buyruq quyidagiga o'xshash natijani berishi kerak:

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

Action joylashgan o'zgarishlarga alohida e'tibor bering almashtiring, o'chirish yoki qayerda Replacement Needed - To'g'ri. Bu eng xavfli o'zgarishlar va odatda ma'lumotlarning yo'qolishiga olib keladi.

O'zgarishlar ko'rib chiqilgandan so'ng, ularni joylashtirish mumkin

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-dars: Stack siyosatidan foydalanib, statistik manbalarni almashtirish yoki olib tashlashni oldini oling

Ba'zan o'zgarishlarni ko'rishning o'zi etarli emas. Biz hammamiz insonmiz va hammamiz xato qilamiz. Biz o'zgarishlar to'plamidan foydalanishni boshlaganimizdan ko'p o'tmay, mening jamoadoshim bilmagan holda joylashtirishni amalga oshirdi va natijada ma'lumotlar bazasi yangilandi. Hech qanday yomon narsa yuz bermadi, chunki bu sinov muhiti edi.

Skriptlarimiz oʻzgarishlar roʻyxatini koʻrsatib, tasdiqlashni soʻragan boʻlsa ham, “Oʻzgartirish” oʻzgarishlari oʻtkazib yuborildi, chunki oʻzgarishlar roʻyxati juda katta boʻlib, u ekranga sigʻmasdi. Va bu sinov muhitida oddiy yangilanish bo'lgani uchun, o'zgarishlarga unchalik e'tibor berilmadi.

Hech qachon almashtirishni yoki olib tashlashni xohlamaydigan resurslar mavjud. Bular RDS ma'lumotlar bazasi nusxasi yoki elasticsearch klasteri va boshqalar kabi holati to'liq bo'lgan xizmatlardir. Agar bajarilayotgan operatsiya bunday resursni o'chirishni talab qilsa, aws avtomatik ravishda joylashtirishni rad etsa yaxshi bo'lardi. Yaxshiyamki, cloudformation buni amalga oshirishning o'rnatilgan usuliga ega. Bu stek siyosati deb ataladi va siz bu haqda ko'proq ma'lumot olishingiz mumkin hujjatlar:

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-dars: Maxfiy parametrlar bilan stekni yangilashda UsePreviousValue-dan foydalaning

RDS mysql ob'ektini yaratganingizda, AWS sizdan MasterUsername va MasterUserPassword taqdim etishingizni talab qiladi. Manba kodida sir saqlamaslik yaxshiroq va men hamma narsani avtomatlashtirishni xohlaganim uchun, men "aqlli mexanizm" ni joriy qildim, u erda joylashtirishdan oldin hisob ma'lumotlari s3 dan olinadi va agar hisob ma'lumotlari topilmasa, yangi hisob ma'lumotlari yaratiladi va s3 da saqlanadi.

Keyin bu hisobga olish ma'lumotlari parametr sifatida cloudformation create-change-set buyrug'iga o'tkaziladi. Skript bilan tajriba o'tkazayotganda, s3 bilan aloqa uzilib qoldi va mening "aqlli mexanizm" uni yangi hisob ma'lumotlarini yaratish uchun signal sifatida ko'rdi.

Agar men ushbu skriptni ishlab chiqarishda ishlata boshlasam va ulanish muammosi yana sodir bo'lsa, u stekni yangi hisob ma'lumotlari bilan yangilaydi. Bunday holda, hech qanday yomon narsa bo'lmaydi. Biroq, men bu yondashuvdan voz kechdim va boshqasidan foydalanishni boshladim, hisob ma'lumotlarini faqat bir marta - stek yaratishda taqdim etdim. Keyinchalik, stekni yangilash kerak bo'lganda, parametrning maxfiy qiymatini belgilash o'rniga, men oddiygina foydalanardim. 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-dars: Orqaga qaytarish konfiguratsiyasidan foydalaning

Men ishlagan boshqa jamoa funksiyadan foydalangan bulut shakllanishichaqirdi orqaga qaytarish konfiguratsiyasi. Men buni ilgari uchratmagan edim va bu mening steklarimni joylashtirishni yanada salqinroq qilishini tezda angladim. Endi men har safar kodimni lambda yoki ECS-ga bulut formati yordamida joylashtirganimda foydalanaman.

Bu qanday ishlaydi: siz belgilaysiz CloudWatch signali parametrda --orqaga qaytarish-konfiguratsiyao'zgarishlar to'plamini yaratganingizda. Keyinchalik, bir qator o'zgarishlarni amalga oshirganingizda, aws signalni kamida bir daqiqa davomida kuzatib boradi. Bu vaqt ichida signal holatini ALARM ga o'zgartirsa, u o'rnatishni orqaga qaytaradi.

Quyida shablon parchasining namunasi keltirilgan bulut shakllanishiunda men yarataman bulutli soat signali, bu bulut foydalanuvchisi koʻrsatkichini bulut jurnallaridagi xatolar soni sifatida kuzatib boradi (koʻrsatkich orqali hosil qilinadi Metrik filtr):

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

Endi Ogohlantirish sifatida foydalanish mumkin orqaga qaytish asboblar panelini ishga tushirishda tetiklash:

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-dars: Shablonning so'nggi versiyasini o'rnatganingizga ishonch hosil qiling

Cloudformation shablonining eng so'nggi versiyasini o'rnatish oson, ammo bu juda ko'p zarar keltiradi. Bu biz bilan bir marta sodir bo'ldi: dasturchi Git-dan so'nggi o'zgarishlarni kiritmadi va stekning oldingi versiyasini o'rnatdi. Bu ushbu stekdan foydalangan ilovaning ishlamay qolishiga olib keldi.

Buni amalga oshirishdan oldin filialning yangilanganligini tekshirish uchun chek qo'shish kabi oddiy narsa yaxshi bo'lar edi (agar git versiyani boshqarish vositasi bo'lsa):

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-dars: G'ildirakni qayta ixtiro qilmang

bilan tarqatilayotgandek tuyulishi mumkin bulut shakllanishi - bu oson. Sizga shunchaki aws cli buyruqlarini bajaradigan bir qator bash skriptlari kerak bo'ladi.

4 yil oldin men aws cloudformation create-stack buyrug'i deb nomlangan oddiy skriptlardan boshladim. Tez orada skript oddiy emas edi. Har bir o'rganilgan dars skriptni yanada murakkablashtirdi. Bu nafaqat qiyin, balki xatolarga to'la edi.

Hozir men kichik IT bo'limida ishlayman. Tajriba shuni ko'rsatadiki, har bir jamoa bulutli steklarni joylashtirishning o'ziga xos usuliga ega. Va bu yomon. Hamma bir xil yondoshsa yaxshi bo'lardi. Yaxshiyamki, bulutformatsiya steklarini joylashtirish va sozlashda sizga yordam beradigan ko'plab vositalar mavjud.

Ushbu darslar xatolardan qochishga yordam beradi.

Manba: www.habr.com

a Izoh qo'shish