paint-brush
AWS LetsEncrypt Lambda বা কেন আমি OpenTofu এবং Go ব্যবহার করে AWS এর জন্য একটি কাস্টম TLS প্রদানকারী লিখেছিদ্বারা@kvendingoldo
845 পড়া
845 পড়া

AWS LetsEncrypt Lambda বা কেন আমি OpenTofu এবং Go ব্যবহার করে AWS এর জন্য একটি কাস্টম TLS প্রদানকারী লিখেছি

দ্বারা Alexander Sharov15m2024/06/06
Read on Terminal Reader

অতিদীর্ঘ; পড়তে

AWS LetsEncrypt Lambda হল একটি Go 1.22 ভিত্তিক অ্যাপ্লিকেশন যা Let's Encrypt এর মাধ্যমে AWS সার্টিফিকেট ইস্যু, রিনিউ এবং ম্যানেজার করে। শংসাপত্র ইস্যু করার পরে, এটি AWS সার্টিফিকেট ম্যানেজার এবং AWS সিক্রেট ম্যানেজারের ভিতরে শংসাপত্র সংরক্ষণ করে। Lambda সম্পূর্ণরূপে কাস্টমাইজযোগ্য, এবং Terraform বা OpenTofu এর মাধ্যমে AWS এ স্থাপন করা যেতে পারে। এটি কোনো সমস্যা ছাড়াই স্থানীয়ভাবে কার্যকর করা যেতে পারে।
featured image - AWS LetsEncrypt Lambda বা কেন আমি OpenTofu এবং Go ব্যবহার করে AWS এর জন্য একটি কাস্টম TLS প্রদানকারী লিখেছি
Alexander Sharov HackerNoon profile picture
0-item
1-item

আজকাল, TLS শংসাপত্র সুরক্ষা ছাড়া পাবলিক API এন্ডপয়েন্ট রয়েছে এমন সিস্টেমগুলি কল্পনা করা চ্যালেঞ্জিং। শংসাপত্র জারি করার বিভিন্ন উপায় রয়েছে:


  • প্রদত্ত ওয়াইল্ডকার্ড শংসাপত্র যা যেকোনো বড় TLS প্রদানকারীর কাছ থেকে কেনা যাবে
  • প্রদত্ত রুট শংসাপত্র যা কর্পোরেট PKI সিস্টেম দ্বারা জারি করা সমস্ত ডাউনস্ট্রিম শংসাপত্রে স্বাক্ষর করে
  • LetsEncrypt বা AWS সার্টিফিকেট ম্যানেজার মত TLS প্রদানকারীদের দ্বারা জারি করা বিনামূল্যের শংসাপত্র
  • স্ব-স্বাক্ষরিত শংসাপত্র, OpenSSL বা অন্য টুল দ্বারা জারি করা


এই পোস্টের প্রেক্ষাপটে, আমি মূলত বিনামূল্যের শংসাপত্রগুলি নিয়ে আলোচনা করব যা 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 উদাহরণই হোক না কেন।

কিভাবে AWS LetsEncrypt Lambda কাজ করে

এই নিবন্ধে, আমি ধরে নেব যে আপনার DNS জোন AWS Route53 দ্বারা পরিচালিত হয়।

এই নিবন্ধে বর্ণিত Lambda ফাংশনটি Go v1.22 এ লেখা হয়েছে। সমস্ত ফলাফল সংস্থান যেমন DNS রেকর্ড, গোপনীয়তা বা শংসাপত্রগুলি Amazon IAM ভূমিকা দ্বারা নিয়ন্ত্রিত হয়, যা ডিফল্টরূপে Terraform কোডের মাধ্যমে তৈরি করা হয়। Lambda কর্মের ক্রম নিম্নরূপ:


  1. একটি শংসাপত্র তালিকা ধারণকারী একটি ইভেন্ট পান. সাধারণত, এই ইভেন্টটি ম্যানুয়াল এক্সিকিউশনের ফল হতে পারে, অথবা aws_cloudwatch_event_target এর মাধ্যমে তৈরি করা হয় ক্রোন দ্বারা সঞ্চালন। ইভেন্ট উদাহরণ:
 { "domainName": "hackernoon.referrs.me", "acmeUrl": "prod", "acmeEmail": "[email protected]", "reImportThreshold": 10, "issueType": "default", "storeCertInSecretsManager" : true }
  1. AWS সার্টিফিকেট ম্যানেজারে শংসাপত্রটি বিদ্যমান কিনা তা যাচাই করুন। যদি হ্যাঁ, মেয়াদ শেষ হওয়ার তারিখ নিশ্চিত করুন।
  2. LetsEncrypt DNS-01 চ্যালেঞ্জ শুরু করুন যদি মেয়াদ শেষ হওয়ার তারিখ পর্যন্ত দিনের সংখ্যা reImportThreshold এর থেকে কম হয়। এই ধাপে Lambda AWS Route53 জোনের সাথে ডোমেইন নামের সাথে মিলে যাওয়া একটি TXT রেকর্ড তৈরি করে এবং আপনার শংসাপত্র প্রস্তুত হওয়ার জন্য অপেক্ষা করে।
  3. Lambda AWS সার্টিফিকেট ম্যানেজারে শংসাপত্রটি প্রস্তুত হলে আপডেট করে।
  4. storeCertInSecretsManager সত্য হলে Lambda AWS সিক্রেটস ম্যানেজারের মধ্যে সার্টিফিকেট ফাইল সংরক্ষণ করবে।


