මම මගේ ජීවිතයේ ඉතිරි කාලය සඳහා වලාකුළු සැකසීම සමඟ වැඩ කිරීමේ මෙම පාඩම් 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"

වෙනස්කම් කට්ටලයක් සෑදූ පසු, එය පවතින තොගයට බලපෑමක් නැත. යාවත්කාලීන විධානය මෙන් නොව, changeet ප්‍රවේශය සැබෑ යෙදවීම අවුලුවන්නේ නැත. ඒ වෙනුවට, එය යෙදවීමට පෙර ඔබට සමාලෝචනය කළ හැකි වෙනස්කම් ලැයිස්තුවක් නිර්මාණය කරයි. ඔබට 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   |
+---------+--------------------+----------------------+------------+

ක්‍රියාව ඇති ස්ථානයේ වෙනස්කම් කෙරෙහි විශේෂ අවධානය යොමු කරන්න ප්රතිස්ථාපනය කරන්න, Delete නැත්නම් කොහෙද ප්‍රතිස්ථාපනය අවශ්‍ය - සත්‍ය. මේවා වඩාත් භයානක වෙනස්කම් වන අතර සාමාන්යයෙන් තොරතුරු අහිමි වීමට හේතු වේ.

වෙනස්කම් සමාලෝචනය කළ පසු, ඒවා යෙදවිය හැකිය

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: රාජ්‍ය සම්පත් ප්‍රතිස්ථාපනය කිරීම හෝ ඉවත් කිරීම වැළැක්වීමට අට්ටි ප්‍රතිපත්තිය භාවිතා කරන්න

සමහර විට වෙනස්කම් බැලීම පමණක් ප්රමාණවත් නොවේ. අපි හැමෝම මිනිස්සු, අපි හැමෝම වැරදි කරනවා. අපි වෙනස් කිරීම් භාවිතා කිරීම ආරම්භ කර ටික වේලාවකට පසු, මගේ කණ්ඩායමේ සගයා නොදැනුවත්වම දත්ත සමුදාය යාවත්කාලීන කිරීමට හේතු විය. එය පරීක්ෂාකාරී පරිසරයක් වූ නිසා නරක කිසිවක් සිදු නොවීය.

අපගේ ස්ක්‍රිප්ට් වෙනස් කිරීම් ලැයිස්තුවක් ප්‍රදර්ශනය කර තහවුරු කිරීම ඉල්ලා සිටියද, වෙනස්කම් ලැයිස්තුව තිරයට නොගැලපෙන තරම් විශාල බැවින් ප්‍රතිස්ථාපන වෙනස් කිරීම මඟ හැරුණි. තවද මෙය පරීක්ෂණ පරිසරයක සාමාන්‍ය යාවත්කාලීන කිරීමක් වූ බැවින්, වෙනස්කම් කෙරෙහි වැඩි අවධානයක් යොමු නොවීය.

ඔබට කිසිදා ප්‍රතිස්ථාපනය කිරීමට හෝ ඉවත් කිරීමට අවශ්‍ය නොවන සම්පත් තිබේ. මේවා RDS දත්ත සමුදා අවස්ථාවක් හෝ ප්‍රත්‍යාස්ථ සෙවුම් පොකුරක් වැනි රාජ්‍ය පූර්ණ සේවාවන් වේ. සිදු කෙරෙන මෙහෙයුමට එවැනි සම්පතක් මකා දැමීම අවශ්‍ය නම්, 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: රහස් පරාමිතීන් සහිත තොගයක් යාවත්කාලීන කිරීමේදී UsePreviousValue භාවිතා කරන්න

ඔබ RDS mysql entity එකක් සාදන විට, AWS හට MasterUsername සහ MasterUserPassword ලබා දීම අවශ්‍ය වේ. මූලාශ්‍ර කේතයේ රහස් තබා නොගැනීම වඩා හොඳ බැවින් සහ මට සියල්ල ස්වයංක්‍රීය කිරීමට අවශ්‍ය වූ බැවින්, යෙදවීමට පෙර අක්තපත්‍ර s3 වෙතින් ලබා ගන්නා "ස්මාර්ට් යාන්ත්‍රණයක්" මම ක්‍රියාත්මක කළෙමි, අක්තපත්‍ර සොයාගත නොහැකි නම්, නව අක්තපත්‍ර ජනනය වේ. s3 හි ගබඩා කර ඇත.

මෙම අක්තපත්‍ර පසුව cloudformation create-change-set විධානයට පරාමිති ලෙස ලබා දෙනු ඇත. ස්ක්‍රිප්ට් සමඟ අත්හදා බැලීම් කරන අතරතුර, 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: ආපසු හැරීමේ වින්‍යාසය භාවිතා කරන්න

මා සමඟ වැඩ කළ තවත් කණ්ඩායමක් කාර්යය භාවිතා කළේය වලාකුළු සෑදීම, නමින් ආපසු හැරීමේ වින්යාසය. මම මීට පෙර එය හමු වී නොතිබූ අතර එය මගේ අට්ටි යෙදවීම වඩාත් සිසිල් කරනු ඇති බව ඉක්මනින් අවබෝධ විය. දැන් මම Cloudformation භාවිතයෙන් lambda හෝ ECS වෙත මගේ කේතය යොදවන සෑම අවස්ථාවකම එය භාවිතා කරමි.

එය ක්රියා කරන ආකාරය: ඔබ සඳහන් කරන්න CloudWatch එලාමය පරාමිතිය තුළ --rollback-configurationඔබ වෙනස්කම් කට්ටලයක් සාදන විට. පසුව, ඔබ වෙනස්කම් මාලාවක් ක්‍රියාත්මක කරන විට, 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 ඔබේ අනුවාද පාලන මෙවලම යැයි උපකල්පනය කරන්න):

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 විධාන ක්‍රියාත්මක කරන bash ස්ක්‍රිප්ට් පොකුරක් පමණි.

අවුරුදු 4කට කලින් මම පටන් ගත්තේ aws cloudformation create-stack command කියන සරල ස්ක්‍රිප්ට් වලින්. වැඩි කල් නොගොස් තිර රචනය සරල නොවීය. ඉගෙන ගත් සෑම පාඩමක්ම ​​පිටපත වඩ වඩාත් සංකීර්ණ විය. එය දුෂ්කර පමණක් නොව, දෝෂ වලින් පිරී තිබුණි.

මම දැනට කුඩා තොරතුරු තාක්ෂණ අංශයක සේවය කරනවා. පළපුරුද්ද පෙන්වා දී ඇත්තේ සෑම කණ්ඩායමකටම වලාකුළු සැකසීමේ අට්ටි යෙදවීමට තමන්ගේම ක්‍රමයක් ඇති බවයි. ඒ වගේම නරකයි. හැමෝම එකම ප්‍රවේශයක් ගත්තොත් හොඳයි. වාසනාවකට මෙන්, ඔබට වලාකුළු සැකසීමේ අට්ටි යෙදවීමට සහ වින්‍යාස කිරීමට උදවු කිරීමට බොහෝ මෙවලම් තිබේ.

මෙම පාඩම් ඔබට වැරදි වළක්වා ගැනීමට උපකාරී වනු ඇත.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න