paint-brush
AWS LetsEncrypt लैम्ब्डा या मैंने OpenTofu और Go का उपयोग करके AWS के लिए एक कस्टम TLS प्रदाता क्यों लिखाद्वारा@kvendingoldo
794 रीडिंग
794 रीडिंग

AWS LetsEncrypt लैम्ब्डा या मैंने OpenTofu और Go का उपयोग करके AWS के लिए एक कस्टम TLS प्रदाता क्यों लिखा

द्वारा Alexander Sharov15m2024/06/06
Read on Terminal Reader

बहुत लंबा; पढ़ने के लिए

AWS LetsEncrypt लैम्ब्डा एक Go 1.22 आधारित एप्लिकेशन है जो Let's Encrypt के माध्यम से AWS प्रमाणपत्र जारी करता है, नवीनीकृत करता है और प्रबंधित करता है। प्रमाणपत्र जारी होने के बाद, यह AWS प्रमाणपत्र प्रबंधक और AWS गुप्त प्रबंधक के अंदर प्रमाणपत्र संग्रहीत करता है। लैम्ब्डा पूरी तरह से अनुकूलन योग्य है, और इसे Terraform या OpenTofu के माध्यम से AWS में तैनात किया जा सकता है। इसे बिना किसी समस्या के स्थानीय रूप से भी निष्पादित किया जा सकता है।
featured image - AWS LetsEncrypt लैम्ब्डा या मैंने OpenTofu और Go का उपयोग करके AWS के लिए एक कस्टम TLS प्रदाता क्यों लिखा
Alexander Sharov HackerNoon profile picture
0-item
1-item

इन दिनों, ऐसे सिस्टम की कल्पना करना चुनौतीपूर्ण है जिनमें TLS प्रमाणपत्र सुरक्षा के बिना सार्वजनिक API एंडपॉइंट हों। प्रमाणपत्र जारी करने के कई तरीके हैं:


  • सशुल्क वाइल्डकार्ड प्रमाणपत्र जिन्हें किसी भी बड़े TLS प्रदाता से खरीदा जा सकता है
  • सशुल्क रूट प्रमाणपत्र जो कॉर्पोरेट पीकेआई सिस्टम द्वारा जारी किए गए सभी डाउनस्ट्रीम प्रमाणपत्रों पर हस्ताक्षर करते हैं
  • LetsEncrypt या AWS Certificate Manager जैसे TLS प्रदाताओं द्वारा जारी किए गए निःशुल्क प्रमाणपत्र
  • OpenSSL या किसी अन्य टूल द्वारा जारी किए गए स्व-हस्ताक्षरित प्रमाणपत्र


इस पोस्ट के संदर्भ में, मैं मुख्य रूप से उन निःशुल्क प्रमाणपत्रों पर चर्चा करूँगा जिनका उपयोग AWS के अंदर किया जा सकता है, लेकिन केवल AWS सेवाओं द्वारा नहीं। स्पष्ट रूप से, यदि आप विशेष रूप से प्रबंधित AWS सेवाओं का उपयोग करते हैं और आपकी सुरक्षा आवश्यकताएँ सख्त नहीं हैं, तो AWS प्रमाणपत्र प्रबंधक के अलावा किसी अन्य चीज़ का उपयोग करना कोई मायने नहीं रखता। AWS प्रमाणपत्र प्रबंधक DNS या HTTP चुनौतियों के माध्यम से प्रमाणपत्र जारी करने का एक बहुत ही सुविधाजनक और तेज़ तरीका प्रदान करता है; हालाँकि, यदि आपको AWS सेवाओं (API गेटवे, ALB, NLB, आदि) के बाहर इन प्रमाणपत्रों का उपयोग करने की आवश्यकता है, तो आपको बुनियादी AWS सीमाओं का सामना करना पड़ता है, जैसे कि Nginx चलाने वाला EC2 इंस्टेंस जिसे भौतिक प्रमाणपत्र फ़ाइल की आवश्यकता होती है। इसके अतिरिक्त, यदि आप इसका अनुरोध करते हैं, तो भी AWS प्रमाणपत्र प्रबंधक प्रमाणपत्र सामग्री प्रदर्शित नहीं करता है।


