DNS-01 ఛాలెంజ్ మరియు AWSని ఉపయోగించి లెట్స్ ఎన్‌క్రిప్ట్ SSL సర్టిఫికేట్ మేనేజ్‌మెంట్ యొక్క ఆటోమేషన్

SSL సర్టిఫికెట్ల నిర్వహణను ఆటోమేట్ చేసే దశలను పోస్ట్ వివరిస్తుంది CA ని ఎన్‌క్రిప్ట్ చేద్దాం ఉపయోగించి DNS-01 సవాలు и AWS.

acme-dns-route53 అనేది ఈ లక్షణాన్ని అమలు చేయడానికి మమ్మల్ని అనుమతించే సాధనం. ఇది లెట్స్ ఎన్‌క్రిప్ట్ నుండి SSL సర్టిఫికేట్‌లతో పని చేయవచ్చు, వాటిని Amazon సర్టిఫికేట్ మేనేజర్‌లో సేవ్ చేయవచ్చు, DNS-53 ఛాలెంజ్‌ను అమలు చేయడానికి Route01 APIని ఉపయోగించవచ్చు మరియు చివరకు, SNSకి నోటిఫికేషన్‌లను పుష్ చేయవచ్చు. IN acme-dns-route53 AWS లాంబ్డా లోపల ఉపయోగం కోసం అంతర్నిర్మిత కార్యాచరణ కూడా ఉంది మరియు ఇది మనకు అవసరం.

ఈ వ్యాసం 4 విభాగాలుగా విభజించబడింది:

  • జిప్ ఫైల్‌ను సృష్టించడం;
  • IAM పాత్రను సృష్టించడం;
  • అమలు చేసే లాంబ్డా ఫంక్షన్‌ను సృష్టించడం acme-dns-route53;
  • CloudWatch టైమర్‌ని సృష్టించడం, అది ఒక ఫంక్షన్‌ని 2 సార్లు ఒక రోజుకి ట్రిగ్గర్ చేస్తుంది;

గమనిక: మీరు ప్రారంభించడానికి ముందు మీరు ఇన్స్టాల్ చేయాలి గోలాంగ్ 1.9+ и AWS CLI

జిప్ ఫైల్‌ను సృష్టిస్తోంది

acme-dns-route53 గోలాంగ్‌లో వ్రాయబడింది మరియు 1.9 కంటే తక్కువ వెర్షన్‌కు మద్దతు ఇస్తుంది.

మనం బైనరీతో జిప్ ఫైల్‌ని సృష్టించాలి acme-dns-route53 లోపల. దీన్ని చేయడానికి మీరు ఇన్స్టాల్ చేయాలి acme-dns-route53 ఆదేశాన్ని ఉపయోగించి GitHub రిపోజిటరీ నుండి go install:

$ env GOOS=linux GOARCH=amd64 go install github.com/begmaroman/acme-dns-route53

బైనరీ ఇన్‌స్టాల్ చేయబడింది $GOPATH/bin డైరెక్టరీ. ఇన్‌స్టాలేషన్ సమయంలో మేము రెండు మారిన పరిసరాలను పేర్కొన్నామని దయచేసి గమనించండి: GOOS=linux и GOARCH=amd64. Linux OS మరియు amd64 ఆర్కిటెక్చర్‌కు అనువైన బైనరీని సృష్టించాల్సిన అవసరం ఉందని వారు గో కంపైలర్‌కి స్పష్టం చేశారు - ఇది AWSలో నడుస్తుంది.
AWS మా ప్రోగ్రామ్ జిప్ ఫైల్‌లో అమలు చేయబడుతుందని ఆశిస్తోంది, కాబట్టి మనం సృష్టిద్దాం acme-dns-route53.zip ఆర్కైవ్‌లో కొత్తగా ఇన్‌స్టాల్ చేయబడిన బైనరీ ఉంటుంది:

$ zip -j ~/acme-dns-route53.zip $GOPATH/bin/acme-dns-route53

గమనిక: బైనరీ జిప్ ఆర్కైవ్ యొక్క రూట్‌లో ఉండాలి. దీని కోసం మేము ఉపయోగిస్తాము -j జెండా.

ఇప్పుడు మా జిప్ మారుపేరు విస్తరణకు సిద్ధంగా ఉంది, అవసరమైన హక్కులతో పాత్రను సృష్టించడం మాత్రమే మిగిలి ఉంది.

IAM పాత్రను సృష్టిస్తోంది

