Aku sinau 6 pelajaran babagan nggarap cloudformation sajrone uripku.

Aku miwiti nggarap formasi awan 4 taun kepungkur. Wiwit iku aku wis rusak akeh prasarana, malah sing wis ing produksi. Nanging saben-saben aku ngaco, aku sinau sing anyar. Liwat pengalaman iki, aku bakal nuduhake sawetara pelajaran sing paling penting sing daksinaoni.

Aku sinau 6 pelajaran babagan nggarap cloudformation sajrone uripku.

Pelajaran 1: Tes owah-owahan sadurunge nyebarake

Aku sinau pawulangan iki sakcepete sawise aku miwiti nggarap formasi awan. Aku ora ngelingi apa persis aku nyuwil banjur, nanging aku mesthi elinga aku digunakake printah nganyari cloudformation aws. Printah iki mung nggulung cithakan tanpa validasi owah-owahan sing bakal ditindakake. Aku ora mikir apa-apa panjelasan perlu kanggo apa sampeyan kudu nyoba kabeh owah-owahan sadurunge deploying.

Sawise gagal iki, aku langsung ganti pipa penyebaran, ngganti printah nganyari karo printah nggawe-owahan-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"

Sawise changeset digawe, ora ana pengaruh ing tumpukan sing ana. Ora kaya prentah nganyari, pendekatan changeset ora micu panyebaran nyata. Nanging, nggawe dhaptar owah-owahan sing bisa dideleng sadurunge penyebaran. Sampeyan bisa ndeleng owah-owahan ing antarmuka console aws. Nanging yen sampeyan luwih seneng ngotomatisasi kabeh sing bisa, priksa ing 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

Printah iki kudu ngasilake output sing padha karo ing ngisor iki:

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

Pay manungsa waΓ© khusus kanggo owah-owahan ngendi Tindakan Ganti, Busak utawa ngendi Dibutuhake Ganti - Bener. Iki minangka owah-owahan sing paling mbebayani lan biasane nyebabake mundhut informasi.

Sawise owah-owahan wis dideleng, padha bisa disebarake

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"

Pelajaran 2: Gunakake kabijakan tumpukan kanggo nyegah sumber daya stateful saka diganti utawa dibusak

Kadhangkala mung ndeleng owah-owahan ora cukup. Kita kabeh manungsa lan kita kabeh nggawe kesalahan. Sakcepete sawise kita miwiti nggunakake changesets, kancaku ora sengaja nindakake penyebaran sing nyebabake nganyari database. Ora ana kedadeyan sing ala amarga iki minangka lingkungan tes.

Sanajan skrip kita nampilake dhaptar owah-owahan lan njaluk konfirmasi, owah-owahan Ganti dilewati amarga dhaptar owah-owahan gedhe banget nganti ora pas ing layar. Lan amarga iki minangka nganyari normal ing lingkungan tes, ora akeh perhatian sing dibayar kanggo owah-owahan kasebut.

Ana sumber daya sing sampeyan ora pengin ngganti utawa mbusak. Iki minangka layanan statefull, kayata conto database RDS utawa kluster elasticsearch, lan sapiturute. Luwih becik yen aws kanthi otomatis nolak penyebaran yen operasi sing ditindakake mbutuhake mbusak sumber kasebut. Untunge, cloudformation duwe cara sing dibangun kanggo nindakake iki. Iki diarani privasi tumpukan, lan sampeyan bisa maca liyane babagan ing dokumentasi:

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"

Pelajaran 3: Gunakake UsePreviousValue nalika nganyari tumpukan kanthi parameter rahasia

Nalika nggawe entitas mysql RDS, AWS mbutuhake sampeyan nyedhiyakake MasterUsername lan MasterUserPassword. Amarga luwih becik ora nyimpen rahasia ing kode sumber lan aku pengin ngotomatisasi kabeh, aku ngetrapake "mekanisme cerdas" ing ngendi sadurunge nyebarake kredensial bakal dipikolehi saka s3, lan yen kredensial ora ditemokake, kredensial anyar digawe lan disimpen ing s3.

Kredensial kasebut banjur bakal diterusake minangka paramèter menyang printah cloudformation create-change-set. Nalika nyobi script, kedaden sing sambungan kanggo s3 ilang, lan sandi "mekanisme pinter" dianggep minangka sinyal kanggo generate Diverifikasi anyar.

Yen aku miwiti nggunakake script iki ing produksi lan masalah sambungan kedaden maneh, bakal nganyari tumpukan karo Diverifikasi anyar. Ing kasus tartamtu iki, ora ana sing ala bakal kelakon. Nanging, aku nilar pendekatan iki lan miwiti nggunakake liyane, menehi kapercayan mung sapisan - nalika nggawe tumpukan. Lan mengko, nalika tumpukan perlu nganyari, tinimbang nemtokake nilai rahasia parameter, aku mung bakal nggunakake 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"

Pelajaran 4: Gunakake konfigurasi rollback

Tim liyane sing aku kerjo nggunakake fungsi kasebut formasi awandiarani konfigurasi rollback. Aku durung nemoni sadurunge lan kanthi cepet ngerti yen bakal nggawe tumpukan saya luwih adhem. Saiki aku nggunakake saben-saben aku masang kode kanggo lambda utawa ECS nggunakake cloudformation.

Cara kerjane: sampeyan nemtokake Weker CloudWatch ing parameter --rollback-konfigurasinalika sampeyan nggawe changeset. Mengko, yen sampeyan nglakokake sakumpulan pangowahan, aws ngawasi weker paling sethithik sak menit. Iki muter maneh penyebaran yen weker ganti status dadi ALARM sajrone wektu iki.

Ing ngisor iki conto kutipan cithakan formasi awaning aku nggawe weker cloudwatch, sing nglacak metrik pangguna awan minangka jumlah kesalahan ing log awan (metrik kasebut digawe liwat 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

Saiki weker bisa digunakake minangka rollback pemicu nalika nglakokake toolbox:

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"

Pelajaran 5: Priksa manawa sampeyan masang versi paling anyar saka cithakan

Gampang masang versi cithakan cloudformation sing kurang saka paling anyar, nanging nglakoni bakal nyebabake akeh karusakan. Iki kedaden kanggo kita sapisan: pangembang ora push owah-owahan paling anyar saka Git lan ora sengaja masang versi sadurungΓ© saka tumpukan. Iki nyebabake downtime kanggo aplikasi sing nggunakake tumpukan iki.

Ana sing gampang kaya nambahake mriksa kanggo ndeleng manawa cabang kasebut dianyari sadurunge nindakake bakal apik (assuming git minangka alat kontrol versi sampeyan):

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

Pawulangan 6: Aja reinvent setir

Iku bisa uga katon kaya deploying karo formasi awan - iku gampang. Sampeyan mung butuh akeh skrip bash nglakokake perintah aws cli.

4 taun kepungkur aku miwiti nganggo skrip prasaja sing diarani printah aws cloudformation create-stack. Ora suwe, naskah kasebut ora prasaja maneh. Saben wulangan sing disinaoni nggawe naskah saya tambah rumit. Iku ora mung angel, nanging uga kebak kewan omo.

Saiki aku kerja ing departemen IT cilik. Pengalaman nuduhake manawa saben tim duwe cara dhewe kanggo nyebarake tumpukan cloudformation. Lan sing ala. Luwih becik yen saben wong njupuk pendekatan sing padha. Untunge, ana akeh alat sing kasedhiya kanggo mbantu sampeyan ngatur lan ngatur tumpukan cloudformation.

Pawulangan iki bakal mbantu sampeyan supaya ora salah.

Source: www.habr.com

Add a comment