αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž€αž˜αŸ’αž˜αž“αŸƒαž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžš SSL Let's Encrypt αžŠαŸ„αž™αž”αŸ’αžšαžΎ DNS-01 challenge αž“αž·αž„ AWS

αž”αŸ’αžšαž€αžΆαžŸαž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž‡αŸ†αž αžΆαž“αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαž±αŸ’αž™αž€αžΆαžšαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžš SSL αžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž· αžαŸ„αŸ‡ αž’αŸŠαž·αž“αž‚αŸ’αžšαžΈαž” CA αžŠαŸ„αž™αž”αŸ’αžšαžΎ αž”αž‰αŸ’αž αžΆαž”αŸ’αžšαžˆαž˜ DNS-01 ΠΈ AWS.

acme-dns-route53 αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαžŠαŸ‚αž›αž“αžΉαž„αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž™αžΎαž„αž’αž“αž»αžœαžαŸ’αžαž˜αž»αžαž„αžΆαžšαž“αŸαŸ‡αŸ” αžœαžΆαž’αžΆαž…αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžš SSL αž–αžΈ Let's Encrypt αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž–αž½αž€αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžœαž·αž‰αŸ’αž‰αžΆαž”αž“αž”αžαŸ’αžš Amazon αž”αŸ’αžšαžΎ Route53 API αžŠαžΎαž˜αŸ’αž”αžΈαž’αž“αž»αžœαžαŸ’αžαž”αž‰αŸ’αž αžΆαž”αŸ’αžšαžˆαž˜ DNS-01 αž αžΎαž™αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž‡αŸ†αžšαž»αž‰αž€αžΆαžšαž‡αžΌαž“αžŠαŸ†αžŽαžΉαž„αž‘αŸ… SNS αŸ” IN acme-dns-route53 αžœαžΆαž€αŸαž˜αžΆαž“αž˜αž»αžαž„αžΆαžšαž—αŸ’αž‡αžΆαž”αŸ‹αž˜αž€αž‡αžΆαž˜αž½αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„ AWS Lambda αž αžΎαž™αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαŸ”

αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž…αŸ‚αž€αž…αŸαž‰αž‡αžΆ ៀ αž•αŸ’αž“αŸ‚αž€αŸ–

  • αž”αž„αŸ’αž€αžΎαžαž―αž€αžŸαžΆαžš zip;
  • αž”αž„αŸ’αž€αžΎαžαžαž½αž“αžΆαž‘αžΈ IAM;
  • αž”αž„αŸ’αž€αžΎαžαž˜αž»αžαž„αžΆαžš lambda αžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš acme-dns-route53;
  • αž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αŸ†αžŽαžαŸ‹αž˜αŸ‰αŸ„αž„ CloudWatch αžŠαŸ‚αž›αž”αž„αŸ’αž€αž±αŸ’αž™αž˜αžΆαž“αž˜αž»αžαž„αžΆαžš 2 αžŠαž„αž€αŸ’αž“αž»αž„αž˜αž½αž™αžαŸ’αž„αŸƒαŸ”

αž…αŸ†αžŽαžΆαŸ†: αž˜αž»αž“αž–αŸαž›αž’αŸ’αž“αž€αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαžŠαŸ†αž‘αžΎαž„ GoLang 1.9+ ΠΈ αž’αŸαžŸαž’αŸαžŸαžŸαŸŠαžΈαž’αžΆαž™

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž―αž€αžŸαžΆαžš zip

acme-dns-route53 αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž‡αžΆ GoLang αž“αž·αž„αž‚αžΆαŸ†αž‘αŸ’αžšαž€αŸ†αžŽαŸ‚αž˜αž·αž“αž‘αžΆαž”αž‡αžΆαž„ 1.9 αž‘αŸαŸ”