इस समय आपको LetsEncrypt के बारे में याद दिलाने का यह सही समय है, जो सर्टिफिकेट मैनेजर की तुलना में अधिक व्यापक रूप से उपयोग किया जाने वाला टूल है - कम से कम इसलिए क्योंकि यह क्लाउड पर निर्भर नहीं करता है। दुर्भाग्य से, AWS में कोई अंतर्निहित LetsEncrypt प्रमाणपत्र जारी करने की तकनीक उपलब्ध नहीं है। अपनी EC2 या ECS सेवाओं के लिए certbot टूल का उपयोग करना संभव है, लेकिन उस परिदृश्य में, आपको यह विचार करना होगा कि नवीनीकरण प्रक्रिया को कैसे कॉन्फ़िगर किया जाए। मैं अलग-अलग रणनीतियों को भी संयोजित नहीं करना चाहता क्योंकि मुझे लगता है कि हर चीज़ के लिए एक ही प्रक्रिया होना बेहतर है क्योंकि यह पूरे सिस्टम की जटिलता को कम करता है।


इसे ध्यान में रखते हुए, मैंने एक लैम्ब्डा फ़ंक्शन बनाया जो जटिल कॉन्फ़िगरेशन की आवश्यकता के बिना LetsEncrypt प्रमाणपत्रों को स्वचालित रूप से जारी और नवीनीकृत करता है। प्रारंभिक प्रमाणपत्र जारी होने के बाद AWS प्रमाणपत्र प्रबंधक प्रमाणपत्रों के साथ ARN का उपयोग करने वाली किसी भी AWS सेवा पर प्रमाणपत्र का उपयोग किया जा सकता है। इसके अतिरिक्त, आप एक भौतिक प्रमाणपत्र संस्करण का उपयोग कर सकते हैं जिसे AWS सीक्रेट्स मैनेजर में आपके द्वारा चुने गए किसी भी स्थान पर रखा जाता है, चाहे वह Nginx चलाने वाला EC2 इंस्टेंस हो या कोई अन्य स्थान।

AWS LetsEncrypt लैम्ब्डा कैसे काम करता है?

इस लेख में, मैं मान लूंगा कि आपका DNS ज़ोन AWS Route53 द्वारा प्रबंधित है।

इस लेख में वर्णित लैम्बडा फ़ंक्शन Go v1.22 पर लिखा गया है। DNS रिकॉर्ड, सीक्रेट या प्रमाणपत्र जैसे सभी परिणाम संसाधन Amazon IAM भूमिका द्वारा नियंत्रित होते हैं, जो डिफ़ॉल्ट रूप से टेराफ़ॉर्म कोड के माध्यम से बनाया जाता है। लैम्बडा क्रियाओं का क्रम निम्नलिखित है:


  1. प्रमाणपत्र सूची वाली एक घटना प्राप्त करें। आम तौर पर, यह घटना मैन्युअल निष्पादन, या aws_cloudwatch_event_target के माध्यम से किए गए क्रॉन द्वारा निष्पादन का परिणाम हो सकता है। घटना का उदाहरण:
 { "domainName": "hackernoon.referrs.me", "acmeUrl": "prod", "acmeEmail": "[email protected]", "reImportThreshold": 10, "issueType": "default", "storeCertInSecretsManager" : true }
  1. सत्यापित करें कि प्रमाणपत्र AWS प्रमाणपत्र प्रबंधक में मौजूद है या नहीं। यदि हाँ, तो समाप्ति तिथि की पुष्टि करें।
  2. यदि समाप्ति तिथि तक दिनों की संख्या reImportThreshold से कम है, तो LetsEncrypt DNS-01 चुनौती शुरू करें। इस चरण में लैम्ब्डा AWS Route53 ज़ोन से डोमेन नाम से मेल खाते हुए एक TXT रिकॉर्ड बनाता है और आपके प्रमाणपत्र के तैयार होने की प्रतीक्षा करता है।
  3. जब प्रमाणपत्र तैयार हो जाता है, तो लैम्ब्डा उसे AWS प्रमाणपत्र प्रबंधक में अद्यतन कर देता है।
  4. यदि storeCertInSecretsManager सत्य है, तो लैम्ब्डा प्रमाणपत्र फ़ाइलों को AWS सीक्रेट्स मैनेजर के अंदर संग्रहीत करेगा।


