Mo kọ awọn ẹkọ 6 wọnyi ti ṣiṣẹ pẹlu awọsanma fun iyoku igbesi aye mi.

Mo bẹrẹ ṣiṣẹ pẹlu awọsanma 4 odun seyin. Lati igbanna Mo ti fọ ọpọlọpọ awọn amayederun, paapaa awọn ti o ti wa tẹlẹ ni iṣelọpọ. Ṣugbọn ni gbogbo igba ti Mo ba nkan jẹ, Mo kọ nkan tuntun. Nipasẹ iriri yii, Emi yoo pin diẹ ninu awọn ẹkọ pataki julọ ti Mo kọ.

Mo kọ awọn ẹkọ 6 wọnyi ti ṣiṣẹ pẹlu awọsanma fun iyoku igbesi aye mi.

Ẹkọ 1: Ṣe idanwo awọn ayipada ṣaaju gbigbe wọn

Mo kọ ẹkọ yii ni kete lẹhin ti Mo bẹrẹ ṣiṣẹ pẹlu awọsanma. Emi ko ranti kini gangan ti Mo fọ lẹhinna, ṣugbọn dajudaju Mo ranti pe Mo lo aṣẹ naa aws cloudformation imudojuiwọn. Aṣẹ yii kan yipo awoṣe laisi eyikeyi afọwọsi ti awọn ayipada ti yoo ran lọ. Emi ko ro pe eyikeyi alaye nilo fun idi ti o yẹ ki o ṣe idanwo gbogbo awọn ayipada ṣaaju gbigbe wọn.

Lẹhin ikuna yii, Mo yipada lẹsẹkẹsẹ opo gigun ti epo, rọpo pipaṣẹ imudojuiwọn pẹlu aṣẹ ṣẹda-ayipada-ṣeto

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

Ni kete ti a ṣẹda changeet, ko ni ipa lori akopọ to wa tẹlẹ. Ko dabi aṣẹ imudojuiwọn, ọna changeet ko ṣe okunfa imuṣiṣẹ gangan. Dipo, o ṣẹda atokọ ti awọn ayipada ti o le ṣe atunyẹwo ṣaaju imuṣiṣẹ. O le wo awọn ayipada ni wiwo console aws. Ṣugbọn ti o ba fẹ lati ṣe adaṣe ohun gbogbo ti o le, lẹhinna ṣayẹwo wọn ni 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

Aṣẹ yii yẹ ki o gbejadejade iru si atẹle naa:

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

San ifojusi pataki si awọn iyipada nibiti Iṣe wa Rọpo, pa tabi ibo Nilo Iyipada - Otitọ. Iwọnyi jẹ awọn iyipada ti o lewu julọ ati nigbagbogbo ja si isonu ti alaye.

Ni kete ti awọn ayipada ti ni atunyẹwo, wọn le wa ni ransogun

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"

Ẹkọ 2: Lo eto imulo akopọ lati ṣe idiwọ awọn orisun ipinlẹ lati rọpo tabi yọkuro

Nigba miiran wiwo awọn ayipada nikan ko to. Gbogbo wa jẹ eniyan ati pe gbogbo wa ṣe awọn aṣiṣe. Laipẹ lẹhin ti a bẹrẹ lilo awọn iyipada, ẹlẹgbẹ ẹlẹgbẹ mi ṣe aimọkan imuṣiṣẹ kan eyiti o yorisi imudojuiwọn data data. Ko si ohun buburu ti o ṣẹlẹ nitori pe o jẹ agbegbe idanwo kan.

Paapaa botilẹjẹpe awọn iwe afọwọkọ wa ṣafihan atokọ ti awọn ayipada ati beere fun ijẹrisi, iyipada Rọpo ti fo nitori atokọ awọn ayipada tobi pupọ ti ko baamu loju iboju. Ati pe nitori pe eyi jẹ imudojuiwọn deede ni agbegbe idanwo, ko san akiyesi pupọ si awọn ayipada.

Awọn orisun wa ti o ko fẹ lati rọpo tabi yọkuro. Iwọnyi jẹ awọn iṣẹ ti ipinlẹ, gẹgẹbi apẹẹrẹ data data RDS tabi iṣupọ elasticsearch, bbl Yoo dara ti awọn aws yoo kọ imuṣiṣẹ laifọwọyi ti iṣẹ ṣiṣe yoo nilo piparẹ iru orisun kan. Ni Oriire, awọsanma awọsanma ni ọna ti a ṣe sinu lati ṣe eyi. Eyi ni a pe ni eto imulo akopọ, ati pe o le ka diẹ sii nipa rẹ ninu iwe:

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"

Ẹkọ 3: Lo UsePreviousValue nigba mimuṣe imudojuiwọn akopọ pẹlu awọn aye ikọkọ

Nigbati o ba ṣẹda nkan RDS mysql, AWS nilo ki o pese Orukọ olumulo Master ati Ọrọigbaniwọle MasterUser. Niwọn bi o ti dara julọ lati ma tọju awọn aṣiri ninu koodu orisun ati pe Mo fẹ lati ṣe adaṣe ohun gbogbo ni kikun, Mo ṣe imuse “ẹrọ ọgbọn” nibiti ṣaaju imuṣiṣẹ awọn iwe-ẹri yoo gba lati s3, ati pe ti ko ba rii awọn iwe-ẹri, awọn iwe-ẹri tuntun ti ipilẹṣẹ ati ti a fipamọ sinu s3.