αž™αžΎαž„αžαŸ’αžšαžΌαžœαž”αž„αŸ’αž€αžΎαžαž―αž€αžŸαžΆαžš zip αž‡αžΆαž˜αž½αž™αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‚αŸ„αž›αž–αžΈαžš 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. αž–αž½αž€αž‚αŸαž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž…αŸ’αž”αžΆαžŸαŸ‹αž…αŸ†αž–αŸ„αŸ‡αž’αŸ’αž“αž€αž…αž„αž€αŸ’αžšαž„ Go αžαžΆαžœαžΆαžαŸ’αžšαžΌαžœαž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‚αŸ„αž›αž–αžΈαžšαžŠαŸ‚αž›αžŸαž˜αžšαž˜αŸ’αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Linux OS αž“αž·αž„αžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜ amd64 - αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αžΎ AWS αŸ”
AWS αžšαŸ†αž–αžΉαž„αžαžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž™αžΎαž„αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš zip αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžŸαžΌαž˜αž”αž„αŸ’αž€αžΎαž acme-dns-route53.zip αž”αžŽαŸ’αžŽαžŸαžΆαžšαžŠαŸ‚αž›αž“αžΉαž„αž˜αžΆαž“αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‚αŸ„αž›αž–αžΈαžšαžŠαŸ‚αž›αž”αžΆαž“αžŠαŸ†αž‘αžΎαž„αžαŸ’αž˜αžΈαŸ–

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

αž…αŸ†αžŽαžΆαŸ†: αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‚αŸ„αž›αž–αžΈαžšαž‚αž½αžšαžαŸ‚αžŸαŸ’αžαž·αžαž“αŸ…αž€αŸ’αž“αž»αž„αž«αžŸαž“αŸƒαž”αŸαžŽαŸ’αžŽαžŸαžΆαžšαž αŸ’αžŸαŸŠαžΈαž”αŸ” αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžšαžΏαž„αž“αŸαŸ‡αž™αžΎαž„αž”αŸ’αžšαžΎ -j αž‘αž„αŸ‹αž‡αžΆαžαž·αŸ”

αž₯αž‘αžΌαžœαž“αŸαŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αž αŸ…αž€αŸ’αžšαŸ… zip αžšαž”αžŸαŸ‹αž™αžΎαž„αž‚αžΊαžšαž½αž…αžšαžΆαž›αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™ αž αžΎαž™αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž“αŸ…αžŸαŸαžŸαžŸαž›αŸ‹αž‚αžΊαžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαžαž½αž“αžΆαž‘αžΈαž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŸαž·αž‘αŸ’αž’αž·αž…αžΆαŸ†αž”αžΆαž…αŸ‹αŸ”

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžαž½αž“αžΆαž‘αžΈ IAM

αž™αžΎαž„αžαŸ’αžšαžΌαžœαžšαŸ€αž”αž…αŸ†αžαž½αž“αžΆαž‘αžΈ IAM αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŸαž·αž‘αŸ’αž’αž·αžŠαŸ‚αž›αž‘αžΆαž˜αž‘αžΆαžšαžŠαŸ„αž™ lambda αžšαž”αžŸαŸ‹αž™αžΎαž„αž€αŸ†αž‘αž»αž„αž–αŸαž›αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αžšαž”αžŸαŸ‹αžœαžΆαŸ”
αžαŸ„αŸ‡αž αŸ…αž‚αŸ„αž›αž€αžΆαžšαžŽαŸαž“αŸαŸ‡αŸ” lambda-acme-dns-route53-executor αž αžΎαž™αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž“αžΆαž„αž“αžΌαžœαžαž½αž“αžΆαž‘αžΈαž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž—αŸ’αž›αžΆαž˜αŸ— AWSLambdaBasicExecutionRole. αžœαžΆαž“αžΉαž„αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™ lambda αžšαž”αžŸαŸ‹αž™αžΎαž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž“αž·αž„αžŸαžšαžŸαŸαžšαž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αž‘αŸ…αž€αžΆαž“αŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ AWS CloudWatch αŸ”
αžŠαŸ†αž”αžΌαž„ αž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαž―αž€αžŸαžΆαžš JSON αžŠαŸ‚αž›αž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαžŸαž·αž‘αŸ’αž’αž·αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ” αž“αŸαŸ‡αž“αžΉαž„αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ lambda αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαž½αž“αžΆαž‘αžΈαž™αŸ‰αžΆαž„αžŸαŸ†αžαžΆαž“αŸ‹ 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 (αžˆαŸ’αž˜αŸ„αŸ‡αž’αž“αž’αžΆαž“ Amazon) - αž™αžΎαž„αž“αžΉαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαžœαžΆαž“αŸ…αž‡αŸ†αž αžΆαž“αž”αž“αŸ’αž‘αžΆαž”αŸ‹αŸ”

αžαž½αž“αžΆαž‘αžΈαžšαž”αžŸαŸ‹ 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

αž…αŸ†αžŽαžΆαŸ†: αž”αž‰αŸ’αž‡αžΈαžŠαŸ‚αž›αž˜αžΆαž“αž‚αŸ„αž›αž€αžΆαžšαžŽαŸαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž’αžΆαž…αžšαž€αž”αžΆαž“ αž“αŸ…αž‘αžΈαž“αŸαŸ‡.

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž˜αž»αžαž„αžΆαžš lambda αžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš acme-dns-route53

αž αŸŠαžΊαž™! αž₯αž‘αžΌαžœαž“αŸαŸ‡αž’αŸ’αž“αž€αž’αžΆαž…αžŠαžΆαž€αŸ‹αž˜αž»αžαž„αžΆαžšαžšαž”αžŸαŸ‹αž™αžΎαž„αž‘αŸ… AWS αžŠαŸ„αž™αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ aws lambda create-function. lambda αžαŸ’αžšαžΌαžœαžαŸ‚αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ„αž™αž”αŸ’αžšαžΎαž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

  • AWS_LAMBDA - αž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαž…αŸ’αž”αžΆαžŸαŸ‹ acme-dns-route53 αž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž“αŸ„αŸ‡αž€αžΎαžαž‘αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„ AWS Lambda αŸ”
  • 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 αžŠαž„αž€αŸ’αž“αž»αž„αž˜αž½αž™αžαŸ’αž„αŸƒ

αž‡αŸ†αž αžΆαž“αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž‚αžΊαžαŸ’αžšαžΌαžœαžŠαŸ†αž‘αžΎαž„ cron αžŠαŸ‚αž›αž αŸ…αž˜αž»αžαž„αžΆαžšαžšαž”αžŸαŸ‹αž™αžΎαž„αž–αžΈαžšαžŠαž„αž€αŸ’αž“αž»αž„αž˜αž½αž™αžαŸ’αž„αŸƒαŸ–

  • αž”αž„αŸ’αž€αžΎαžαž…αŸ’αž”αžΆαž”αŸ‹ CloudWatch αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžαž˜αŸ’αž›αŸƒ schedule_expression.
  • αž”αž„αŸ’αž€αžΎαžβ€‹αž‚αŸ„αž›β€‹αžŠαŸ…β€‹αž…αŸ’αž”αžΆαž”αŸ‹ (αž’αŸ’αžœαžΈβ€‹αžŠαŸ‚αž›β€‹αž‚αž½αžšβ€‹αžαŸ’αžšαžΌαžœβ€‹αž”αžΆαž“β€‹αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·) αžŠαŸ„αž™β€‹αž”αž‰αŸ’αž‡αžΆαž€αŸ‹ ARN αž“αŸƒβ€‹αž˜αž»αžαž„αžΆαžš lambda αŸ”
  • αž•αŸ’αžαž›αŸ‹αž€αžΆαžšαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž…αŸ’αž”αžΆαž”αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž αŸ…αž˜αž»αžαž„αžΆαžš lambda αŸ”

αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž—αŸ’αž‡αžΆαž”αŸ‹ Terraform config αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαžΆαž˜αž–αž·αžαžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαž™αŸ‰αžΆαž„αžŸαžΆαž˜αž‰αŸ’αž‰αžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αž»αž„αžŸαžΌαž› 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

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