AWS LetsEncrypt Lambda, সিকোয়েন্স ডায়াগ্রাম।

Lambda বাস্তবায়ন বিবরণ

কোড

Lambda Go 1.22 এ লেখা আছে। যতটা সম্ভব কম লাইব্রেরি ব্যবহার করা আমাকে কোড শুষ্ক রাখার লক্ষ্য বজায় রাখতে সাহায্য করেছে। প্রয়োজনীয় গো লাইব্রেরির সম্পূর্ণ তালিকা:

URL

বর্ণনা

github.com/aws/aws-lambda-go

Go ডেভেলপারদের AWS Lambda ফাংশন বিকাশে সাহায্য করার জন্য লাইব্রেরি, নমুনা এবং টুল।

github.com/aws/aws-sdk-go-v2

গো প্রোগ্রামিং ভাষার জন্য AWS SDK।

github.com/go-acme/lego

আসুন এনক্রিপ্ট / ACME ক্লায়েন্ট এবং লাইব্রেরি।

github.com/guregu/null

বাতিলযোগ্য মানগুলির যুক্তিসঙ্গত পরিচালনা।

github.com/sirupsen/logrus

Go এর জন্য স্ট্রাকচার্ড, প্লাগেবল লগিং।


ডকার ইমেজ

আমি একটি মৌলিক ডকার ইমেজ হিসাবে gcr.io/distroless/static:nonroot ব্যবহার করেছি। Go অ্যাপ্লিকেশনগুলির জন্য যেগুলির জন্য libc প্রয়োজন হয় না, এই চিত্রটি নিখুঁত৷ এটি scratch হিসাবে সম্পূর্ণ খালি নয় এবং নিম্নলিখিতগুলি অন্তর্ভুক্ত করে:


  • CA শংসাপত্র: অন্য কোন পর্যায় থেকে তাদের অনুলিপি করার প্রয়োজন নেই।
  • /etc/passwd: ব্যবহারকারী এবং গোষ্ঠী রয়েছে যেমন nonroot।
  • /tmp ফোল্ডার।
  • tzdata: যদি আপনি UTC ছাড়া অন্য সময় অঞ্চল সেট করতে চান।