AWS LetsEncrypt लैम्ब्डा, अनुक्रम आरेख।

लैम्ब्डा कार्यान्वयन विवरण

कोड

लैम्बडा को गो 1.22 पर लिखा गया है। जितना संभव हो सके उतनी कम लाइब्रेरी का उपयोग करने से मुझे कोड को सूखा रखने के अपने लक्ष्य को बनाए रखने में मदद मिली। आवश्यक गो लाइब्रेरी की पूरी सूची:

यूआरएल

विवरण

github.com/aws/aws-lambda-go

लाइब्रेरी, नमूने और उपकरण जो गो डेवलपर्स को AWS लैम्ब्डा फ़ंक्शन विकसित करने में मदद करते हैं।

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

गो प्रोग्रामिंग भाषा के लिए AWS SDK.

github.com/go-acme/लेगो

LetsEncrypt / ACME क्लाइंट और लाइब्रेरी.

github.com/guregu/null

शून्य मानों का उचित प्रबंधन.

github.com/sirupsen/logrus

गो के लिए संरचित, प्लग करने योग्य लॉगिंग.


डॉकर छवि

मैंने gcr.io/distroless/static:nonroot को बेसिक डॉकर इमेज के रूप में इस्तेमाल किया। जिन Go एप्लीकेशन को libc की आवश्यकता नहीं होती, उनके लिए यह इमेज एकदम सही है। यह बिलकुल scratch नहीं है और इसमें निम्नलिखित शामिल हैं:


  • CA प्रमाणपत्र: इन्हें किसी अन्य मंच से कॉपी करने की आवश्यकता नहीं है।
  • /etc/passwd: इसमें नॉनरूट जैसे उपयोगकर्ता और समूह शामिल होते हैं।
  • /tmp फ़ोल्डर.
  • tzdata: यदि आप UTC के अलावा अन्य समय क्षेत्र निर्धारित करना चाहते हैं।


निर्माण प्रक्रिया

बड़े सॉफ़्टवेयर प्रोजेक्ट में, बिल्ड प्रक्रिया की देखरेख करना एक श्रमसाध्य और समय लेने वाला काम बन सकता है। मेकफाइल्स इस प्रक्रिया को स्वचालित और सुव्यवस्थित करने में मदद कर सकते हैं, यह सुनिश्चित करते हुए कि आपका प्रोजेक्ट कुशलतापूर्वक और लगातार बनाया गया है। इस कारण से, मैं अपने सभी Golang प्रोजेक्ट के लिए मेकफाइल का उपयोग करना पसंद करता हूँ। फ़ाइल सरल है:


 ##@ 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 ./...