Awọn iwe-ẹri wọnyi yoo kọja bi awọn ayeraye si aṣẹ-ṣeto-iyipada awọsanma. Lakoko ti o n ṣe idanwo pẹlu iwe afọwọkọ naa, o ṣẹlẹ pe asopọ si s3 ti sọnu, ati pe “ẹrọ ọgbọn” mi ṣe itọju rẹ bi ifihan agbara lati ṣe awọn iwe-ẹri tuntun.

Ti MO ba bẹrẹ lilo iwe afọwọkọ yii ni iṣelọpọ ati iṣoro asopọ naa tun ṣẹlẹ, yoo ṣe imudojuiwọn akopọ pẹlu awọn iwe-ẹri tuntun. Ni ọran yii pato, ko si ohun buburu ti yoo ṣẹlẹ. Sibẹsibẹ, Mo kọ ọna yii silẹ ati bẹrẹ lilo miiran, pese awọn iwe-ẹri ni ẹẹkan - nigbati o ṣẹda akopọ. Ati nigbamii, nigbati akopọ ba nilo imudojuiwọn, dipo sisọ pato iye aṣiri ti paramita naa, Emi yoo rọrun lo UsePreviousValue=otitọ:

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"

Ẹkọ 4: Lo atunto yipo pada

Ẹgbẹ miiran ti Mo ṣiṣẹ pẹlu lo iṣẹ naa awọsanma, ti a npe ni rollback iṣeto ni. Emi ko tii pade rẹ ṣaaju ki o si rii ni iyara pe yoo jẹ ki gbigbe awọn akopọ mi paapaa tutu. Bayi Mo lo ni gbogbo igba ti Mo fi koodu mi ranṣẹ si lambda tabi ECS ni lilo awọsanma.

Bi o ṣe n ṣiṣẹ: o pato CloudWatch itaniji ninu paramita --rollback-iṣeto ninigbati o ba ṣẹda changeet. Nigbamii, nigba ti o ba ṣe eto awọn ayipada, aws ṣe abojuto itaniji fun o kere ju iṣẹju kan. Yoo yi imuṣiṣẹ pada ti itaniji ba yipada ipo si ALARM lakoko yii.

Ni isalẹ jẹ apẹẹrẹ ti yiyan awoṣe kan awọsanmaninu eyiti mo ṣẹda Cloudwatch itaniji, eyiti o ṣe atẹle metiriki olumulo awọsanma bi nọmba awọn aṣiṣe ninu awọn akọọlẹ awọsanma (metiriki naa jẹ ipilẹṣẹ nipasẹ 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

Bayi itaniji le ṣee lo bi rollback ṣe okunfa nigbati o ba n ṣiṣẹ apoti irinṣẹ:

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"

Ẹkọ 5: Rii daju pe o lo ẹya tuntun ti awoṣe

O rọrun lati ran ẹya ti o kere ju-titun ti awoṣe igbekalẹ awọsanma lọ, ṣugbọn ṣiṣe bẹ yoo fa ibajẹ pupọ. Eyi ṣẹlẹ si wa ni ẹẹkan: Olùgbéejáde kan ko Titari awọn ayipada tuntun lati Git ati ni aimọọmọ gbe ẹya iṣaaju ti akopọ naa. Eyi yorisi idinku akoko fun ohun elo ti o lo akopọ yii.

Nkankan ti o rọrun bi fifi ayẹwo kan kun lati rii boya ẹka naa ba wa titi di oni ṣaaju ṣiṣe si rẹ yoo dara (a ro pe git jẹ irinṣẹ iṣakoso ẹya rẹ):

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

Ẹkọ 6: Ma ṣe tun kẹkẹ naa pada

O le dabi bi ransogun pẹlu awọsanma - o rọrun. O kan nilo opo awọn iwe afọwọkọ bash ti n ṣiṣẹ awọn aṣẹ aws cli.

Ni ọdun 4 sẹyin Mo bẹrẹ pẹlu awọn iwe afọwọkọ ti o rọrun ti a pe ni aṣẹ aṣẹ-akojọpọ aws cloudformation. Laipe awọn akosile ko si ohun to rọrun. Ẹ̀kọ́ kọ̀ọ̀kan tí a kọ́ mú kí àfọwọ́kọ náà túbọ̀ díjú sí i. O je ko nikan soro, sugbon o tun kún fun idun.

Mo ṣiṣẹ lọwọlọwọ ni ẹka IT kekere kan. Iriri ti fihan pe ẹgbẹ kọọkan ni ọna tirẹ ti imuṣiṣẹ awọn akopọ awọsanma. Ati pe iyẹn buru. Yoo dara julọ ti gbogbo eniyan ba gba ọna kanna. Ni Oriire, ọpọlọpọ awọn irinṣẹ wa lati ṣe iranlọwọ fun ọ lati gbejade ati tunto awọn akopọ awọsanma.

Awọn ẹkọ wọnyi yoo ran ọ lọwọ lati yago fun awọn aṣiṣe.

orisun: www.habr.com

Fi ọrọìwòye kun