নির্মাণ প্রক্রিয়া

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


 ##@ 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 অ্যাপ্লিকেশনের জন্য সাধারণ সেটআপ ব্যবহার করেছি

  1. ক্রমাগত ইন্টিগ্রেশন হিসাবে গিটহাব অ্যাকশন

  2. ghcr.io ডকার রেজিস্ট্রি হিসাবে। ডকারহাবের তুলনায়, এটি দুটি মূল বৈশিষ্ট্য অফার করে যা এটি ব্যবহার করতে আমার পছন্দ করে:

    1. গিটহাব অ্যাকশনের সাথে জিএইচসিআর-এর মসৃণ একীকরণের জন্য গিটহাব রিপোজিটরি থেকে বিল্ড, টেস্ট এবং ডিপ্লয়মেন্ট ওয়ার্কফ্লোগুলি আরও সহজে স্বয়ংক্রিয় হতে পারে। এটি উত্পাদনশীলতা বাড়াতে পারে এবং উন্নয়ন প্রক্রিয়াকে সহজ করতে পারে।
    2. GHCR GitHub-এর অনুমতি মডেল ব্যবহার করে, ব্যবহারকারীদের তাদের কোড সংগ্রহস্থলের জন্য একই দল এবং অনুমতি ব্যবহার করে কন্টেইনার চিত্রগুলিতে অ্যাক্সেস পরিচালনা করতে দেয়। এটি ব্যবহারকারী ব্যবস্থাপনাকে সহজ করে এবং নিরাপত্তা বাড়ায়।
  3. kvendingoldo/semver-action : স্বয়ংক্রিয় সংস্করণের জন্য আমার গিটহাব অ্যাকশন প্লাগইন। এটি একটি গিটহাব অ্যাকশন যা রিপোজিটরি কমিটের জন্য SemVer সামঞ্জস্যপূর্ণ ট্যাগ তৈরি করে। ক্রিয়াটি সংস্করণগুলি পরিচালনা করতে পারে, গিটহাব রিলিজ তৈরি করতে পারে এবং সংগ্রহস্থলের ভিতরে রিলিজ শাখা নিয়ন্ত্রণ করতে পারে। এটি একক এবং মনোরেপোস উভয়ের সাথেই বিস্ময়করভাবে কাজ করে।

  4. স্বয়ংক্রিয় চেঞ্জলগ প্রজন্ম। আমি চেঞ্জলগ উপভোগ করি! অন্যান্য ওপেনসোর্স প্রকল্পগুলির পরিপ্রেক্ষিতে যা আমি পরিচালনা করি (যেমন, https://github.com/tofuutils/tenv , https://github.com/tofuutils/tofuenv , ইত্যাদি), আমার দল ব্যবহারকারীদের সম্পর্কে অবহিত করার গুরুত্ব স্বীকার করেছে পরিবর্তন

  5. golangci-লিন্ট আমার দৃষ্টিকোণ থেকে, সমস্ত কোড একটি স্ট্যাটিক কোড বিশ্লেষক দ্বারা পর্যালোচনা করা উচিত। সোনারকিউব সমস্ত প্রকল্পের জন্য সেট আপ করা যায় না, তবে আমার মতে, ছোট থেকে মাঝারি গো প্রকল্পগুলির জন্য গোলংসি যথেষ্ট।

  6. codespell.yml কোড চেকিং ছাড়াও, ব্যাকরণ যাচাই করা একটি ভাল ধারণা, বিশেষ করে যদি আপনার কাছে প্রচুর পরিমাণে ডকুমেন্টেশন থাকে।

Terraform/OpenTofu এর মাধ্যমে কিভাবে AWS-এ Lambda স্থাপন করবেন

এই পৃষ্ঠায় আলোচনা করা কোডটি Terraform এবং OpenTofu-এর জন্য একই, কিন্তু Terraform v1.6 দিয়ে শুরু করে Hashicorp-এর টেরাফর্ম লাইসেন্সকে বিজনেস সোর্স লাইসেন্স (BSL) v1.1-এ পরিবর্তন করা হয়েছে। আপনি যদি এর উপরে বাণিজ্যিক কিছু তৈরি করছেন Terraform, যত তাড়াতাড়ি সম্ভব OpenTofu এ স্যুইচ করুন।

আপনার যদি OpenTofu বা Terraform এর একাধিক সংস্করণ পরিচালনা করতে হয়, তাহলে ব্যবহার করুন tenv - OpenTofu, Terraform, Terragrunt, এবং Atmos সংস্করণ ম্যানেজার, Go-তে লেখা।

আরও Terraform / OpenTofu উদাহরণ Git সংগ্রহস্থলের মধ্যে উদাহরণ ফোল্ডারে পাওয়া যাবে।

OpenTofu এর মাধ্যমে AWS LetsEncrypt Lambda এর সাথে কাজ করতে আপনাকে নিম্নলিখিত পদক্ষেপগুলি করতে হবে:

  1. আপনার 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 }
  2. ভেরিয়েবল নির্দিষ্ট করুন

     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 } ] }
  3. 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>" }


  4. যখন আপনি কোড পরিবর্তন সম্পূর্ণ করবেন, OpenTofu সংস্করণ সুইচার tenv দ্বারা OpenTofu ইনস্টল করতে নিম্নলিখিত কমান্ডটি চালান:

     $ tenv tofu install
  5. এবং অবশেষে, উত্পাদিত কোড প্রয়োগ করতে নিম্নলিখিত কমান্ডগুলি চালান:

     $ tofu init $ tofu plan $ tofu apply
  6. কোডটি AWS-এ স্থাপন করা এবং ইভেন্টগুলি ট্রিগার হওয়া পর্যন্ত অপেক্ষা করুন। কয়েক মিনিট পর, আপনি সার্টিফিকেট ম্যানেজারের ভিতরে প্রস্তুত শংসাপত্র দেখতে পাবেন। উদাহরণ:

    AWS সার্টিফিকেট ম্যানেজারের ভিতরে AWS LetsEncrypt Lambda-এর ইস্যু সার্টিফিকেটের একটি তালিকা।

  7. এখন থেকে, AWS ARN-এর যেকোনো পরিষেবায় ইস্যু করা শংসাপত্র ব্যবহার করতে পারে।

  8. আপনি যদি AWS পরিষেবার বাইরে সার্টিফিকেট ব্যবহার করতে চান বা এর সামগ্রীতে অ্যাক্সেস পেতে চান, তাহলে storeCertInSecretsManager ইভেন্ট বিকল্পটিকে true সেট করুন৷ এই পরিস্থিতিতে, যখন Lambda মৌলিক সম্পাদন সম্পূর্ণ করবে, সার্টিফিকেটটি AWS Secrets Manager-এ সংরক্ষিত হবে। এটি ব্যবহারকারীদের আরও নমনীয়তা দেয়: তারা শংসাপত্রের বিষয়বস্তু পরীক্ষা করতে পারে, EC2 থেকে সরাসরি এটির সাথে কাজ করতে পারে, ইত্যাদি। AWS সিক্রেটস ম্যানেজার সম্পর্কে আরও জানতে, অফিসিয়াল গাইড পড়ুন।

    জারি করা শংসাপত্রের উদাহরণ, যা AWS সিক্রেটস ম্যানেজারের ভিতরে সংরক্ষিত আছে।


