আজকাল, TLS শংসাপত্র সুরক্ষা ছাড়া পাবলিক API এন্ডপয়েন্ট রয়েছে এমন সিস্টেমগুলি কল্পনা করা চ্যালেঞ্জিং। শংসাপত্র জারি করার বিভিন্ন উপায় রয়েছে:
এই পোস্টের প্রেক্ষাপটে, আমি মূলত বিনামূল্যের শংসাপত্রগুলি নিয়ে আলোচনা করব যা AWS-এর ভিতরে ব্যবহার করা যেতে পারে, কিন্তু শুধুমাত্র AWS পরিষেবাগুলির দ্বারা নয়৷ স্পষ্টতই, আপনি যদি একচেটিয়াভাবে পরিচালিত AWS পরিষেবাগুলি ব্যবহার করেন এবং কঠোর নিরাপত্তা প্রয়োজনীয়তা না থাকে তবে AWS সার্টিফিকেট ম্যানেজার ছাড়া অন্য কিছু ব্যবহার করার কোনো মানে হয় না। AWS সার্টিফিকেট ম্যানেজার DNS বা HTTP চ্যালেঞ্জের মাধ্যমে সার্টিফিকেট প্রদানের একটি খুব সুবিধাজনক এবং দ্রুত পদ্ধতি অফার করে; যাইহোক, আপনি যদি এই সার্টিফিকেটগুলিকে AWS পরিষেবার বাইরে ব্যবহার করতে চান (API গেটওয়ে, ALB, NLB, ইত্যাদি), যেমন Nginx চলমান একটি EC2 ইন্সট্যান্স যার একটি ফিজিক্যাল সার্টিফিকেট ফাইলের প্রয়োজন হলে আপনি মৌলিক AWS সীমাবদ্ধতার সম্মুখীন হন। অতিরিক্তভাবে, আপনি অনুরোধ করলেও, AWS সার্টিফিকেট ম্যানেজার সার্টিফিকেট সামগ্রী প্রদর্শন করে না।
এই মুহুর্তে আপনাকে LetsEncrypt সম্পর্কে মনে করিয়ে দেওয়ার একটি ভাল সময়, সার্টিফিকেট ম্যানেজারের চেয়ে একটি বেশি ব্যবহৃত টুল-অন্তত কারণ এটি ক্লাউডের উপর নির্ভর করে না। দুর্ভাগ্যবশত, AWS-এ কোনো অন্তর্নির্মিত LetsEncrypt শংসাপত্র প্রদানের কৌশল উপলব্ধ নেই। আপনার EC2 বা ECS পরিষেবাগুলির জন্য certbot টুলটি ব্যবহার করা সম্ভব, কিন্তু সেই পরিস্থিতিতে, আপনাকে কীভাবে পুনর্নবীকরণ প্রক্রিয়া কনফিগার করতে হবে তা বিবেচনা করতে হবে। আমি বিভিন্ন কৌশলগুলিকে একত্রিত করতে চাই না কারণ আমি মনে করি সবকিছুর জন্য একটি একক পদ্ধতি থাকা ভাল কারণ এটি পুরো সিস্টেমের জটিলতা হ্রাস করে।
এটি বিবেচনায় নিয়ে, আমি একটি Lambda ফাংশন তৈরি করেছি যা জটিল কনফিগারেশনের প্রয়োজন ছাড়াই স্বয়ংক্রিয়ভাবে LetsEncrypt শংসাপত্রগুলি ইস্যু এবং পুনর্নবীকরণ করে। শংসাপত্রটি প্রাথমিক শংসাপত্র ইস্যু হওয়ার পরে AWS সার্টিফিকেট ম্যানেজার শংসাপত্রের সাথে ARN ব্যবহার করে যেকোনো AWS পরিষেবাতে ব্যবহার করা যেতে পারে। অতিরিক্তভাবে, আপনি একটি ফিজিক্যাল সার্টিফিকেট সংস্করণ ব্যবহার করতে পারেন যা AWS সিক্রেটস ম্যানেজারে রাখা হয় আপনি যে কোনো অবস্থানেই বেছে নিন, তা Nginx বা অন্য কোনো স্থানে চলমান EC2 উদাহরণই হোক না কেন।
এই নিবন্ধে, আমি ধরে নেব যে আপনার DNS জোন AWS Route53 দ্বারা পরিচালিত হয়।
এই নিবন্ধে বর্ণিত Lambda ফাংশনটি Go v1.22 এ লেখা হয়েছে। সমস্ত ফলাফল সংস্থান যেমন DNS রেকর্ড, গোপনীয়তা বা শংসাপত্রগুলি Amazon IAM ভূমিকা দ্বারা নিয়ন্ত্রিত হয়, যা ডিফল্টরূপে Terraform কোডের মাধ্যমে তৈরি করা হয়। Lambda কর্মের ক্রম নিম্নরূপ:
aws_cloudwatch_event_target
এর মাধ্যমে তৈরি করা হয় ক্রোন দ্বারা সঞ্চালন। ইভেন্ট উদাহরণ: { "domainName": "hackernoon.referrs.me", "acmeUrl": "prod", "acmeEmail": "[email protected]", "reImportThreshold": 10, "issueType": "default", "storeCertInSecretsManager" : true }
DNS-01
চ্যালেঞ্জ শুরু করুন যদি মেয়াদ শেষ হওয়ার তারিখ পর্যন্ত দিনের সংখ্যা reImportThreshold
এর থেকে কম হয়। এই ধাপে Lambda AWS Route53 জোনের সাথে ডোমেইন নামের সাথে মিলে যাওয়া একটি TXT
রেকর্ড তৈরি করে এবং আপনার শংসাপত্র প্রস্তুত হওয়ার জন্য অপেক্ষা করে।storeCertInSecretsManager
সত্য হলে Lambda AWS সিক্রেটস ম্যানেজারের মধ্যে সার্টিফিকেট ফাইল সংরক্ষণ করবে।
কোড
Lambda Go 1.22 এ লেখা আছে। যতটা সম্ভব কম লাইব্রেরি ব্যবহার করা আমাকে কোড শুষ্ক রাখার লক্ষ্য বজায় রাখতে সাহায্য করেছে। প্রয়োজনীয় গো লাইব্রেরির সম্পূর্ণ তালিকা:
URL | বর্ণনা |
---|---|
Go ডেভেলপারদের AWS Lambda ফাংশন বিকাশে সাহায্য করার জন্য লাইব্রেরি, নমুনা এবং টুল। | |
গো প্রোগ্রামিং ভাষার জন্য AWS SDK। | |
আসুন এনক্রিপ্ট / ACME ক্লায়েন্ট এবং লাইব্রেরি। | |
বাতিলযোগ্য মানগুলির যুক্তিসঙ্গত পরিচালনা। | |
Go এর জন্য স্ট্রাকচার্ড, প্লাগেবল লগিং। |
ডকার ইমেজ
আমি একটি মৌলিক ডকার ইমেজ হিসাবে gcr.io/distroless/static:nonroot ব্যবহার করেছি। Go অ্যাপ্লিকেশনগুলির জন্য যেগুলির জন্য libc প্রয়োজন হয় না, এই চিত্রটি নিখুঁত৷ এটি scratch
হিসাবে সম্পূর্ণ খালি নয় এবং নিম্নলিখিতগুলি অন্তর্ভুক্ত করে:
নির্মাণ প্রক্রিয়া
বড় সফ্টওয়্যার প্রকল্পগুলিতে, নির্মাণ প্রক্রিয়ার তদারকি করা একটি শ্রমসাধ্য এবং সময়সাপেক্ষ কাজে পরিণত হতে পারে। মেকফাইলস এই প্রক্রিয়াটিকে স্বয়ংক্রিয় এবং স্ট্রীমলাইন করতে সাহায্য করতে পারে, এটি নিশ্চিত করে যে আপনার প্রকল্পটি দক্ষতার সাথে এবং ধারাবাহিকভাবে নির্মিত হয়েছে। সেই কারণে, আমি আমার সমস্ত গোলং প্রকল্পের জন্য মেকফাইল ব্যবহার করতে পছন্দ করি। ফাইলটি সহজ:
##@ General help: ## Display this help. @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) fmt: ## Run go fmt against code. go fmt ./... vet: ## Run go vet against code. go vet ./... ##@ Build build: fmt vet ## Build service binary. go build -o bin/lambda main.go run: vet ## Run service from your laptop. go run ./main.go ##@ Test lint: ## Run Go linter golangci-lint run ./... test: ## Run Go tests go test ./...
CICD দিক থেকে আমি Go অ্যাপ্লিকেশনের জন্য সাধারণ সেটআপ ব্যবহার করেছি
ক্রমাগত ইন্টিগ্রেশন হিসাবে গিটহাব অ্যাকশন ।
ghcr.io ডকার রেজিস্ট্রি হিসাবে। ডকারহাবের তুলনায়, এটি দুটি মূল বৈশিষ্ট্য অফার করে যা এটি ব্যবহার করতে আমার পছন্দ করে:
kvendingoldo/semver-action : স্বয়ংক্রিয় সংস্করণের জন্য আমার গিটহাব অ্যাকশন প্লাগইন। এটি একটি গিটহাব অ্যাকশন যা রিপোজিটরি কমিটের জন্য SemVer সামঞ্জস্যপূর্ণ ট্যাগ তৈরি করে। ক্রিয়াটি সংস্করণগুলি পরিচালনা করতে পারে, গিটহাব রিলিজ তৈরি করতে পারে এবং সংগ্রহস্থলের ভিতরে রিলিজ শাখা নিয়ন্ত্রণ করতে পারে। এটি একক এবং মনোরেপোস উভয়ের সাথেই বিস্ময়করভাবে কাজ করে।
স্বয়ংক্রিয় চেঞ্জলগ প্রজন্ম। আমি চেঞ্জলগ উপভোগ করি! অন্যান্য ওপেনসোর্স প্রকল্পগুলির পরিপ্রেক্ষিতে যা আমি পরিচালনা করি (যেমন, https://github.com/tofuutils/tenv , https://github.com/tofuutils/tofuenv , ইত্যাদি), আমার দল ব্যবহারকারীদের সম্পর্কে অবহিত করার গুরুত্ব স্বীকার করেছে পরিবর্তন
golangci-লিন্ট আমার দৃষ্টিকোণ থেকে, সমস্ত কোড একটি স্ট্যাটিক কোড বিশ্লেষক দ্বারা পর্যালোচনা করা উচিত। সোনারকিউব সমস্ত প্রকল্পের জন্য সেট আপ করা যায় না, তবে আমার মতে, ছোট থেকে মাঝারি গো প্রকল্পগুলির জন্য গোলংসি যথেষ্ট।
এই পৃষ্ঠায় আলোচনা করা কোডটি Terraform এবং OpenTofu-এর জন্য একই, কিন্তু Terraform v1.6 দিয়ে শুরু করে Hashicorp-এর টেরাফর্ম লাইসেন্সকে বিজনেস সোর্স লাইসেন্স (BSL) v1.1-এ পরিবর্তন করা হয়েছে। আপনি যদি এর উপরে বাণিজ্যিক কিছু তৈরি করছেন Terraform, যত তাড়াতাড়ি সম্ভব OpenTofu এ স্যুইচ করুন।
আপনার যদি OpenTofu বা Terraform এর একাধিক সংস্করণ পরিচালনা করতে হয়, তাহলে ব্যবহার করুন
আরও Terraform / OpenTofu উদাহরণ Git সংগ্রহস্থলের মধ্যে উদাহরণ ফোল্ডারে পাওয়া যাবে।
OpenTofu এর মাধ্যমে AWS LetsEncrypt Lambda এর সাথে কাজ করতে আপনাকে নিম্নলিখিত পদক্ষেপগুলি করতে হবে:
আপনার OpenTofu / Terraform কোডে মডিউল যোগ করুন
module "letsencrypt_lambda" { source = "[email protected]:kvendingoldo/aws-letsencrypt-lambda.git//files/terraform/module?ref=0.31.4" blank_name = "kvendingoldo-letsencrypt-lambda" tags = var.tags cron_schedule = var.letsencrypt_lambda_cron_schedule events = var.letsencrypt_lambda_events ecr_proxy_username = var.ecr_proxy_username ecr_proxy_access_token = var.ecr_proxy_access_token }
ভেরিয়েবল নির্দিষ্ট করুন
variable "tags" { default = { hackernoon : "demo" } } variable "ecr_proxy_username" { default = "kvendingoldo" } variable "ecr_proxy_access_token" { default = "ghp_xxx" } variable "letsencrypt_lambda_cron_schedule" { default = "rate(168 hours)" } variable "letsencrypt_lambda_events" { default = [ { "acmRegion" : "us-east-1", "route53Region" : "us-east-1", "domainName" : "hackernoon.referrs.me", "acmeUrl" : "stage", "acmeEmail" : "[email protected]", "reImportThreshold" : 100, "issueType" : "default", "storeCertInSecretsManager" : false } ] }
ecr_proxy_username
এবং ecr_proxy_access_token
ভেরিয়েবলগুলিতে মনোযোগ দিন। ডিফল্টরূপে, AWS Lambda AWS ECR ছাড়া অন্য উৎস থেকে ছবি তুলতে পারে না। সৌভাগ্যবশত, AWS টিম ECR প্রক্সি ক্যাশে তৈরি করেছে, যা সর্বজনীনভাবে উপলব্ধ রেজিস্ট্রি যেমন DockerHub বা GHCR থেকে ছবি আনতে পারে এবং সেগুলি ECR-এর মধ্যে সংরক্ষণ করতে পারে। এই সম্ভাবনা থাকা সত্ত্বেও, AWS কোনো টোকেন ছাড়া ছবি তোলার অনুমতি দেয় না, এমনকি উন্মুক্ত পাবলিক রিপোজিটরি থেকেও, এইভাবে আপনাকে প্রাক-নির্মিত ডকার চিত্রগুলিতে অ্যাক্সেস পেতে একটি ব্যক্তিগত গিটহাব টোকেন অর্জন করতে হবে। বিকল্পভাবে, আপনি আমার GitHub সংগ্রহস্থল টানতে পারেন, স্থানীয়ভাবে ছবিটি তৈরি করতে পারেন, তারপর এটি আপনার পূর্ব-বিদ্যমান ECR সংগ্রহস্থলে আপলোড করতে পারেন। এই পরিস্থিতিতে, উদাহরণটি নিম্নরূপ সংশোধন করা যেতে পারে:
module "letsencrypt_lambda" { source = "../../" blank_name = "kvendingoldo-letsencrypt-lambda" tags = var.tags cron_schedule = var.letsencrypt_lambda_cron_schedule events = var.letsencrypt_lambda_events ecr_proxy_enabled = false ecr_image_uri = "<YOUR_ACCOUNT_ID>.dkr.ecr.us-east-2.amazonaws.com/aws_letsencrypt_lambda:<VERSION>" }
যখন আপনি কোড পরিবর্তন সম্পূর্ণ করবেন, OpenTofu সংস্করণ সুইচার tenv দ্বারা OpenTofu ইনস্টল করতে নিম্নলিখিত কমান্ডটি চালান:
$ tenv tofu install
এবং অবশেষে, উত্পাদিত কোড প্রয়োগ করতে নিম্নলিখিত কমান্ডগুলি চালান:
$ tofu init $ tofu plan $ tofu apply
কোডটি AWS-এ স্থাপন করা এবং ইভেন্টগুলি ট্রিগার হওয়া পর্যন্ত অপেক্ষা করুন। কয়েক মিনিট পর, আপনি সার্টিফিকেট ম্যানেজারের ভিতরে প্রস্তুত শংসাপত্র দেখতে পাবেন। উদাহরণ:
এখন থেকে, AWS ARN-এর যেকোনো পরিষেবায় ইস্যু করা শংসাপত্র ব্যবহার করতে পারে।
আপনি যদি AWS পরিষেবার বাইরে সার্টিফিকেট ব্যবহার করতে চান বা এর সামগ্রীতে অ্যাক্সেস পেতে চান, তাহলে storeCertInSecretsManager
ইভেন্ট বিকল্পটিকে true
সেট করুন৷ এই পরিস্থিতিতে, যখন Lambda মৌলিক সম্পাদন সম্পূর্ণ করবে, সার্টিফিকেটটি AWS Secrets Manager-এ সংরক্ষিত হবে। এটি ব্যবহারকারীদের আরও নমনীয়তা দেয়: তারা শংসাপত্রের বিষয়বস্তু পরীক্ষা করতে পারে, EC2 থেকে সরাসরি এটির সাথে কাজ করতে পারে, ইত্যাদি। AWS সিক্রেটস ম্যানেজার সম্পর্কে আরও জানতে, অফিসিয়াল গাইড পড়ুন।
নাম | বর্ণনা | সম্ভাব্য মান | ডিফল্ট মান | উদাহরণ | প্রয়োজন |
---|---|---|---|---|---|
| লগের জন্য ফরম্যাটার প্রকার | JSON | টেক্সট | টেক্সট | JSON | ❌ |
| অ্যাপ্লিকেশন মোড। AWS নির্বাহের জন্য | মেঘ | স্থানীয় | মেঘ | মেঘ | ✅ |
| লগিং স্তর | প্যানিক|মারাত্মক|ত্রুটি|সতর্কতা|তথ্য|ডিবাগ|ট্রেস | সতর্ক করা | সতর্ক করা | ❌ |
| ডিফল্ট AWS অঞ্চল। AWS-এ স্থাপনার পর এটি স্বয়ংক্রিয়ভাবে সেটিংস হয়ে যায়। | <যেকোন বৈধ AWS অঞ্চল> | - | us-east-1 | ✅ |
| ডোমেনের নাম যার জন্য শংসাপত্র জারি বা নবায়ন করা হচ্ছে | কোনো বৈধ ডোমেইন নাম | - | হ্যাকারনুন referrs.me | ✅ |
| উৎপাদন LetsEncrypt URL ব্যবহার করা হবে যদি এটি | পণ্য | মঞ্চ | পণ্য | পণ্য | ✅ |
| LetsEncrypt শংসাপত্রের সাথে লিঙ্ক করা ইমেল ঠিকানা | কোনো বৈধ ইমেইল | ✅ | ||
| শংসাপত্রটি পুনর্নবীকরণ করা হবে যদি বেঁচে থাকার সময় (TTL) | যেকোনো int > 0 | 10 | 10 | ✅ |
| | "সত্য" | "মিথ্যা" | "মিথ্যা" | "মিথ্যা" | ❌ |
aws-letsencrypt-lambda- এর সাথে কাজের সুযোগে আপনি মাঝে মাঝে লগগুলি পর্যালোচনা করতে চাইতে পারেন। এটি সম্পন্ন করা বেশ সহজ:
/aws/lambda/kvendingoldo-letsencrypt-lambda
ল্যাম্বডা ফাংশনে যান যা OpenTofu এর মাধ্যমে তৈরি করা হয়েছে। "পরীক্ষা" বোতামে ক্লিক করুন।
Test Event
পূরণ করুন এবং Test
ক্লিক করুন
{ "domainName": "<YOUR_VALID_DOMAIN>", "acmeUrl": <stage | prod>, "acmeEmail": "<ANY_VALID_EMAIL>", "reImportThreshold": 10, "issueType": "<default | force>", "storeCertInSecretsManager" : <true | false> }
উদাহরণ #1:
{ "domainName": "hackernoon.referrs.me", "acmeUrl": "prod", "acmeEmail": "[email protected]", "reImportThreshold": 10, "issueType": "default" }
ফাঁসি কার্যকর হওয়া পর্যন্ত অপেক্ষা করুন। আপনি এক্সিকিউশন লগটি ক্লাউডওয়াচ-এ উপলব্ধ করতে পারেন। সাধারণত প্রাথমিক সমস্যাটি প্রায় 5 মিনিট সময় নেয়।
আপনার ল্যাপটপে https://github.com/kvendingoldo/aws-letsencrypt-lambda সংগ্রহস্থল ক্লোন করুন
অফিসিয়াল গাইডের মাধ্যমে AWS Cli শংসাপত্র কনফিগার করুন।
এনভায়রনমেন্ট ভেরিয়েবল বিভাগ পরীক্ষা করুন এবং প্রয়োজনীয় ভেরিয়েবলের ন্যূনতম সংখ্যা সেট করুন। যেহেতু LetsEncrypt ACME_URL="prod"
এর জন্য প্রতি ঘন্টায় পুনরায় চেষ্টা করার পরিমাণ সীমিত করবে, তাই আমি পরীক্ষার জন্য ACME_URL="stage"
ব্যবহার করার পরামর্শ দিচ্ছি। পরিবেশ পরিবর্তনশীল উদাহরণ:
export AWS_REGION="us-east-2" export MODE=local export DOMAIN_NAME="hackernoon.referrs.me" export ACME_URL="stage" export ACME_EMAIL="[email protected]" export REIMPORT_THRESHOLD=10 export ISSUE_TYPE="default" export STORE_CERT_IN_SECRETSMANAGER="true"
নিম্নলিখিত কমান্ডের মাধ্যমে স্থানীয়ভাবে ল্যাম্বডা চালান:
go run main.go
Lambda এর সফল সম্পাদনের পরে, নিম্নলিখিত লগটি প্রদর্শিত হবে।
INFO[0000] Starting lambda execution ... INFO[0000] Lambda will use STAGING ACME URL; If you need to use PROD URL specify it via 'ACME_URL' or pass in event body INFO[0000] Certificate found, arn is arn:aws:acm:us-east-2:004867756392:certificate/72f872fd-e577-43f4-ae38-6833962630af. Trying to renew ... INFO[0000] Checking certificate for domain 'hackernoon.referrs.me' with arn 'arn:aws:acm:us-east-2:004867756392:certificate/72f872fd-e577-43f4-ae38-6833962630af' INFO[0000] Certificate status is 'ISSUED' INFO[0000] Certificate in use by [] INFO[0000] Certificate valid until 2024-08-31 13:50:49 +0000 UTC (89 days left) INFO[0000] Try to get certificate for hackernoon.referrs.me domain 2024/06/02 17:56:23 [INFO] acme: Registering account for [email protected] 2024/06/02 17:56:24 [INFO] [hackernoon.referrs.me, www.hackernoon.referrs.me] acme: Obtaining bundled SAN certificate 2024/06/02 17:56:25 [INFO] [hackernoon.referrs.me] AuthURL: https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/12603809394 2024/06/02 17:56:25 [INFO] [www.hackernoon.referrs.me] AuthURL: https://acme-staging-v02.api.letsencrypt.org/acme/authz-v3/12603809404 2024/06/02 17:56:25 [INFO] [hackernoon.referrs.me] acme: Could not find solver for: tls-alpn-01 2024/06/02 17:56:25 [INFO] [hackernoon.referrs.me] acme: Could not find solver for: http-01 2024/06/02 17:56:25 [INFO] [hackernoon.referrs.me] acme: use dns-01 solver 2024/06/02 17:56:25 [INFO] [www.hackernoon.referrs.me] acme: Could not find solver for: tls-alpn-01 2024/06/02 17:56:25 [INFO] [www.hackernoon.referrs.me] acme: Could not find solver for: http-01 2024/06/02 17:56:25 [INFO] [www.hackernoon.referrs.me] acme: use dns-01 solver 2024/06/02 17:56:25 [INFO] [hackernoon.referrs.me] acme: Preparing to solve DNS-01 2024/06/02 17:56:26 [INFO] Wait for route53 [timeout: 5m0s, interval: 4s] 2024/06/02 17:57:00 [INFO] [www.hackernoon.referrs.me] acme: Preparing to solve DNS-01 2024/06/02 17:57:00 [INFO] Wait for route53 [timeout: 5m0s, interval: 4s] 2024/06/02 17:57:30 [INFO] [hackernoon.referrs.me] acme: Trying to solve DNS-01 2024/06/02 17:57:30 [INFO] [hackernoon.referrs.me] acme: Checking DNS record propagation. [nameservers=109.122.99.130:53,109.122.99.129:53] 2024/06/02 17:57:34 [INFO] Wait for propagation [timeout: 5m0s, interval: 4s] 2024/06/02 17:57:46 [INFO] [hackernoon.referrs.me] The server validated our request 2024/06/02 17:57:46 [INFO] [www.hackernoon.referrs.me] acme: Trying to solve DNS-01 2024/06/02 17:57:46 [INFO] [www.hackernoon.referrs.me] acme: Checking DNS record propagation. [nameservers=109.122.99.130:53,109.122.99.129:53] 2024/06/02 17:57:50 [INFO] Wait for propagation [timeout: 5m0s, interval: 4s] 2024/06/02 17:58:30 [INFO] [www.hackernoon.referrs.me] The server validated our request 2024/06/02 17:58:30 [INFO] [hackernoon.referrs.me] acme: Cleaning DNS-01 challenge 2024/06/02 17:58:30 [INFO] Wait for route53 [timeout: 5m0s, interval: 4s] 2024/06/02 17:59:09 [INFO] [www.hackernoon.referrs.me] acme: Cleaning DNS-01 challenge 2024/06/02 17:59:09 [INFO] Wait for route53 [timeout: 5m0s, interval: 4s] 2024/06/02 17:59:43 [INFO] [hackernoon.referrs.me, www.hackernoon.referrs.me] acme: Validations succeeded; requesting certificates 2024/06/02 17:59:43 [INFO] Wait for certificate [timeout: 30s, interval: 500ms] 2024/06/02 17:59:45 [INFO] [hackernoon.referrs.me] Server responded with a certificate. INFO[0203] Certificate has been successfully imported. Arn is arn:aws:acm:us-east-2:004867756392:certificate/72f872fd-e577-43f4-ae38-6833962630af INFO[0204] Secret updated successfully. SecretId: arn:aws:secretsmanager:us-east-2:004867756392:secret:hackernoon.referrs.me-NioT77 INFO[0204] Lambda has been completed
হ্যাঁ, ওটাই. এখন থেকে, AWS ARN-এর যেকোন পরিষেবায় বা অন্যান্য স্থানে যেখানে এটি AWS সিক্রেটস ম্যানেজার থেকে প্রাপ্তির মাধ্যমে ইস্যু করা শংসাপত্র ব্যবহার করতে পারে।
আমি প্রায় চার বছর ধরে উৎপাদনে ল্যাম্বডা ফাংশন ব্যবহার করছি। বছরের পর বছর ধরে, প্রাথমিক বাস্তবায়নের বিভিন্ন দিক পরিবর্তিত হয়েছে:
পূর্বে, AWS Lambda উত্স হিসাবে যেকোন নন-ইসিআর রেজিস্ট্রিগুলির ব্যবহার নিষিদ্ধ করেছিল। এটি পরিবর্তিত হয়নি, তবে AWS GitHub, DockerHub এবং কয়েকটি অতিরিক্ত রেজিস্ট্রির জন্য ECR প্রক্সি যোগ করেছে। এই কার্যকারিতা ছাড়া, আমাদের ব্যক্তিগত ইসিআর-এ ল্যাম্বডা ইমেজগুলিকে ম্যানুয়ালি পুশ করতে হবে এবং টেরাফর্ম কোডে ইউআরএল প্রতিস্থাপন করতে হবে। এখন OpenTofu কোড এটি স্বয়ংক্রিয়ভাবে ECR প্রক্সির মাধ্যমে করে।
শুরুতে, আমি http-01
বা tls-alpn-01
এর মতো বিভিন্ন চ্যালেঞ্জ প্রবর্তন করার কথা বিবেচনা করেছি, কিন্তু চার বছর ধরে কেউ আমাকে প্রশ্ন করেনি। এটি এখনও গিটহাব সমস্যাগুলিতে উপস্থিত রয়েছে এবং যদি এই ক্ষমতার প্রয়োজন হয় তবে আমরা এটি তৈরি করতে একসাথে কাজ করতে পারি।
আমি বিশুদ্ধ EC2 দৃষ্টান্তে LetsEncrypt শংসাপত্রগুলি ব্যবহার করতে চাইনি যখন প্রকল্পটি মূলত শুরু হয়েছিল, কিন্তু আজকাল এটি আদর্শ অনুশীলন। যেমন আমি আগে বলেছি, নির্দিষ্ট পরিস্থিতিতে, AWS cli ব্যবহার করে পরিচালিত AWS সিক্রেটস থেকে একটি শংসাপত্র পুনরুদ্ধার করা যেতে পারে।
আমি বছরের পর বছর ধরে অনেক নতুন গো কোড লিখেছি, তাই আমি বলতে পারি যে আমার সংগ্রহস্থলে আসল ল্যাম্বডা কোডটি যতটা অভিনব হতে পারে ততটা নয়। এটি এবং আমার সাম্প্রতিক Go প্রকল্প, tenv (OpenTofu, Terraform, Terragrunt, এবং Atmos সংস্করণ ম্যানেজার, Go-তে লেখা) এর মধ্যে একটি উল্লেখযোগ্য পার্থক্য রয়েছে, কিন্তু যে কোনও ক্ষেত্রে, কোডটি এখনও সাধারণভাবে সমর্থিত, তাই এটিতে পরিবর্তন করা জিতেছে খুব সমস্যাযুক্ত হবেন না। মাঝে মাঝে, কোডটিকে আরো মার্জিত করতে আমি উল্লেখযোগ্য রিফ্যাক্টরিং গ্রহণ করব।
একই ল্যাম্বদা বছরের পর বছর ধরে বিভিন্ন প্রকল্পে ব্যবহার করা হচ্ছে। উপরন্তু, আমি DevOps প্ল্যাটফর্ম cloudexpress.app- এর সহ-প্রতিষ্ঠাতা, যেখানে আমাদের টিম অটোমেশন প্রক্রিয়াগুলিকে সহজ করার জন্য AWS LetsEncrypt Lambda ব্যবহার করে আমাদের সমস্ত ক্লায়েন্টদের জন্য TLS শংসাপত্রগুলি পরিচালনা করে।
এখন সংখ্যা সম্পর্কে কথা বলা যাক. 4 বছর ধরে, এই প্রকল্পটি অনেক লোককে সাহায্য করেছে এবং বহু ওপেনসোর্স এবং 30 টিরও বেশি বাণিজ্যিক প্রকল্পে ব্যবহৃত হয়েছে। Lambda 2000 টিরও বেশি শংসাপত্র জারি করে এবং এতে থামতে চায় না।
AWS LetsEncrypt Lambda আপনার জন্য একটি উপযুক্ত সমাধান, যদি
আপনি যদি আবিষ্কার করেন যে এই পয়েন্টগুলির মধ্যে অন্তত একটি আপনার পরিস্থিতির জন্য প্রযোজ্য, আপনি AWS Lambda ব্যবহার করতে স্বাগত জানাই। এছাড়াও, আপনি যদি উন্নয়নে অংশগ্রহণ করতে চান, আমি সর্বদা নতুন সমস্যাগুলির জন্য উন্মুক্ত এবং GitHub এ অনুরোধগুলি টানছি। প্রকল্পের URL: https://github.com/kvendingoldo/aws-letsencrypt-lambda ।