దాని అమలు సమయంలో మా లాంబ్డాకి అవసరమైన హక్కులతో మేము IAM పాత్రను సెటప్ చేయాలి.
ఈ విధానాన్ని అంటాం lambda-acme-dns-route53-executor మరియు వెంటనే ఆమెకు ప్రాథమిక పాత్ర ఇవ్వండి AWSLambdaBasicExecutionRole. ఇది AWS CloudWatch సేవకు లాగ్‌లను అమలు చేయడానికి మరియు వ్రాయడానికి మా లాంబ్డాని అనుమతిస్తుంది.
ముందుగా, మేము మా హక్కులను వివరించే JSON ఫైల్‌ని సృష్టిస్తాము. ఇది తప్పనిసరిగా లాంబ్డా సేవలను పాత్రను ఉపయోగించడానికి అనుమతిస్తుంది lambda-acme-dns-route53-executor:

$ touch ~/lambda-acme-dns-route53-executor-policy.json

మా ఫైల్ యొక్క కంటెంట్‌లు క్రింది విధంగా ఉన్నాయి:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup"
            ],
            "Resource": "arn:aws:logs:<AWS_REGION>:<AWS_ACCOUNT_ID>:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:PutLogEvents",
                "logs:CreateLogStream"
            ],
            "Resource": "arn:aws:logs:<AWS_REGION>:<AWS_ACCOUNT_ID>:log-group:/aws/lambda/acme-dns-route53:*"
        },
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "route53:ListHostedZones",
                "cloudwatch:PutMetricData",
                "acm:ImportCertificate",
                "acm:ListCertificates"
            ],
            "Resource": "*"
        },
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "sns:Publish",
                "route53:GetChange",
                "route53:ChangeResourceRecordSets",
                "acm:ImportCertificate",
                "acm:DescribeCertificate"
            ],
            "Resource": [
                "arn:aws:sns:${var.region}:<AWS_ACCOUNT_ID>:<TOPIC_NAME>",
                "arn:aws:route53:::hostedzone/*",
                "arn:aws:route53:::change/*",
                "arn:aws:acm:<AWS_REGION>:<AWS_ACCOUNT_ID>:certificate/*"
            ]
        }
    ]
}

ఇప్పుడు ఆదేశాన్ని అమలు చేద్దాం aws iam create-role పాత్రను సృష్టించడానికి:

$ aws iam create-role --role-name lambda-acme-dns-route53-executor 
 --assume-role-policy-document ~/lambda-acme-dns-route53-executor-policy.json

గమనిక: విధానాన్ని గుర్తుంచుకోండి ARN (అమెజాన్ రిసోర్స్ పేరు) - మాకు తదుపరి దశల్లో ఇది అవసరం.

పాత్ర lambda-acme-dns-route53-executor సృష్టించబడింది, ఇప్పుడు మనం దాని కోసం అనుమతులను పేర్కొనాలి. దీన్ని చేయడానికి సులభమైన మార్గం ఆదేశాన్ని ఉపయోగించడం aws iam attach-role-policy, ఉత్తీర్ణత విధానం ARN AWSLambdaBasicExecutionRole క్రింది విధంగా:

$ aws iam attach-role-policy --role-name lambda-acme-dns-route53-executor 
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

గమనిక: ఇతర విధానాలతో జాబితాను కనుగొనవచ్చు ఇక్కడ.

అమలు చేసే లాంబ్డా ఫంక్షన్‌ను సృష్టిస్తోంది acme-dns-route53

హుర్రే! ఇప్పుడు మీరు ఆదేశాన్ని ఉపయోగించి AWSకి మా ఫంక్షన్‌ని అమలు చేయవచ్చు aws lambda create-function. లాంబ్డా తప్పనిసరిగా కింది ఎన్విరాన్మెంట్ వేరియబుల్స్ ఉపయోగించి కాన్ఫిగర్ చేయబడాలి:

  • AWS_LAMBDA - స్పష్టం చేస్తుంది acme-dns-route53 AWS లాంబ్డా లోపల అమలు జరుగుతుంది.
  • DOMAINS — కామాలతో వేరు చేయబడిన డొమైన్‌ల జాబితా.
  • LETSENCRYPT_EMAIL - కలిగి ఉంటుంది ఇమెయిల్‌ను ఎన్‌క్రిప్ట్ చేద్దాం.
  • NOTIFICATION_TOPIC — SNS నోటిఫికేషన్ అంశం పేరు (ఐచ్ఛికం).
  • STAGING - విలువ వద్ద 1 స్టేజింగ్ వాతావరణం ఉపయోగించబడుతుంది.
  • 1024 MB - మెమరీ పరిమితి, మార్చవచ్చు.
  • 900 సెకన్లు (15 నిమి) — గడువు ముగిసింది.
  • acme-dns-route53 - ఆర్కైవ్‌లో ఉన్న మా బైనరీ పేరు.
  • fileb://~/acme-dns-route53.zip - మేము సృష్టించిన ఆర్కైవ్‌కు మార్గం.