পরিবেশ পরিবর্তনশীল

নাম

বর্ণনা

সম্ভাব্য মান

ডিফল্ট মান

উদাহরণ

প্রয়োজন

FORMATTER_TYPE

লগের জন্য ফরম্যাটার প্রকার

JSON | টেক্সট

টেক্সট

JSON

MODE

অ্যাপ্লিকেশন মোড। AWS নির্বাহের জন্য cloud মোড এবং স্থানীয় পরীক্ষার জন্য local মোড সেট করুন।

মেঘ | স্থানীয়

মেঘ

মেঘ

LOG_LEVEL

লগিং স্তর

প্যানিক|মারাত্মক|ত্রুটি|সতর্কতা|তথ্য|ডিবাগ|ট্রেস

সতর্ক করা

সতর্ক করা

AWS_REGION

ডিফল্ট AWS অঞ্চল। AWS-এ স্থাপনার পর এটি স্বয়ংক্রিয়ভাবে সেটিংস হয়ে যায়।

<যেকোন বৈধ AWS অঞ্চল>

-

us-east-1

DOMAIN_NAME

ডোমেনের নাম যার জন্য শংসাপত্র জারি বা নবায়ন করা হচ্ছে

কোনো বৈধ ডোমেইন নাম

-

হ্যাকারনুন referrs.me

ACME_URL

উৎপাদন LetsEncrypt URL ব্যবহার করা হবে যদি এটি prod এ সেট করা থাকে; যদি না হয়, স্টেজ URL ব্যবহার করা হবে।

পণ্য | মঞ্চ

পণ্য

পণ্য

ACME_EMAIL

LetsEncrypt শংসাপত্রের সাথে লিঙ্ক করা ইমেল ঠিকানা

কোনো বৈধ ইমেইল

[email protected]

[email protected]

REIMPORT_THRESHOLD

শংসাপত্রটি পুনর্নবীকরণ করা হবে যদি বেঁচে থাকার সময় (TTL) REIMPORT_THRESHOLD সমান হয়৷

যেকোনো int > 0

10

10

STORE_CERT_IN_SECRETSMANAGER

true হলে, Lambda শংসাপত্রটি সার্টিফিকেট ম্যানেজার এবং সিক্রেটস ম্যানেজার উভয়েই রাখবে।

"সত্য" | "মিথ্যা"

"মিথ্যা"

"মিথ্যা"


LetsEncrypt Lambda লগগুলি কীভাবে পরীক্ষা করবেন

