๊ฒ์๋ฌผ์์๋ SSL ์ธ์ฆ์ ๊ด๋ฆฌ๋ฅผ ์๋ํํ๋ ๋จ๊ณ๋ฅผ ์ค๋ช
ํฉ๋๋ค.
์ด ๊ธ์ 4๊ฐ์ ์น์ ์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค:
- zip ํ์ผ ์์ฑ;
- IAM ์ญํ ์์ฑ
- ์คํ๋๋ ๋๋ค ํจ์ ๋ง๋ค๊ธฐ acme-dns-route53;
- ํ๋ฃจ์ 2๋ฒ ํจ์๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ CloudWatch ํ์ด๋จธ๋ฅผ ์์ฑํฉ๋๋ค.
์ฐธ๊ณ : ์์ํ๊ธฐ ์ ์ ์ค์นํด์ผ ํฉ๋๋ค.
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
. ๊ทธ๋ค์ Linux OS ๋ฐ amd64 ์ํคํ
์ฒ์ ์ ํฉํ ๋ฐ์ด๋๋ฆฌ๋ฅผ ์์ฑํด์ผ ํ๋ค๋ ์ ์ Go ์ปดํ์ผ๋ฌ์ ๋ถ๋ช
ํ ์๋ฆฝ๋๋ค. ์ด๊ฒ์ด AWS์์ ์คํ๋๋ ๊ฒ์
๋๋ค.
AWS์์๋ ์ฐ๋ฆฌ ํ๋ก๊ทธ๋จ์ด zip ํ์ผ๋ก ๋ฐฐํฌ๋ ๊ฒ์ผ๋ก ์์ํ๋ฏ๋ก ๋ค์์ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค. acme-dns-route53.zip
์๋ก ์ค์น๋ ๋ฐ์ด๋๋ฆฌ๊ฐ ํฌํจ๋ ์์นด์ด๋ธ:
$ zip -j ~/acme-dns-route53.zip $GOPATH/bin/acme-dns-route53
์ฐธ๊ณ : ๋ฐ์ด๋๋ฆฌ๋ zip ์์นด์ด๋ธ์ ๋ฃจํธ์ ์์ด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด ์ฐ๋ฆฌ๋ -j
๊น๋ฐ.
์ด์ zip ๋๋ค์์ ๋ฐฐํฌํ ์ค๋น๊ฐ ๋์์ต๋๋ค. ๋จ์ ๊ฒ์ ํ์ํ ๊ถํ์ด ์๋ ์ญํ ์ ๋ง๋๋ ๊ฒ๋ฟ์ ๋๋ค.
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(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
์ฐธ๊ณ : ๋ค๋ฅธ ์ ์ฑ
์ด ํฌํจ๋ ๋ชฉ๋ก์ ์ฐพ์ ์ ์์ต๋๋ค.
์คํ๋๋ ๋๋ค ํจ์ ๋ง๋ค๊ธฐ acme-dns-route53
๋ง์ธ! ์ด์ ๋ค์ ๋ช
๋ น์ ์ฌ์ฉํ์ฌ ํจ์๋ฅผ AWS์ ๋ฐฐํฌํ ์ ์์ต๋๋ค. aws lambda create-function
. ๋๋ค๋ ๋ค์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค.
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"
}
ํ๋ฃจ์ 2๋ฒ ํจ์๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ CloudWatch ํ์ด๋จธ ์์ฑ
๋ง์ง๋ง ๋จ๊ณ๋ ํ๋ฃจ์ ๋ ๋ฒ ํจ์๋ฅผ ํธ์ถํ๋ cron์ ์ค์ ํ๋ ๊ฒ์ ๋๋ค.
- ๊ฐ์ ์ฌ์ฉํ์ฌ CloudWatch ๊ท์น์ ์์ฑํฉ๋๋ค.
schedule_expression
. - ๋๋ค ํจ์์ ARN์ ์ง์ ํ์ฌ ๊ท์น ๋์(์คํํด์ผ ํ๋ ํญ๋ชฉ)์ ์์ฑํฉ๋๋ค.
- ๋๋ค ํจ์๋ฅผ ํธ์ถํ ์ ์๋ ๊ถํ์ ๊ท์น์ ๋ถ์ฌํฉ๋๋ค.
์๋์๋ Terraform ๊ตฌ์ฑ์ ์ฐ๊ฒฐํ์ง๋ง ์ค์ ๋ก๋ 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 ์ธ์ฆ์๋ฅผ ์๋์ผ๋ก ์์ฑํ๊ณ ์ ๋ฐ์ดํธํ๋๋ก ๊ตฌ์ฑ๋์์ต๋๋ค.
์ถ์ฒ : habr.com