ఇప్పుడు అమలు చేద్దాం:

$ aws lambda create-function 
 --function-name acme-dns-route53 
 --runtime go1.x 
 --role arn:aws:iam::<AWS_ACCOUNT_ID>:role/lambda-acme-dns-route53-executor 
 --environment Variables="{AWS_LAMBDA=1,DOMAINS="example1.com,example2.com",[email protected],STAGING=0,NOTIFICATION_TOPIC=acme-dns-route53-obtained}" 
 --memory-size 1024 
 --timeout 900 
 --handler acme-dns-route53 
 --zip-file fileb://~/acme-dns-route53.zip

 {
     "FunctionName": "acme-dns-route53", 
     "LastModified": "2019-05-03T19:07:09.325+0000", 
     "RevisionId": "e3fadec9-2180-4bff-bb9a-999b1b71a558", 
     "MemorySize": 1024, 
     "Environment": {
         "Variables": {
            "DOMAINS": "example1.com,example2.com", 
            "STAGING": "1", 
            "LETSENCRYPT_EMAIL": "[email protected]", 
            "NOTIFICATION_TOPIC": "acme-dns-route53-obtained", 
            "AWS_LAMBDA": "1"
         }
     }, 
     "Version": "$LATEST", 
     "Role": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/lambda-acme-dns-route53-executor", 
     "Timeout": 900, 
     "Runtime": "go1.x", 
     "TracingConfig": {
         "Mode": "PassThrough"
     }, 
     "CodeSha256": "+2KgE5mh5LGaOsni36pdmPP9O35wgZ6TbddspyaIXXw=", 
     "Description": "", 
     "CodeSize": 8456317,
"FunctionArn": "arn:aws:lambda:us-east-1:<AWS_ACCOUNT_ID>:function:acme-dns-route53", 
     "Handler": "acme-dns-route53"
 }

CloudWatch టైమర్‌ను సృష్టిస్తోంది, ఇది రోజుకు 2 సార్లు ఫంక్షన్‌ని ట్రిగ్గర్ చేస్తుంది

చివరి దశ క్రాన్‌ని సెటప్ చేయడం, ఇది మా ఫంక్షన్‌కి రోజుకు రెండుసార్లు కాల్ చేస్తుంది:

  • విలువతో CloudWatch నియమాన్ని సృష్టించండి schedule_expression.
  • లాంబ్డా ఫంక్షన్ యొక్క ARNని పేర్కొనడం ద్వారా నియమ లక్ష్యాన్ని (ఏది అమలు చేయాలి) సృష్టించండి.
  • లాంబ్డా ఫంక్షన్‌ని కాల్ చేయడానికి నియమానికి అనుమతి ఇవ్వండి.

క్రింద నేను నా టెర్రాఫార్మ్ కాన్ఫిగరేషన్‌ను జోడించాను, అయితే వాస్తవానికి ఇది AWS కన్సోల్ లేదా AWS CLIని ఉపయోగించి చాలా సరళంగా చేయబడుతుంది.

# Cloudwatch event rule that runs acme-dns-route53 lambda every 12 hours
resource "aws_cloudwatch_event_rule" "acme_dns_route53_sheduler" {
  name                = "acme-dns-route53-issuer-scheduler"
  schedule_expression = "cron(0 */12 * * ? *)"
}

# Specify the lambda function to run
resource "aws_cloudwatch_event_target" "acme_dns_route53_sheduler_target" {
  rule = "${aws_cloudwatch_event_rule.acme_dns_route53_sheduler.name}"
  arn  = "${aws_lambda_function.acme_dns_route53.arn}"
}

# Give CloudWatch permission to invoke the function
resource "aws_lambda_permission" "permission" {
  action        = "lambda:InvokeFunction"
  function_name = "${aws_lambda_function.acme_dns_route53.function_name}"
  principal     = "events.amazonaws.com"
  source_arn    = "${aws_cloudwatch_event_rule.acme_dns_route53_sheduler.arn}"
}

ఇప్పుడు మీరు SSL ప్రమాణపత్రాలను స్వయంచాలకంగా సృష్టించడానికి మరియు నవీకరించడానికి కాన్ఫిగర్ చేయబడ్డారు

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి