অ্যামাজন ইসিএসে কোনও পরিষেবার ধারক আপডেট করুন


32

অ্যামাজন ইসিএসে চলমান কোনও পরিষেবার ধারক আপডেট করার জন্য কোন ধরণের পদ্ধতির প্রস্তাব দেওয়া হচ্ছে?

ডেস্কটপ AWS ডকুমেন্টেশন বলছে: "আপনি আপনার অ্যাপ্লিকেশনের Docker ইমেজ আপডেট করেছি থাকেন তবে আপনি সেই ইমেজের সাথে একটি নতুন টাস্ক সংজ্ঞা তৈরী করতে এবং আপনার সেবা একটি সময়ে এক কাজের জন্য এটি প্রসারিত করতে পারেন।" এটি বর্তমানে ডকুমেন্টেশনে বর্তমানে উপলভ্য সমস্ত কিছু (13 এপ্রিল 2015)।

আমি কি সঠিকভাবে বুঝতে পেরেছিলাম যে অ্যামাজন ইসিএসে আমার অ্যাপ্লিকেশন ধারকটি আপডেট করার একমাত্র উপায় হল একটি নতুন কাজ তৈরি করা, তারপরে পুরানো কাজটি থামানো এবং নতুন কাজ শুরু করা?

আমি কোর ওএস ও ফ্লিটেক্টল সহ সফলভাবে একটি ট্যাগ "সর্বশেষ" ব্যবহার করেছি। নতুন আপডেটের জন্য ডকার চিত্রের ট্যাগ পরিবর্তন করার প্রয়োজন নেই এর সুবিধা রয়েছে, যেহেতু পরিষেবাটি পুনরায় লোড করা নতুন পরিবর্তনগুলি দেখতে পাবে এবং ধারকটি আপডেট করবে (একই ট্যাগটি "সর্বশেষ" ব্যবহার করে)।

অ্যামাজন ইসিএসে আপডেট ডকার ইমেজ সহ আপনি আপনার পরিষেবাটি আপডেট করার জন্য কোন ধরণের পন্থা ব্যবহার করেছেন?


পাশাপাশি এটিও বোঝার চেষ্টা করছি, যেহেতু আমরা ধারাবাহিকভাবে উত্পাদনে চালিত হওয়া প্রয়োজন এমন বিভিন্ন ডেমন স্থাপনের জন্য ইসিএস ব্যবহার করার আশা করছি।
প্যারেন্ট 5446

1
কেবলমাত্র নিশ্চিত করার জন্য, আপনি বলেছিলেন যে একটি ইসি পরিষেবা পুনরায় চালু করা কোনও চিত্রের সর্বশেষতম সংস্করণটি টেনে তুলবে? আমি এটি সম্পর্কে নথিপত্র খুঁজছি এবং এটি কোথাও খুঁজে পাচ্ছি না।
মিমিলেরুভা

1
এটির কোনও নিশ্চয়তা?
লিওর ওহানা

@ লিয়োরোহানা দুঃখের বিষয় এটি সত্য। বিস্তারিত জানার জন্য আমার উত্তর দেখুন।
hamx0r

আমি নীচে একটি নতুন বিস্তারিত উত্তর পোস্ট করেছি, তবে এখানে স্পষ্ট করে বলতে: আপনার পরিষেবাটি সর্বদা আপনার সেটটি ট্যাগের উপর ভিত্তি করে রেপো থেকে আপনার ধারকটির একটি নতুন কপি টানতে চেষ্টা করবে। একটি টাস্ক নিহত হয়, তাহলে যখন সেবা আবার স্থাপন, এটা কি কোন টনক আছে ছিল রেপো, শুধুমাত্র কি হয় রেপো হবে।
মিঃডুক

উত্তর:


18

নিশ্চিত নয় যে এটিকে পরিত্যক্ত প্রশ্ন হিসাবে বিবেচনা করা হয় - আমার সমস্যা সমাধানের সময় এবং এখন আমার সমাধানটি যুক্ত করা হয়েছে যে এটি সমাধান হয়েছে this

