مون پنهنجي باقي زندگي ڪلائوڊفارميشن سان ڪم ڪرڻ جا اهي 6 سبق سکيا.

مون سان گڏ ڪم ڪرڻ شروع ڪيو ڪلائوڊ فارميشن 4 سال اڳ. ان کان پوء مون ڪيترن ئي انفراسٽرڪچر کي ٽوڙي ڇڏيو آهي، جيتوڻيڪ اهي جيڪي اڳ ۾ ئي پيداوار ۾ هئا. پر هر ڀيري مون ڪجهه خراب ڪيو، مون ڪجهه نئين سکيو. هن تجربي ذريعي، مان ڪجهه اهم سبق شيئر ڪندس جيڪي مون سکيو.

مون پنهنجي باقي زندگي ڪلائوڊفارميشن سان ڪم ڪرڻ جا اهي 6 سبق سکيا.

سبق 1: انهن کي ترتيب ڏيڻ کان پهريان تبديلين جي جانچ ڪريو

مون سان گڏ ڪم ڪرڻ شروع ڪرڻ کان پوءِ جلد ئي اهو سبق سکيو ڪلائوڊ فارميشن. مون کي ياد ناهي ته پوءِ مون ڇا ٽوڙيو هو، پر مون کي ضرور ياد آهي ته مون ڪمانڊ استعمال ڪيو هو aws cloudformation اپڊيٽ. هي حڪم صرف ٽيمپليٽ کي رول آئوٽ ڪري ٿو بغير ڪنهن تصديق جي تبديلين جي جيڪا ترتيب ڏني ويندي. مان نه ٿو سمجهان ته ڪنهن به وضاحت جي ضرورت آهي ڇو ته توهان انهن کي ترتيب ڏيڻ کان پهريان سڀني تبديلين کي جانچڻ گهرجي.

هن ناڪامي کان پوء، مون کي فوري طور تبديل ڪيو پگهار پائيپ لائن، اپڊيٽ ڪمانڊ کي ڪمانڊ سان تبديل ڪندي ٺاھڻ- تبديل ڪرڻ- ٺاھڻ

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

تبديلين تي خاص ڌيان ڏيو جتي عمل آهي ٻيھر, خارج ڪريو يا ڪٿي متبادل جي ضرورت - سچ. اهي سڀ کان وڌيڪ خطرناڪ تبديليون آهن ۽ عام طور تي معلومات جي نقصان جي ڪري ٿي.

هڪ دفعو تبديلين جو جائزو ورتو ويو آهي، انهن کي ترتيب ڏئي سگهجي ٿو

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: رياستي وسيلن کي تبديل يا هٽائڻ کان روڪڻ لاءِ اسٽيڪ پاليسي استعمال ڪريو

ڪڏهن ڪڏهن صرف تبديلين کي ڏسڻ ڪافي ناهي. اسان سڀ انسان آهيون ۽ اسان سڀ غلطيون ڪندا آهيون. ٿوري دير کان پوءِ اسان تبديليون استعمال ڪرڻ شروع ڪيون، منهنجي ٽيم جي ساٿي اڻڄاڻ طور تي هڪ مقرري ڪئي جنهن جي نتيجي ۾ ڊيٽابيس اپڊيٽ ٿي. ڪجھ به خراب نه ٿيو ڇو ته اھو ھڪڙو امتحان وارو ماحول ھو.

جيتوڻيڪ اسان جي اسڪرپٽ تبديلين جي لسٽ ڏيکاري ٿي ۽ تصديق لاءِ چيو، تبديلي مٽائڻ کي ڇڏي ڏنو ويو ڇاڪاڻ ته تبديلين جي فهرست ايتري وڏي هئي جو اها اسڪرين تي نٿي اچي. ۽ جيئن ته اها جانچ واري ماحول ۾ هڪ عام تازه ڪاري هئي، تبديلين تي گهڻو ڌيان نه ڏنو ويو.

اهڙا وسيلا آهن جيڪي توهان ڪڏهن به تبديل ڪرڻ يا ختم ڪرڻ نٿا چاهيون. اهي رياستي خدمتون آهن، جهڙوڪ آر ڊي ايس ڊيٽابيس مثال يا هڪ ايلسٽسٽڪ سرچ ڪلسٽر وغيره. اهو سٺو ٿيندو جيڪڏهن aws خودڪار طور تي مقرري کي رد ڪري ڇڏيندو جيڪڏهن آپريشن ڪيو پيو وڃي ته اهڙي وسيلن کي حذف ڪرڻ جي ضرورت پوندي. خوشقسمتيء سان، ڪلائوڊ فارميشن ۾ اهو ڪرڻ لاء هڪ تعمير ٿيل طريقو آهي. اهو سڏيو ويندو آهي اسٽيڪ پاليسي، ۽ توهان ان بابت وڌيڪ پڙهي سگهو ٿا دستاويز:

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: استعمال ڪريو PreviousValue استعمال ڪريو جڏهن ڳجهي پيٽرولن سان اسٽيڪ کي اپڊيٽ ڪريو

