Nilijifunza masomo haya 6 ya kufanya kazi na cloudformation kwa maisha yangu yote.

Nilianza kufanya kazi na uundaji wa mawingu miaka 4 iliyopita. Tangu wakati huo nimevunja miundombinu mingi, hata ile ambayo tayari ilikuwa katika uzalishaji. Lakini kila wakati nilipoharibu kitu, nilijifunza kitu kipya. Kupitia uzoefu huu, nitashiriki baadhi ya masomo muhimu niliyojifunza.

Nilijifunza masomo haya 6 ya kufanya kazi na cloudformation kwa maisha yangu yote.

Somo la 1: Jaribu mabadiliko kabla ya kuzipeleka

Nilijifunza somo hili mara tu baada ya kuanza kufanya kazi na uundaji wa mawingu. Sikumbuki ni nini hasa nilichovunja wakati huo, lakini ninakumbuka kwa hakika kwamba nilitumia amri sasisho la aws cloudformation. Amri hii hutoa kiolezo bila uthibitisho wowote wa mabadiliko ambayo yatatumwa. Sidhani kama maelezo yoyote yanahitajika kwa nini unapaswa kujaribu mabadiliko yote kabla ya kuyapeleka.

Baada ya kushindwa huku, nilibadilika mara moja bomba la kupelekwa, ikibadilisha amri ya sasisho na amri tengeneza-badilisha-seti

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

Mara tu kibadilishaji kitakapoundwa, hakina athari kwenye rafu iliyopo. Tofauti na amri ya sasisho, mbinu ya kubadilisha haisababishi upelekaji halisi. Badala yake, inaunda orodha ya mabadiliko ambayo unaweza kukagua kabla ya kupelekwa. Unaweza kuona mabadiliko katika kiolesura cha aws console. Lakini ikiwa unapendelea kugeuza kila kitu unachoweza, basi angalia kwenye 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

Amri hii inapaswa kutoa mazao sawa na yafuatayo:

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

Zingatia sana mabadiliko mahali ambapo Kitendo kipo Nafasi, kufuta au wapi Uingizwaji Unahitajika - Kweli. Haya ni mabadiliko hatari zaidi na kwa kawaida husababisha kupoteza habari.

Mara tu mabadiliko yamekaguliwa, yanaweza kutumwa

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"

Somo la 2: Tumia sera ya rafu ili kuzuia rasilimali za serikali zisibadilishwe au kuondolewa

Wakati mwingine kutazama tu mabadiliko haitoshi. Sisi sote ni wanadamu na tunafanya makosa. Muda mfupi baada ya kuanza kutumia vibadilishaji, mwenzangu alifanya utumaji bila kujua ambao ulisababisha sasisho la hifadhidata. Hakuna kitu kibaya kilichotokea kwa sababu ilikuwa mazingira ya majaribio.

Ingawa hati zetu zilionyesha orodha ya mabadiliko na kuomba uthibitisho, badiliko la Badilisha lilirukwa kwa sababu orodha ya mabadiliko ilikuwa kubwa sana hivi kwamba haikutoshea kwenye skrini. Na kwa kuwa hii ilikuwa sasisho la kawaida katika mazingira ya majaribio, sio umakini mkubwa ulilipwa kwa mabadiliko.

Kuna rasilimali ambazo hutaki kamwe kubadilisha au kuondoa. Hizi ni huduma za hali ya juu, kama vile mfano wa hifadhidata ya RDS au nguzo ya elasticsearch, n.k. Itakuwa vyema ikiwa aws ingekataa kutumwa kiotomatiki ikiwa operesheni inayofanywa itahitaji kufuta rasilimali kama hiyo. Kwa bahati nzuri, uundaji wa wingu una njia iliyojumuishwa ya kufanya hivi. Hii inaitwa sera ya rafu, na unaweza kusoma zaidi kuihusu nyaraka:

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"

Somo la 3: Tumia UsePreviousValue unaposasisha rafu na vigezo vya siri

Unapounda huluki ya RDS mysql, AWS inakuhitaji utoe MasterUsername na MasterUserPassword. Kwa kuwa ni bora kutoweka siri katika msimbo wa chanzo na nilitaka kubinafsisha kila kitu, nilitekelezea "utaratibu mzuri" ambapo kabla ya kupelekwa sifa zitapatikana kutoka kwa s3, na ikiwa sifa hazipatikani, vitambulisho vipya vinatolewa na. kuhifadhiwa katika s3.

Vitambulisho hivi basi vitapitishwa kama vigezo kwa amri ya uundaji-badilisha-seti ya wingu. Nilipokuwa nikijaribu hati, ilitokea kwamba muunganisho wa s3 ulipotea, na "utaratibu mahiri" wangu uliichukulia kama ishara ya kutoa vitambulisho vipya.

Ikiwa ningeanza kutumia hati hii katika utengenezaji na shida ya muunganisho ikatokea tena, ingesasisha safu na vitambulisho vipya. Katika kesi hii, hakuna kitu kibaya kitatokea. Walakini, niliacha njia hii na kuanza kutumia nyingine, nikitoa sifa mara moja tu - wakati wa kuunda stack. Na baadaye, wakati stack inahitaji kusasishwa, badala ya kutaja thamani ya siri ya paramu, ningetumia tu TumiaPreviousValue=kweli:

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"

Somo la 4: Tumia usanidi wa kurejesha

Timu nyingine niliyofanya kazi nayo ilitumia kazi hiyo uundaji wa mawingu, kuitwa usanidi wa kurudi nyuma. Sikuwa nimeipata hapo awali na nikagundua haraka kuwa ingefanya kupeleka rafu zangu kuwa baridi zaidi. Sasa ninaitumia kila wakati ninapopeleka nambari yangu kwa lambda au ECS kwa kutumia uundaji wa mawingu.

Jinsi inavyofanya kazi: unabainisha Kengele ya CloudWatch katika parameter --kurudisha-usanidiunapounda kibadilishaji. Baadaye, unapofanya seti ya mabadiliko, aws hufuatilia kengele kwa angalau dakika moja. Hurejesha utumaji ikiwa kengele itabadilisha hali kuwa ALARM wakati huu.

Chini ni mfano wa dondoo la template uundaji wa mawinguambamo ninaumba kengele ya wingu, ambayo hufuatilia kipimo cha mtumiaji wa wingu kama idadi ya makosa katika kumbukumbu za wingu (kipimo kinatolewa kupitia 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

Sasa alarm inaweza kutumika kama inarudi trigger wakati wa kutekeleza kisanduku cha zana:

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"

Somo la 5: Hakikisha unatumia toleo jipya zaidi la kiolezo

Ni rahisi kupeleka toleo la chini kuliko la hivi punde zaidi la kiolezo cha uundaji wingu, lakini kufanya hivyo kutasababisha uharibifu mkubwa. Hili lilitokea kwetu mara moja: msanidi programu hakusukuma mabadiliko ya hivi punde kutoka kwa Git na bila kujua alisambaza toleo la awali la rafu. Hii ilisababisha kutokuwepo kwa muda kwa programu iliyotumia rafu hii.

Kitu rahisi kama kuongeza cheki ili kuona ikiwa tawi limesasishwa kabla ya kujitolea itakuwa sawa (ikizingatiwa git ndio zana yako ya kudhibiti toleo):

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

Somo la 6: Usirudishe gurudumu

Inaweza kuonekana kama kupeleka na uundaji wa mawingu - ni rahisi. Unahitaji tu rundo la hati za bash kutekeleza amri za aws cli.

Miaka 4 iliyopita nilianza na hati rahisi zinazoitwa aws cloudformation create-stack command. Hivi karibuni maandishi hayakuwa rahisi tena. Kila somo lililojifunza lilifanya maandishi kuwa magumu zaidi na zaidi. Haikuwa ngumu tu, bali pia imejaa mende.

Kwa sasa ninafanya kazi katika idara ndogo ya IT. Uzoefu umeonyesha kuwa kila timu ina njia yake ya kusambaza safu za uundaji wingu. Na hiyo ni mbaya. Ingekuwa bora ikiwa kila mtu angechukua njia sawa. Kwa bahati nzuri, kuna zana nyingi zinazopatikana ili kukusaidia kupeleka na kusanidi rafu za uundaji wingu.

Masomo haya yatakusaidia kuepuka makosa.

Chanzo: mapenzi.com

Kuongeza maoni