নতুন ধারক সহ পরিষেবা আপডেট করতে, আপনার প্রয়োজন:

  1. সংগ্রহস্থলে নতুন ধারক আপলোড করুন;
  2. ট্রিগার কার্য সংজ্ঞা আপডেট;
  3. ট্রিগার ধারক আপডেট;
  4. গুরুত্বপূর্ণ: পরিষেবার বিধিগুলি কার্যের নতুন সংস্করণ চালু করার অনুমতি দেয় তা নিশ্চিত করুন।

যদি পরিষেবা কার্যটি সর্বশেষ সংস্করণে আপডেট না করা হয় তবে ত্রুটির জন্য "ইভেন্টগুলি" ট্যাবটি পরীক্ষা করুন। উদাহরণস্বরূপ, সম্ভবত ইসিএস আপনার পরিষেবার নতুন সংস্করণ শুরু করতে সক্ষম হয় নি: ক্লাস্টারে আপনার কাছে কেবল একটি ই সি 2 উদাহরণ রয়েছে এবং ইতিমধ্যে হোস্টে অ্যাপ্লিকেশন পোর্টটি ব্যবহার করা হয়েছে। এই ক্ষেত্রে, "ন্যূনতম স্বাস্থ্য / সর্বাধিক স্বাস্থ্য" সীমাবদ্ধ করে "0%, 100%" সীমাবদ্ধ করুন - এইভাবে, ইসিএস নতুন স্থাপনার আগে পুরানো ধারকটিকে হত্যা করতে বেছে নেবে। কয়েক মিনিটের ব্যবধানে এটিও ঘটছে - আপনি যদি তাত্ক্ষণিক প্রতিক্রিয়া না দেখেন তবে তাড়াহুড়া করবেন না।

প্রাক-কনফিগার করা ক্লাস্টার এবং পরিষেবাতে ধারক আপডেট করার জন্য নীচে ডিপ্লোয়মেন্ট স্ক্রিপ্ট দেওয়া আছে। নোট করুন সংস্করণ নির্দিষ্ট করার দরকার নেই যদি আপনি কেবল "পরিবারের কাছ থেকে সর্বশেষ ব্যবহার করুন" বোঝায়।

awsRegion=us-east-1
containerName=..
containerRepository=..
taskDefinitionFile=...
taskDefinitionName=...
serviceName=...


echo 'build docker image...'
docker build -t $containerName .

echo 'upload docker image...'
docker tag $containerName:latest $containerRepository:$containerName
docker push $containerRepository:$containerName

echo 'update task definition...'
aws ecs register-task-definition --cli-input-json file://$taskDefinitionFile --region $awsRegion > /dev/null

echo 'update our service with that last task..'
aws ecs update-service --service $serviceName --task-definition $taskDefinitionName --region $awsRegion  > /dev/null

2
এটি স্থানীয়ভাবে একটি ফাইল হিসাবে একটি কার্য সংজ্ঞা রাখতে বাধ্য করে এবং যদি আমি সঠিকভাবে বুঝতে পারি তবে এটিই কেবলমাত্র আমি যেখানে পরিবেশের ভেরিয়েবলগুলি সংজ্ঞায়িত করতে পারি। স্থানীয়ভাবে পরিবেশের ভেরিয়েবল না থাকলে এটি করার কোনও উপায় আছে কি? আদর্শভাবে আমি কার্য / পরিষেবা / ধারক / ইত্যাদি সম্পর্কিত কোনও তথ্য না পাঠিয়ে একটি নতুন ডকার চিত্র ট্যাগের দিকে নির্দেশ করার জন্য একটি আদেশ জারি করতে চাই।
rmac

1
মন্তব্যগুলি set "min health/max health" limits to "0%, 100%"সোনার হয়। তোমাকে অনেক ধন্যবাদ!
শিববধ