جڏهن توهان هڪ RDS mysql ادارو ٺاهيو ٿا، AWS توهان کي هڪ MasterUsername ۽ MasterUserPassword مهيا ڪرڻ جي ضرورت آهي. جيئن ته اهو بهتر ناهي ته ماخذ ڪوڊ ۾ راز رکو ۽ مان هر شي کي خودڪار ڪرڻ چاهيان ٿو، مون هڪ "سمارٽ ميکانيزم" تي عمل ڪيو جتي ترتيب ڏيڻ کان پهريان سندون حاصل ڪيون وينديون s3 مان، ۽ جيڪڏهن سندون نه مليون آهن، نئين سندون ٺاهي وينديون آهن ۽ s3 ۾ ذخيرو ٿيل.

اهي سندون پوءِ ڪلائوڊفارميشن ٺاهڻ-تبديل-سيٽ ڪمانڊ ڏانهن پيرا ميٽر طور منظور ڪيون وينديون. اسڪرپٽ سان تجربو ڪرڻ دوران، اهو ٿيو ته s3 سان ڪنيڪشن گم ٿي ويو، ۽ منهنجي "سمارٽ ميکانيزم" ان کي نئين سندون پيدا ڪرڻ لاء سگنل جي طور تي علاج ڪيو.

جيڪڏهن مون هن اسڪرپٽ کي پيداوار ۾ استعمال ڪرڻ شروع ڪيو ۽ ڪنيڪشن جو مسئلو ٻيهر ٿيو، اهو اسٽيڪ کي نئين سند سان تازه ڪاري ڪندو. هن خاص صورت ۾، ڪجھ به خراب نه ٿيندو. بهرحال، مون هن طريقي کي ڇڏي ڏنو ۽ هڪ ٻيو استعمال ڪرڻ شروع ڪيو، صرف هڪ ڀيرو سند مهيا ڪرڻ - جڏهن اسٽيڪ ٺاهي. ۽ بعد ۾، جڏهن اسٽيڪ کي اپڊيٽ ڪرڻ جي ضرورت آهي، پيٽرولر جي ڳجهي قيمت کي بيان ڪرڻ بدران، مان صرف استعمال ڪندس UsePreviousValue=سچو:

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: رول بيڪ ترتيب استعمال ڪريو

هڪ ٻي ٽيم جنهن سان مون ڪم ڪيو ان فنڪشن استعمال ڪيو ڪلائوڊ فارميشن، سڏيو rollback ترتيب. مون ان کان اڳ ۾ نه آيو هو ۽ جلدي محسوس ڪيو ته اهو منهنجي اسٽيڪ کي وڌيڪ ٿڌو ڪري ڇڏيندو. هاڻي مان ان کي هر وقت استعمال ڪريان ٿو جڏهن آئون ڪلائوڊفارميشن استعمال ڪندي پنهنجو ڪوڊ لامبڊا يا اي سي ايس تي لڳايو.

اهو ڪيئن ڪم ڪري ٿو: توهان وضاحت ڪريو CloudWatch الارم پيٽرول ۾ --rollback- تشڪيلجڏهن توهان هڪ تبديلي ٺاهي. بعد ۾، جڏهن توهان تبديلين جي هڪ سيٽ تي عمل ڪيو، aws گهٽ ۾ گهٽ هڪ منٽ لاء الارم مانيٽر ڪري ٿو. اهو مقرري کي واپس آڻيندو آهي جيڪڏهن الارم هن وقت دوران رياست کي ALARM ۾ تبديل ڪري ٿو.

هيٺ ڏنل نموني جو هڪ نمونو اقتباس آهي ڪلائوڊ فارميشنجنهن ۾ مان ٺاهيان ٿو ڪلائوڊ واچ الارم، جيڪو ڪلائوڊ لاگز ۾ غلطين جي تعداد جي طور تي ڪلائوڊ استعمال ڪندڙ ميٽرڪ کي ٽريڪ ڪري ٿو (ميٽرڪ ذريعي ٺاهي وئي آهي ميٽرڪ فلٽر):

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 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: ڦيٿي کي ٻيهر نه بڻايو

اهو لڳي سگهي ٿو سان لڳائڻ ڪلائوڊ فارميشن - اهو آسان آهي. توهان کي صرف بش اسڪرپٽس جو هڪ گروپ جي ضرورت آهي aws cli حڪمن تي عمل ڪرڻ.

4 سال اڳ مون شروع ڪيو سادو اسڪرپٽس سان جنهن کي سڏيو ويندو آهي aws cloudformation create-stack command. جلد ئي رسم الخط وڌيڪ سادو نه رهيو. هر سبق سکيو اسڪرپٽ کي وڌيڪ ۽ وڌيڪ پيچيده بڻائي ڇڏيو. اهو نه رڳو ڏکيو هو، پر ڪيڙن سان ڀريل پڻ.

مان هن وقت هڪ ننڍڙي آئي ٽي ڊپارٽمينٽ ۾ ڪم ڪريان ٿو. تجربو ڏيکاريو آهي ته هر ٽيم کي ڪلائوڊ فارميشن اسٽيڪ کي ترتيب ڏيڻ جو پنهنجو طريقو آهي. ۽ اهو خراب آهي. اهو بهتر ٿيندو ته سڀ هڪ ئي طريقو اختيار ڪن. خوشقسمتيءَ سان، اهڙا ڪيترائي اوزار موجود آهن جيڪي توهان کي ڪلائوڊفارميشن اسٽيڪ کي ترتيب ڏيڻ ۽ ترتيب ڏيڻ ۾ مدد ڪن.

اهي سبق توهان جي غلطين کان بچڻ ۾ مدد ڪندا.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو