আপনি যখন আপনার অ্যাপ্লিকেশনটি EC2 এ স্থাপন করেন, তখন অটোস্কেলিং গ্রুপগুলি ব্যবহার করা একটি ভাল ধারণা। অটোস্কেলিং গোষ্ঠীগুলি আপনার অ্যাপ্লিকেশনকে চাহিদা মেটাতে এবং ব্যর্থতার ঘটনাগুলি থেকে পুনরুদ্ধার করার জন্য, সমস্তই কোনও ম্যানুয়াল হস্তক্ষেপ ছাড়াই স্কেল করার অনুমতি দেয়। তাদের কাজ করার জন্য, যদিও, নিশ্চিত করুন যে প্রতিটি দৃষ্টান্ত এটি বুটিং শেষ হওয়ার পরে লাইভ ট্র্যাফিক পরিষেবার জন্য সম্পূর্ণরূপে প্রস্তুত। আপনার অ্যাপটিকে সার্ভারে স্থাপন করার চেয়ে এটির জন্য একটু বেশি প্রচেষ্টার প্রয়োজন, যদি আপনি একটি নিউজ সার্ভারে কিছু পরিবর্তন করতে অভ্যস্ত হন বা এটি যাওয়ার জন্য প্রস্তুত হওয়ার আগে ক্যাপিস্ট্রানোর মাধ্যমে প্রাথমিক স্থাপনা করেন৷
উদাহরণস্বরূপ, আমাদের কাছে একটি ব্যবহারকারী-মুখী ওয়েব অ্যাপ্লিকেশন রয়েছে যা রেল ব্যবহার করে তৈরি করা হয়েছে৷ এটি বুট করার পরে, প্রতিটি উদাহরণের জন্য সেই রেলগুলি প্রস্তুত থাকতে হবে এবং লোড ব্যালেন্সার দ্বারা ফরোয়ার্ড করা অনুরোধগুলির প্রতিক্রিয়া জানাতে অপেক্ষা করতে হবে৷ এটি ঘটানোর জন্য, আমি প্রথমে একটি কাস্টম তৈরি করেছি৷ AMI অ্যাপ,nginx ইত্যাদির মাধ্যমে Ansible-এর মাধ্যমে প্রবিধান করা একটি উদাহরণের স্ন্যাপশট নিয়ে। তারপর আমি অটোস্কেলিং গ্রুপটিকে ব্যবহারকারীর ডেটা দিয়ে কনফিগার করেছি যা একটি স্ক্রিপ্ট যা ক্যাপিস্ট্রানো নিয়োগের জন্য যা করে তা অনুলিপি করে — এটি গিট থেকে সর্বশেষ কোড টেনে নেয়, বান্ডলার চালায় এবং তাই চালু। তাই অ্যাপ এবং এর সমস্ত নির্ভরতা ঠিক রেখে, কী বাকি আছে?
অ্যাপ্লিকেশন সিক্রেটস:দ্য ডিপ্লোয়ারের ব্যান
অ্যাপ্লিকেশন গোপনীয়তাগুলি একটি চ্যালেঞ্জ উপস্থাপন করে:আপনি সেগুলিকে সঞ্চয় করা থেকে রাখতে চান যেখানে সেগুলি প্রকাশ করা যেতে পারে (যেমন, বলুন, আপনার গিট রেপোতে), তবে আপনার অ্যাপটি চালু হওয়ার সময় সেগুলি উপলব্ধ থাকতে হবে। এবং স্বয়ংক্রিয়ভাবে স্কেলিং এর কারণে, আপনার অ্যাপের প্রয়োজনে সেগুলিকে স্থাপন করার জন্য আপনি সেখানে একজন মানুষের উপর নির্ভর করতে পারবেন না।
এই সমস্যার একটি উত্তর হল Hashicorp দ্বারা ভল্ট। এটি আপনার অ্যাপের প্রয়োজন না হওয়া পর্যন্ত আপনার গোপনীয়তা গোপন রাখার এই সমস্যার সমাধান করার জন্য বিশেষভাবে লেখা সফ্টওয়্যারের একটি চমত্কার অংশ। যাইহোক, খারাপ দিক হল যে আপনাকে ভল্টের ব্যবস্থা করতে হবে এবং পরিচালনা করতে হবে — এটি আরেকটি পরিষেবা যা আপনাকে চালিয়ে যেতে হবে।
আরেকটি বিকল্প হল শেয়ার্ড স্টোরেজ (S3, স্বাভাবিকভাবেই) গোপনীয়তাগুলি সংরক্ষণ করা এবং নিশ্চিত করা যে শুধুমাত্র আপনার দৃষ্টান্তগুলি সেই বালতি এবং/অর্কিতে অ্যাক্সেস রয়েছে। এটি আইএএম ভূমিকা ব্যবহার করে করা যেতে পারে, যা তাদের সাথে নীতি যুক্ত করতে পারে যা সীমাবদ্ধ S3 সংস্থানগুলিতে অ্যাক্সেস দেয়। এটি এখনও আপনাকে অবাঞ্ছিত এক্সপোজারের জন্য উন্মুক্ত করে দেয়, যদিও, যদি আপনি S3 এ প্লেইনটেক্সটে সমস্ত গোপনীয়তা সংরক্ষণ করেন। ভুলবশত সেই ডেটা অন্যদের কাছে সেই বালতি বা এমনকি সমগ্র বিশ্বে অ্যাক্সেসের সাথে উপলব্ধ করা সম্ভব৷
থিমন S3 সংরক্ষণ করার আগে আপনি যদি আপনার গোপনীয়তাগুলিকে এনক্রিপ্ট করতে পারেন এবং তারপরে যখন আপনার প্রয়োজন হয় তখন অ্যাপে সেগুলি লোড এবং ডিক্রিপ্ট করতে পারলে ভাল হবে না?
সিক্রেট উপাদান:অ্যামাজনের কী ম্যানেজমেন্ট সার্ভিস
অ্যামাজনের কী ম্যানেজমেন্ট সার্ভিস (KMS) এনক্রিপশন কীগুলির সাথে ইন্টারঅ্যাক্ট করার জন্য একটি API প্রদান করে। যখন IAM ভূমিকা এবং theAws::S3::এনক্রিপশন মডিউলের সাথে একত্রিত হয়, তখন S3-এ এনক্রিপ্ট করে রেখে আপনার গোপনীয়তাগুলিকে আপনার অ্যাপ্লিকেশনে লোড করতে কোডের কয়েকটি লাইন লাগে।
আমি খনন করার আগে, আমাকে ডন মিলসকে ধন্যবাদ জানাতে হবে, যিনি গোপনীয়তা সংরক্ষণের জন্য KMS প্লাস S3 ব্যবহার করে একটি চমত্কার পোস্টন লিখেছেন। IAM ভূমিকার উপর নির্ভর করে এবং S3-এ গোপনীয়তা সহ মূল তথ্য সংরক্ষণ করার পরিবর্তে আমি আলাদাভাবে KMS কী-এর ট্র্যাক রাখার মাধ্যমে তার পদ্ধতির কিছুটা পরিবর্তন করেছি।
KMS একটি মাস্টার এনক্রিপশন কী তৈরি করে এবং অ্যাক্সেস প্রদান করে যা আপনি ডেটা এনক্রিপ্ট এবং ডিক্রিপ্ট করতে ব্যবহার করতে পারেন। আপনি যখন এটিকে কিছু এনক্রিপ্ট করতে বলেন, তখন KMS আপনাকে মাস্টার কী-এর উপর ভিত্তি করে একটি অস্থায়ী কী দেয় এবং সেই অস্থায়ী কীটি এনক্রিপশন বা ডিক্রিপশনের জন্য ব্যবহার করা যেতে পারে।
একটি কী তৈরি করতে, আপনি IAM কনসোলে যান এবং এনক্রিপশন কী লিঙ্কটি বেছে নিন। আপনি যখন একটি কী তৈরি করেন, তখন আপনাকে আইএএম ব্যবহারকারী বা ভূমিকা নির্দিষ্ট করতে বলা হবে যাদের এই কী ব্যবহার করার ক্ষমতা থাকবে। EC2 দৃষ্টান্তগুলিতে অর্পিত ভূমিকা নির্বাচন করুন যা অটোস্কেলিং গ্রুপের একটি অংশ হবে। কী-এর ARN নোট করুন -- আপনি সেটা পরে ব্যবহার করবেন।
রাক্স তৈরি করা:সমান অংশ KMS এবং IAM
একবার আপনি কী তৈরি করে ফেললে, আপনার নির্বাচিত IAM ভূমিকা সম্পাদনা করতে IAM কনসোল ব্যবহার করুন। বালতিতে অ্যাক্সেস মঞ্জুর করুন যেখানে গোপনটি এইরকম একটি নীতি সংযুক্ত করে সংরক্ষণ করা হবে:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1476277816000",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:HeadObject"
],
"Resource": [
"arn:aws:s3:::yourbucket/secrets.yml"
]
}
]
}
কী কনফিগার করা এবং ভূমিকার সাথে সংযুক্ত নীতির সাথে, আপনি এখন Aws::S3::এনক্রিপশন::ক্লায়েন্ট উদাহরণের মাধ্যমে KMS এবং S3 এর সাথে ইন্টারঅ্যাক্ট করতে পারেন। এখানে কিছু নমুনা কোড রয়েছে যা গোপন ফাইল পুনরুদ্ধার করে এবং এর বিষয়বস্তু পরিবেশের ভেরিয়েবলে লোড করে:
begin
es3 = Aws::S3::Encryption::Client.new(kms_key_id: ENV['KMS_KEY_ID'])
YAML.load(es3.get_object(bucket: "yourbucket", key: "secrets.yml").body.read).each do |k, v|
ENV[k] ||= v # Don't override local ENV settings
end
rescue ArgumentError
# Raised when no KMS_KEY_ID was found in ENV, so there's nothing to do
rescue Aws::S3::Errors::NoSuchKey
# No secrets file was found, so there's nothing to do
end
প্রথমে আমরা কেএমএস কী এর আইডি দিয়ে একটি নতুন অবজেক্ট ইনস্ট্যান্টিয়েট করি। কীটির জন্য ARN (যখন আপনি কী তৈরি করেন তখন IAM কনসোলে প্রদর্শিত হয়) KMS_KEY_ID পরিবেশ ভেরিয়েবলে সংরক্ষণ করা হয়। আপনি যখন এখানে কনস্ট্রাক্টরের কাছে কীআইডি পাস করবেন, তখন এটি আপনার জন্য অস্থায়ী ডিক্রিপশন কীগুলি আনার কাজ পরিচালনা করবে। আপনি এখানে একটি Aws::S3::ক্লায়েন্ট উদাহরণ হিসাবে একটি বিকল্প নির্দিষ্ট করতে পারেন, যদি আপনি KMS-এর সাথে কথা বলার জন্য ব্যবহার করছেন তার থেকে S3-এর জন্য মোট শংসাপত্রের একটি পৃথক সেট ব্যবহার করতে চান। আপনি যদি আগে IAM ভূমিকা সেট আপ করেন তবে, আপনাকে Aws::S3::এনক্রিপশন::ক্লায়েন্ট হিসাবে IAM ভূমিকা দ্বারা প্রদত্ত শংসাপত্র সহ আপনার জন্য একটি নতুন Aws::S3::ক্লায়েন্ট উদাহরণ তৈরি করবে।
এনক্রিপ্ট করা S3 ক্লায়েন্ট প্রস্তুত হলে, S3 থেকে ডেটা আনতে #get_object ব্যবহার করুন এবং KMS দ্বারা প্রদত্ত কী ব্যবহার করে ডিক্রিপ্ট করুন। একবার আপনার কাছে ডেটা থাকলে, আপনি এটি দিয়ে যা চান তা করতে পারেন। আমাদের ডেটা হল YAML, তাই আমরা অ্যাপ্লিকেশন কোড ব্যবহার করার জন্য ENV-তে কী/মান জোড়া লোড করি এবং স্টাফ করি।
আপনার Rails অ্যাপ্লিকেশনে একটি ইনিশিয়ালাইজার ফাইলে এই কোডটি ড্রপ করুন, এবং আপনি যেতে পারেন। ঠিক আছে, একবার আপনি আপনার গোপনীয়তাগুলি S3 এ সঞ্চয় করেছেন, তা হল। :) ধরে নিচ্ছি যে আপনার কাছে সঠিক IAM ভূমিকার সাথে চলমান একটি উদাহরণে একটি IRB কনসোল আছে, আপনি আপনার গোপনীয়তা সংরক্ষণ করার জন্য এরকম কিছু করতে পারেন:
# Encrypt the data from /path/to/secrets.yml and store it on S3
Aws::S3::Encryption::Client.new(kms_key_id: ENV['KMS_KEY_ID']).
put_object(bucket: "yourbucket", key: "secrets.yml", body: File.read("/path/to/secrets.yml"))
অবিলম্বে পরিবেশন করুন
সিক্রেট সেনক্রিপ্টেড রেখে আপনার অটোস্কেলিং গ্রুপে যোগ করা যেকোন নতুন উদাহরণের জন্য আপনার গোপনীয়তাগুলি সর্বদা উপলব্ধ থাকে। সবাই জয়ী! :)