1
এখানে সাবধানতার কথা, আপনি যদি সেটাকে সেট minকরেন 0%, যখন আপনি আপনার পরিষেবার দ্বারা নির্ধারিত টাস্ক সংজ্ঞাটি পরিবর্তন করেন, আপনি অবশ্যই সেই কাজটির জন্য একই সময়ে সমস্ত কাজ সরিয়ে নেওয়ার সম্পূর্ণ কর্তৃত্ব দিচ্ছেন ।
মিঃডুক


1

আমি আমার উন্নতিগুলির সাথে ইসি-স্থাপনার স্ক্রিপ্টের কিছু অংশ ব্যবহার করি (এটি প্রতিটি ধারক বিবরণ থেকে চিত্র নেয় এবং এর ট্যাগ অংশটি $ TAG_PURE দিয়ে প্রতিস্থাপন করে): https://gist.github.com/Forever-Young/e939d9cc41bc7a105cdcf8cd7ab9d714

# based on ecs-deploy script
TASK_DEFINITION_NAME=$(aws ecs describe-services --services $SERVICE --cluster $CLUSTER | jq -r .services[0].taskDefinition)
TASK_DEFINITION=$(aws ecs describe-task-definition --task-def "$TASK_DEFINITION_NAME" | jq '.taskDefinition')
NEW_CONTAINER_DEFINITIONS=$(echo "$TASK_DEFINITION" | jq --arg NEW_TAG $TAG_PURE 'def replace_tag: if . | test("[a-zA-Z0-9.]+/[a-zA-Z0-9]+:[a-zA-Z0-9]+") then sub("(?<s>[a-zA-Z0-9.]+/[a-zA-Z0-9]+:)[a-zA-Z0-9]+"; "\(.s)" + $NEW_TAG) else . end ; .containerDefinitions | [.[] | .+{image: .image | replace_tag}]')
TASK_DEFINITION=$(echo "$TASK_DEFINITION" | jq ".+{containerDefinitions: $NEW_CONTAINER_DEFINITIONS}")
# Default JQ filter for new task definition
NEW_DEF_JQ_FILTER="family: .family, volumes: .volumes, containerDefinitions: .containerDefinitions"
# Some options in task definition should only be included in new definition if present in
# current definition. If found in current definition, append to JQ filter.
CONDITIONAL_OPTIONS=(networkMode taskRoleArn)
for i in "${CONDITIONAL_OPTIONS[@]}"; do
  re=".*${i}.*"
  if [[ "$TASK_DEFINITION" =~ $re ]]; then
    NEW_DEF_JQ_FILTER="${NEW_DEF_JQ_FILTER}, ${i}: .${i}"
  fi
done

# Build new DEF with jq filter
NEW_DEF=$(echo $TASK_DEFINITION | jq "{${NEW_DEF_JQ_FILTER}}")
NEW_TASKDEF=`aws ecs register-task-definition --cli-input-json "$NEW_DEF" | jq -r .taskDefinition.taskDefinitionArn`

echo "New task definition registered, $NEW_TASKDEF"

aws ecs update-service --cluster $CLUSTER --service $SERVICE --task-definition "$NEW_TASKDEF" > /dev/null

echo "Service updated"

আপনার উত্তরে লিঙ্কগুলি থেকে দরকারী তথ্য সরবরাহ করার জন্য, লিঙ্ক-রট সরবরাহ করার পরামর্শ দেওয়া হয়। আপনি কি তাই করতে পারেন?
BE77Y

1
আমার উত্তর আপডেট করেছে
ForeverYoung

1

একটি নতুন ডকার চিত্র আপলোড করার পরে, যদি এটি কোনও টাস্কের মতো একই ট্যাগ থাকে, তবে সর্বশেষতম টাস্কটি অনুলিপি করতে হবে এবং সেই নতুন টাস্কটি ব্যবহারের জন্য পরিষেবাটি কনফিগার করতে হবে। Allyচ্ছিকভাবে, একজনের কাছে কেবল দুটি ডুপ্লিকেট কাজ থাকতে পারে এবং প্রতিটি সময় ডকারের চিত্র আপডেট হওয়ার পরে পরিষেবাটির মধ্যে সেগুলি পরিবর্তন করতে পারে।