aws-letsencrypt-lambda- এর সাথে কাজের সুযোগে আপনি মাঝে মাঝে লগগুলি পর্যালোচনা করতে চাইতে পারেন। এটি সম্পন্ন করা বেশ সহজ:

  1. AWS ক্লাউডওয়াচ এ যান, "লগ গ্রুপ" এ ক্লিক করুন
  2. নাম সহ লগ গ্রুপ খুঁজুন, যা আপনি OpenTofu কোডে উল্লেখ করেছেন। উদাহরণস্বরূপ, আমার ক্ষেত্রে এটি /aws/lambda/kvendingoldo-letsencrypt-lambda
  3. গোষ্ঠীতে যান, তালিকা থেকে পছন্দসই স্ট্রীম নির্বাচন করুন এবং লগগুলি পর্যালোচনা করুন৷


কিভাবে AWS UI এর মাধ্যমে Lambda ম্যানুয়ালি ট্রিগার করবেন

  1. ল্যাম্বডা ফাংশনে যান যা OpenTofu এর মাধ্যমে তৈরি করা হয়েছে। "পরীক্ষা" বোতামে ক্লিক করুন।

    AWS LetsEncrypt Lambda: UI ইন্টারফেস

  2. 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" }


  3. ফাঁসি কার্যকর হওয়া পর্যন্ত অপেক্ষা করুন। আপনি এক্সিকিউশন লগটি ক্লাউডওয়াচ-এ উপলব্ধ করতে পারেন। সাধারণত প্রাথমিক সমস্যাটি প্রায় 5 মিনিট সময় নেয়।

স্থানীয়ভাবে ল্যাম্বডা কীভাবে পরীক্ষা করবেন

  1. আপনার ল্যাপটপে https://github.com/kvendingoldo/aws-letsencrypt-lambda সংগ্রহস্থল ক্লোন করুন

  2. অফিসিয়াল গাইডের মাধ্যমে AWS Cli শংসাপত্র কনফিগার করুন।

  3. এনভায়রনমেন্ট ভেরিয়েবল বিভাগ পরীক্ষা করুন এবং প্রয়োজনীয় ভেরিয়েবলের ন্যূনতম সংখ্যা সেট করুন। যেহেতু 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"
  4. নিম্নলিখিত কমান্ডের মাধ্যমে স্থানীয়ভাবে ল্যাম্বডা চালান:

     go run main.go
  5. 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
  6. হ্যাঁ, ওটাই. এখন থেকে, AWS ARN-এর যেকোন পরিষেবায় বা অন্যান্য স্থানে যেখানে এটি AWS সিক্রেটস ম্যানেজার থেকে প্রাপ্তির মাধ্যমে ইস্যু করা শংসাপত্র ব্যবহার করতে পারে।


AWS-এ 4 বছরেরও বেশি সময় ধরে এটি ব্যবহারের অভিজ্ঞতা