सीआईसीडी की ओर से मैंने गो एप्लीकेशन के लिए विशिष्ट सेटअप का उपयोग किया

  1. GitHub क्रियाएँ निरंतर एकीकरण के रूप में।

  2. ghcr.io को docker रजिस्ट्री के रूप में उपयोग करें। DockerHub की तुलना में, यह दो प्रमुख विशेषताएं प्रदान करता है जो इसे उपयोग करने के लिए मेरी प्राथमिकता बनाती हैं:

    1. GitHub Actions के साथ GHCR के सहज एकीकरण की बदौलत बिल्ड, टेस्ट और डिप्लॉयमेंट वर्कफ़्लो को सीधे GitHub रिपॉजिटरी से अधिक आसानी से स्वचालित किया जा सकता है। इससे उत्पादकता बढ़ सकती है और विकास प्रक्रिया सरल हो सकती है।
    2. GHCR GitHub के अनुमति मॉडल का लाभ उठाता है, जिससे उपयोगकर्ता उन्हीं टीमों और अनुमतियों का उपयोग करके कंटेनर छवियों तक पहुँच प्रबंधित कर सकते हैं जिनका उपयोग वे अपने कोड रिपॉजिटरी के लिए करते हैं। यह उपयोगकर्ता प्रबंधन को सरल बनाता है और सुरक्षा को बढ़ाता है।
  3. kvendingoldo/semver-action : स्वचालित संस्करण के लिए मेरा GitHub Actions प्लगइन। यह एक GitHub क्रिया है जो रिपॉजिटरी कमिट के लिए SemVer संगत टैग उत्पन्न करती है। यह क्रिया संस्करणों का प्रबंधन कर सकती है, GitHub रिलीज़ उत्पन्न कर सकती है, और रिपॉजिटरी के अंदर रिलीज़ शाखाओं को नियंत्रित कर सकती है। यह सिंगल और मोनोरेपो दोनों के साथ शानदार ढंग से काम करता है।

  4. स्वचालित चेंजलॉग जनरेशन। मुझे चेंजलॉग पसंद है! मेरे द्वारा प्रबंधित अन्य ओपनसोर्स प्रोजेक्ट्स (जैसे, https://github.com/tofuutils/tenv , https://github.com/tofuutils/tofuenv , आदि) के संदर्भ में, मेरी टीम ने उपयोगकर्ताओं को परिवर्तनों के बारे में सूचित करने के महत्व को पहचाना।

  5. golangci-lint . मेरे दृष्टिकोण से, सभी कोड की समीक्षा एक स्थिर कोड विश्लेषक द्वारा की जानी चाहिए। सोनारक्यूब को सभी परियोजनाओं के लिए सेट नहीं किया जा सकता है, हालाँकि, मेरी राय में, golangci छोटे से मध्यम गो परियोजनाओं के लिए पर्याप्त है।

  6. कोडस्पेल.yml . कोड जाँच के अतिरिक्त, व्याकरण की पुष्टि करना भी अच्छा विचार है, खासकर यदि आपके पास बड़ी मात्रा में दस्तावेज हों।

टेराफॉर्म/ओपनटोफू के माध्यम से लैम्ब्डा को AWS पर कैसे तैनात करें

इस पृष्ठ में चर्चित कोड टेराफॉर्म और ओपनटोफू के लिए एक समान है, लेकिन टेराफॉर्म v1.6 से शुरू करके, हाशिकॉर्प ने टेराफॉर्म लाइसेंस को बिजनेस सोर्स लाइसेंस (बीएसएल) v1.1 में संशोधित किया है। यदि आप टेराफॉर्म के शीर्ष पर कुछ वाणिज्यिक विकसित कर रहे हैं, तो जितनी जल्दी हो सके ओपनटोफू पर स्विच करें।

यदि आपको OpenTofu या Terraform के एकाधिक संस्करणों को प्रबंधित करने की आवश्यकता है, तो इसका उपयोग करें टेनव - ओपनटोफू, टेराफॉर्म, टेराग्रंट और एटमोस संस्करण प्रबंधक, गो में लिखा गया।

अधिक टेराफॉर्म / ओपनटोफू उदाहरण 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 टोकन के बिना छवियों को खींचने की अनुमति नहीं देता है, यहां तक कि खुले सार्वजनिक रिपॉजिटरी से भी, इसलिए आपको पहले से निर्मित Docker छवियों तक पहुंच प्राप्त करने के लिए एक व्यक्तिगत GitHub टोकन प्राप्त करना होगा। वैकल्पिक रूप से, आप मेरी 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 version switcher 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 पर सेट करें। इस स्थिति में, जब लैम्ब्डा मूल निष्पादन पूरा कर लेता है, तो प्रमाणपत्र AWS Secrets Manager में सहेजा जाएगा। यह उपयोगकर्ताओं को अधिक लचीलापन देता है: वे प्रमाणपत्र की सामग्री का निरीक्षण कर सकते हैं, EC2 से सीधे इसके साथ काम कर सकते हैं, आदि। AWS Secrets Manager के बारे में अधिक जानने के लिए, आधिकारिक मार्गदर्शिका पढ़ें।

    जारी किए गए प्रमाणपत्र का उदाहरण, जो AWS सीक्रेट्स मैनेजर के अंदर संग्रहीत है।


पर्यावरण चर

नाम

विवरण

संभावित मान

डिफ़ॉल्ट मान

उदाहरण

आवश्यक

FORMATTER_TYPE

लॉग के लिए फ़ॉर्मेटर प्रकार

JSON | पाठ

मूलपाठ

जेएसओएन

MODE

एप्लिकेशन मोड। AWS निष्पादन के लिए cloud मोड और स्थानीय परीक्षण के लिए local मोड सेट करें।

बादल | स्थानीय

बादल

बादल

LOG_LEVEL

लॉगिंग स्तर

घबराहट|घातक|त्रुटि|चेतावनी|सूचना|डीबग|ट्रेस

चेतावनी देना

चेतावनी देना

AWS_REGION

डिफ़ॉल्ट AWS क्षेत्र। AWS पर तैनाती के बाद यह सेटिंग स्वचालित रूप से होती है।

<कोई भी वैध AWS क्षेत्र>

-

यूएस-ईस्ट-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 , तो लैम्ब्डा प्रमाणपत्र को प्रमाणपत्र प्रबंधक और सीक्रेट्स प्रबंधक दोनों में रखेगा।

“सत्य” | “झूठ”

"असत्य"

"असत्य"


LetsEncrypt लैम्ब्डा लॉग की जांच कैसे करें

aws-letsencrypt-lambda के साथ काम के दायरे में आप कभी-कभी लॉग की समीक्षा करना चाह सकते हैं। इसे पूरा करना काफी आसान है:

  1. AWS क्लाउडवॉच पर जाएं, “लॉग समूह” पर क्लिक करें
  2. OpenTofu कोड में आपके द्वारा निर्दिष्ट नाम के साथ लॉग समूह खोजें। उदाहरण के लिए, मेरे मामले में यह /aws/lambda/kvendingoldo-letsencrypt-lambda है
  3. समूह पर जाएं, सूची से वांछित स्ट्रीम का चयन करें, और लॉग की समीक्षा करें।


AWS UI के माध्यम से मैन्युअल रूप से लैम्ब्डा को कैसे ट्रिगर करें

  1. ओपनटोफू के माध्यम से बनाए गए लैम्ब्डा फ़ंक्शन पर जाएँ। “टेस्ट” बटन पर क्लिक करें।

    AWS LetsEncrypt लैम्ब्डा: 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. लैम्ब्डा के सफल निष्पादन के बाद, निम्नलिखित लॉग दिखाई देगा।

     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 ने लैम्बडा स्रोतों के रूप में किसी भी गैर-ECR रजिस्ट्री के उपयोग को प्रतिबंधित कर दिया था। इसमें कोई बदलाव नहीं हुआ है, हालाँकि AWS ने GitHub, DockerHub और कुछ अतिरिक्त रजिस्ट्री के लिए ECR प्रॉक्सी को जोड़ा है। इस कार्यक्षमता के बिना, हमें लैम्बडा छवियों को अपने व्यक्तिगत ECR में मैन्युअल रूप से पुश करना पड़ता था और टेराफ़ॉर्म कोड में छवि के URL को बदलना पड़ता था। अब OpenTofu कोड ECR प्रॉक्सी के माध्यम से इसे स्वचालित रूप से करता है।

  2. शुरुआत में, मैंने http-01 या tls-alpn-01 जैसी विभिन्न चुनौतियों को पेश करने पर विचार किया, लेकिन चार साल तक किसी ने मुझसे इसके बारे में सवाल नहीं किया। यह अभी भी GitHub मुद्दों पर मौजूद है , और अगर इस क्षमता की आवश्यकता है, तो हम इसे बनाने के लिए मिलकर काम कर सकते हैं।

  3. जब मैंने मूल रूप से प्रोजेक्ट शुरू किया था, तब मैं शुद्ध EC2 इंस्टेंस पर LetsEncrypt प्रमाणपत्रों का उपयोग नहीं करना चाहता था, लेकिन आजकल यह मानक अभ्यास है। जैसा कि मैंने पहले कहा था, कुछ स्थितियों में, AWS cli का उपयोग करके AWS Secrets Managed से प्रमाणपत्र प्राप्त किया जा सकता है।

  4. मैंने पिछले कुछ सालों में बहुत सारे नए गो कोड लिखे हैं, इसलिए मैं कह सकता हूँ कि मेरे रिपॉजिटरी में मूल लैम्ब्डा कोड उतना आकर्षक नहीं है जितना हो सकता था। इसमें और मेरे सबसे हाल के गो प्रोजेक्ट, टेनव (ओपनटोफू, टेराफॉर्म, टेराग्रंट और एटमोस वर्जन मैनेजर, जो गो में लिखा गया है) के बीच एक महत्वपूर्ण अंतर है, लेकिन किसी भी मामले में, कोड अभी भी आम तौर पर समर्थित है, इसलिए इसमें संशोधन करना बहुत समस्याग्रस्त नहीं होगा। कभी-कभी, मैं कोड को और अधिक सुरुचिपूर्ण बनाने के लिए महत्वपूर्ण रीफैक्टरिंग करूँगा।

  5. कई अलग-अलग परियोजनाओं में कई सालों से एक ही लैम्ब्डा का इस्तेमाल किया जा रहा है। इसके अलावा, मैं DevOps प्लेटफ़ॉर्म cloudexpress.app का सह-संस्थापक हूँ, जहाँ हमारी टीम स्वचालन प्रक्रियाओं को सरल बनाने के लिए AWS LetsEncrypt लैम्ब्डा का उपयोग करके हमारे सभी क्लाइंट के लिए TLS प्रमाणपत्र प्रबंधित करती है।


अब बात करते हैं संख्याओं की। 4 वर्षों की अवधि में, इस परियोजना ने कई लोगों की मदद की है और कई ओपनसोर्स और 30 से अधिक वाणिज्यिक परियोजनाओं में इसका उपयोग किया गया है। लैम्ब्डा 2000 से अधिक प्रमाणपत्र जारी करता है और उस पर रुकना नहीं चाहता।

निष्कर्ष

यदि आपके पास AWS LetsEncrypt Lambda है तो यह आपके लिए एक उपयुक्त समाधान है।

  • आपके पास प्रमाणपत्र का भौतिक संस्करण होना चाहिए और आप इसका उपयोग गैर-AWS मूल सेवाओं जैसे EC2 Nginx से करेंगे।
  • आप TLS प्रमाणपत्र जारी करने और नवीनीकरण प्रक्रिया (लॉग की जांच, नवीनीकरण तिथियां निर्धारित करना, आदि) के प्रबंधन के लिए AWS प्रमाणपत्र प्रबंधक पर निर्भर नहीं रहना चाहते।
  • आप चाहेंगे कि जब आपका प्रमाणपत्र समाप्त हो जाए, या जल्द ही समाप्त हो जाए, तो आपको LetsEncrypt से ईमेल सूचनाएं प्राप्त हों।
  • आप Golang कोड को बदलकर समाधान को निजीकृत करना चाहते हैं (उदाहरण के लिए, LetsEncrypt चुनौती को बदलना, Hashicorp Vault में प्रमाणपत्र संग्रहीत करना, आदि)।


यदि आपको पता चला है कि इनमें से कम से कम एक बिंदु आपकी स्थिति पर लागू होता है, तो आप AWS लैम्ब्डा का उपयोग करने के लिए स्वागत हैं। साथ ही, यदि आप विकास में भाग लेना चाहते हैं, तो मैं हमेशा GitHub पर नए मुद्दों और पुल अनुरोधों के लिए खुला हूँ। प्रोजेक्ट URL: https://github.com/kvendingoldo/aws-letsencrypt-lambda .