মূলত, ইসিএস দ্বারা একটি নতুন ডকার কনটেইনার তৈরি করার জন্য, পরিষেবার একটি আপডেট এটিকে ট্রিগার করতে হবে এবং পরিষেবা ট্রিগার করার একমাত্র উপায় হ'ল এটি কোনও উপায়ে আপডেট করা - যেমন এটি ব্যবহার করতে বলার মাধ্যমে বিভিন্ন টাস্ক নম্বর।

মনে রাখবেন যে বিদ্যমান চলমান কনটেইনারগুলি কেবল পরিষেবা আপডেট হওয়ার কারণে অটো-স্টপ নাও করতে পারে - আপনার নিজের কার্য তালিকার দিকে নজর দেওয়া এবং ম্যানুয়ালি এগুলি বন্ধ করার প্রয়োজন হতে পারে।


এটি প্রকৃতপক্ষে সত্য নয় - আপনি সর্বদা কোনও কাজটি করার জন্য নিজের পরিষেবায় নির্ভর করার পরিবর্তে ম্যানুয়ালি হত্যা করতে পারেন। পরিষেবাটি যখন এটি হত্যা করা হয়েছে তা সনাক্ত করে, এটি আবার আনার চেষ্টা করবে, আবার এটির পুনরায় টানতে বাধ্য করবেtag
মিঃডুক

1

আমার জন্য যে পদ্ধতির কাজ করে তা উপরের মতো। আপনার পরিষেবা এবং কার্য তৈরি করার পরে এবং সমস্ত কিছু শুরু করার পরে, অটো-স্কেলিং গ্রুপটি সম্পাদনা করুন এবং ন্যূনতম , সর্বাধিক এবং পছন্দসই 1 তে সেট করা হয়েছে তা নিশ্চিত করুন ।

গ্রুপটি ডিফল্ট হতে পারে; যদি আপনি নিশ্চিত না হন তবে আপনি নিজের ক্লাস্টারের ECS উদাহরণ ট্যাবটি নির্বাচন করে এটিতে যেতে পারেন , তারপরে অ্যাকশনস ড্রপ-ডাউন থেকে ক্লাস্টার রিসোর্সগুলি চয়ন করুন এবং ডায়ালগ বাক্সের নীচের লিঙ্কটি ক্লিক করুন যা খোলে।

যখন এটি সমস্ত স্থানে থাকে আপনি যে কোনও সময় আপডেট কনটেইনার চিত্র স্থাপন করতে চান ক্লাস্টারের টাস্ক এরিয়ায় যান এবং টাস্কটি থামান । আপনি একটি সতর্কতা পাবেন, তবে অটো-স্কেলিং পরিষেবাটি সেট আপ করা থাকলে সর্বশেষতম ধাক্কা দিয়ে এটি আবার চালু হবে।

কোনও পরিষেবা বা টাস্কের নতুন সংস্করণ তৈরি করার দরকার নেই।

নোট করুন যে পরিষেবা / টাস্ক তত্ক্ষণাত থেকে এক মিনিট বা তার মধ্যে তত্ক্ষণাত নিজেকে আপডেট করে। আপনি যদি মরিয়া প্রতীক্ষা পান তবে আপনি কেবল নতুন টাস্কটি ম্যানুয়ালি চালাতে পারেন। পরিষেবাটি এটির মালিক হবে না, সুতরাং এটি আদর্শ নয়, তবে এটি মারা গেলে এখনও এটি একটি নতুন স্পিন তৈরি করবে।


1

আমি জানি এটি একটি পুরানো থ্রেড, তবে সমাধানটি এখানে বেশিরভাগ উত্তরের চেয়ে অনেক সহজ।

চলমান ধারকটি কীভাবে দুটি পদক্ষেপে আপডেট করবেন:

নীচে ধরে নেওয়া হয়েছে যে আপনার কোনও চাকরী চলছে যা কোনও ধারক ট্যাগযুক্ত latest(বা অন্য কোনও স্থিতিশীল ট্যাগ যা কনটেইনার আপডেটগুলিতে পরিবর্তন করে না) উল্লেখ করছে।

  1. আপনার নতুন ধারকটি সংগ্রহস্থলে আপলোড করুন
  2. ম্যানুয়ালি আপনার কাজগুলি হত্যা