আমি প্রায় চার বছর ধরে উৎপাদনে ল্যাম্বডা ফাংশন ব্যবহার করছি। বছরের পর বছর ধরে, প্রাথমিক বাস্তবায়নের বিভিন্ন দিক পরিবর্তিত হয়েছে:

  1. পূর্বে, AWS Lambda উত্স হিসাবে যেকোন নন-ইসিআর রেজিস্ট্রিগুলির ব্যবহার নিষিদ্ধ করেছিল। এটি পরিবর্তিত হয়নি, তবে AWS GitHub, DockerHub এবং কয়েকটি অতিরিক্ত রেজিস্ট্রির জন্য ECR প্রক্সি যোগ করেছে। এই কার্যকারিতা ছাড়া, আমাদের ব্যক্তিগত ইসিআর-এ ল্যাম্বডা ইমেজগুলিকে ম্যানুয়ালি পুশ করতে হবে এবং টেরাফর্ম কোডে ইউআরএল প্রতিস্থাপন করতে হবে। এখন OpenTofu কোড এটি স্বয়ংক্রিয়ভাবে ECR প্রক্সির মাধ্যমে করে।

  2. শুরুতে, আমি http-01 বা tls-alpn-01 এর মতো বিভিন্ন চ্যালেঞ্জ প্রবর্তন করার কথা বিবেচনা করেছি, কিন্তু চার বছর ধরে কেউ আমাকে প্রশ্ন করেনি। এটি এখনও গিটহাব সমস্যাগুলিতে উপস্থিত রয়েছে এবং যদি এই ক্ষমতার প্রয়োজন হয় তবে আমরা এটি তৈরি করতে একসাথে কাজ করতে পারি।

  3. আমি বিশুদ্ধ EC2 দৃষ্টান্তে LetsEncrypt শংসাপত্রগুলি ব্যবহার করতে চাইনি যখন প্রকল্পটি মূলত শুরু হয়েছিল, কিন্তু আজকাল এটি আদর্শ অনুশীলন। যেমন আমি আগে বলেছি, নির্দিষ্ট পরিস্থিতিতে, AWS cli ব্যবহার করে পরিচালিত AWS সিক্রেটস থেকে একটি শংসাপত্র পুনরুদ্ধার করা যেতে পারে।

  4. আমি বছরের পর বছর ধরে অনেক নতুন গো কোড লিখেছি, তাই আমি বলতে পারি যে আমার সংগ্রহস্থলে আসল ল্যাম্বডা কোডটি যতটা অভিনব হতে পারে ততটা নয়। এটি এবং আমার সাম্প্রতিক Go প্রকল্প, tenv (OpenTofu, Terraform, Terragrunt, এবং Atmos সংস্করণ ম্যানেজার, Go-তে লেখা) এর মধ্যে একটি উল্লেখযোগ্য পার্থক্য রয়েছে, কিন্তু যে কোনও ক্ষেত্রে, কোডটি এখনও সাধারণভাবে সমর্থিত, তাই এটিতে পরিবর্তন করা জিতেছে খুব সমস্যাযুক্ত হবেন না। মাঝে মাঝে, কোডটিকে আরো মার্জিত করতে আমি উল্লেখযোগ্য রিফ্যাক্টরিং গ্রহণ করব।

  5. একই ল্যাম্বদা বছরের পর বছর ধরে বিভিন্ন প্রকল্পে ব্যবহার করা হচ্ছে। উপরন্তু, আমি DevOps প্ল্যাটফর্ম cloudexpress.app- এর সহ-প্রতিষ্ঠাতা, যেখানে আমাদের টিম অটোমেশন প্রক্রিয়াগুলিকে সহজ করার জন্য AWS LetsEncrypt Lambda ব্যবহার করে আমাদের সমস্ত ক্লায়েন্টদের জন্য TLS শংসাপত্রগুলি পরিচালনা করে।


এখন সংখ্যা সম্পর্কে কথা বলা যাক. 4 বছর ধরে, এই প্রকল্পটি অনেক লোককে সাহায্য করেছে এবং বহু ওপেনসোর্স এবং 30 টিরও বেশি বাণিজ্যিক প্রকল্পে ব্যবহৃত হয়েছে। Lambda 2000 টিরও বেশি শংসাপত্র জারি করে এবং এতে থামতে চায় না।

উপসংহার

AWS LetsEncrypt Lambda আপনার জন্য একটি উপযুক্ত সমাধান, যদি

  • আপনার অবশ্যই শংসাপত্রের একটি প্রকৃত সংস্করণ থাকতে হবে এবং এটি অ-AWS নেটিভ পরিষেবা যেমন EC2 Nginx থেকে ব্যবহার করবেন।
  • আপনি TLS শংসাপত্র প্রদান এবং পুনর্নবীকরণ প্রক্রিয়া (লগ চেক করুন, পুনর্নবীকরণের তারিখ নির্ধারণ করুন, ইত্যাদি) পরিচালনা করতে AWS শংসাপত্র ম্যানেজারের উপর নির্ভর করতে চান না।
  • আপনার শংসাপত্রের মেয়াদ শেষ হলে বা শীঘ্রই মেয়াদ শেষ হয়ে গেলে আপনি LetsEncrypt থেকে ইমেল বিজ্ঞপ্তি পেতে চান।
  • আপনি গোলং কোড পরিবর্তন করে সমাধানটি ব্যক্তিগতকৃত করতে চান (উদাহরণস্বরূপ, LetsEncrypt চ্যালেঞ্জ পরিবর্তন করা, Hashicorp ভল্টে শংসাপত্র সংরক্ষণ করা ইত্যাদি)।


আপনি যদি আবিষ্কার করেন যে এই পয়েন্টগুলির মধ্যে অন্তত একটি আপনার পরিস্থিতির জন্য প্রযোজ্য, আপনি AWS Lambda ব্যবহার করতে স্বাগত জানাই। এছাড়াও, আপনি যদি উন্নয়নে অংশগ্রহণ করতে চান, আমি সর্বদা নতুন সমস্যাগুলির জন্য উন্মুক্ত এবং GitHub এ অনুরোধগুলি টানছি। প্রকল্পের URL: https://github.com/kvendingoldo/aws-letsencrypt-lambda