যদি লক্ষ্যটি আমাদের বন্যের মধ্যে নতুন নতুন গড়ার লক্ষণ হয়, তবে আমাদের সত্যিকার অর্থে আমাদের সেবার উপর নির্ভর করার দরকার নেই (এবং আমি যুক্তি দেব, আমাদের এটির উপর নির্ভর করা উচিত নয় )। আপনি যদি আপনার কাজটি মেরে ফেলেন তবে পরিষেবাটি স্বীকৃতি দেবে যে এতে কারও Desired Countকাজ চলছে না এবং কেবল একটি নতুন স্পিন আপ করে। এটি একই ট্যাগের উপর ভিত্তি করে আপনার ধারকটির পুনরায় টান দেবে।

ইসিএস পরিষেবাদিগুলি এইচএ সুরক্ষা নেট, আপনার সিডি / সিআই পাইপলাইনের প্রতিস্থাপন নয়


বোনাস: যদি কোনও পরিষেবাটি সনাক্ত করার লক্ষ্যটি হয় তবে একটি নতুন ধারককে ধাক্কা দেওয়া হয়েছে (ট্যাগ নির্বিশেষে), আমাদের এটির প্রভাবগুলি বিবেচনা করতে হবে। আমরা কি সত্যিই আমাদের জন্য আমাদের স্থাপনার পাইপলাইন নিয়ন্ত্রণকারী একটি বেসিক পরিষেবা চাই? সম্ভবত না। আদর্শভাবে, আপনি আপনার ধারকগুলিকে বিভিন্ন ট্যাগ দিয়ে চাপ দেবেন (রিলিজ সংস্করণ বা কোনও কিছুর উপর ভিত্তি করে)। এই ক্ষেত্রে, স্থাপনার ক্ষেত্রে বাধা হ'ল পরিষেবাটিকে নতুন কিছু সম্পর্কে অবহিত করতে হবে - আবার, এটি পরিষেবার একটি সুরক্ষার জাল, এবং আরও কিছু নয়।


কীভাবে তিনটি পদক্ষেপে নতুন ট্যাগ স্থাপন করা যায়:

  1. আপনার নতুন container:tagসংগ্রহস্থলে আপলোড করুন
  2. নতুন উল্লেখ করে একটি নতুন টাস্ক সংজ্ঞা তৈরি করুন tag
  3. নতুন কার্য সংজ্ঞাটি উল্লেখ করতে আপনার পরিষেবা আপডেট করুন
    • সাবধান! আপনি যদি কিছু উত্তর উত্তর হিসাবে minimum healthyসেট করেন 0%, আপনি নতুন টাস্ক সংজ্ঞা স্থাপনের জন্য আপনার পুরো পরিষেবাটি মেরে ফেলার জন্য AWS- কে সম্পূর্ণ ক্ষমতা দিচ্ছেন। আপনি যদি রোলিং / ধীরে ধীরে স্থাপনা পছন্দ করেন তবে সর্বনিম্ন কোনও কিছুর মধ্যে সেট করুন >0%
    • অন্যথা, আপনার সেট minimum healthyথেকে 100%এবং আপনার maximum healthyকিছু >100%আপনার সেবা স্থাপন করার অনুমতি নতুন পুরনো (আপনার ব্যবহারকারীদের কাছে প্রভাব কমানোর) বন্ধ হত্যা করার আগে কর্ম।

এই বিন্দু থেকে, আপনার পরিষেবাদি স্বয়ংক্রিয়ভাবে আপনাকে একটি নতুন কাজ নির্দিষ্ট করেছে এবং স্বীকৃত minimum/ maximumস্বাস্থ্যকর প্রান্তিকের উপর ভিত্তি করে এটি মোছার কাজ করবে work


সুন্দর, ধন্যবাদ, অন্যান্য উত্তরগুলির চেয়ে ভাল
ওলেগজান্ডার ডেনম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.