Posting ini menjelaskan langkah-langkah untuk mengotomatisasi pengelolaan sertifikat SSL dari Let's Encrypt CA menggunakan tantangan DNS-01 dan AWS .
acme-dns-route53 adalah alat yang memungkinkan kita untuk mengimplementasikan fitur ini. Dia tahu cara bekerja dengan sertifikat SSL dari Let's Encrypt, simpan di Amazon Certificate Manager, gunakan Route53 API untuk mengimplementasikan tantangan DNS-01, dan, pada akhirnya, dorong notifikasi ke SNS. Acme-dns-route53 juga memiliki fungsionalitas bawaan untuk digunakan di dalam AWS Lambda, dan inilah yang kami butuhkan.
Artikel ini dibagi menjadi 4 bagian:
- buat file zip;
- menciptakan peran IAM;
- membuat fungsi lambda yang menjalankan acme-dns-route53 ;
- membuat pengatur waktu CloudWatch yang memicu fungsi 2 kali sehari;
Catatan: Sebelum Anda mulai, Anda harus menginstal GoLang 1.9+ dan AWS CLI
Buat file zip
acme-dns-route53 ditulis dalam GoLang dan mendukung versi tidak kurang dari 1.9.
Kita perlu membuat file zip dengan acme-dns-route53
di dalamnya. Untuk melakukan ini, instal acme-dns-route53
dari repositori GitHub menggunakan perintah go install
:
$ env GOOS=linux GOARCH=amd64 go install github.com/begmaroman/acme-dns-route53
Biner diinstal di $GOPATH/bin
. Harap dicatat bahwa selama instalasi kami menetapkan dua variabel lingkungan: GOOS=linux
dan GOARCH=amd64
. Mereka menjelaskan kepada kompiler Go tentang perlunya membuat biner yang cocok untuk Linux OS dan arsitektur amd64 - inilah yang berjalan di AWS.
AWS mengasumsikan menyebarkan program kami dalam file zip, jadi mari kita buat arsip acme-dns-route53.zip
yang akan berisi biner yang baru diinstal:
$ zip -j ~/acme-dns-route53.zip $GOPATH/bin/acme-dns-route53
Catatan: biner harus berada di akar arsip zip. Untuk ini kami menggunakan flag -j
.
Sekarang nama panggilan zip kami siap untuk ditempatkan, tetap hanya untuk membuat peran dengan hak yang diperlukan.
Buat Peran IAM
Kita perlu menegaskan peran IAM dengan hak istimewa yang dibutuhkan lambda selama eksekusi.
Sebut kebijakan ini lambda-acme-dns-route53-executor
dan segera berikan peran dasar AWSLambdaBasicExecutionRole
. Ini akan memungkinkan lambda kami untuk memulai dan menulis log ke layanan AWS CloudWatch.
Pertama, buat file JSON yang menjelaskan hak-hak kami. Ini pada dasarnya akan memungkinkan layanan lambda untuk menggunakan peran lambda-acme-dns-route53-executor
:
$ touch ~/lambda-acme-dns-route53-executor-policy.json
Isi file kami adalah sebagai berikut:
{ "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:<AWS_REGION>:<AWS_ACCOUNT_ID>:<TOPIC_NAME>", "arn:aws:route53:::hostedzone/*", "arn:aws:route53:::change/*", "arn:aws:acm:<AWS_REGION>:<AWS_ACCOUNT_ID>:certificate/*" ] } ] }
Sekarang jalankan perintah aws iam create-role
untuk membuat peran:
$ aws iam create-role --role-name lambda-acme-dns-route53-executor \ --assume-role-policy-document ~/lambda-acme-dns-route53-executor-policy.json
Catatan: ingat kebijakan ARN (Nama Sumber Daya Amazon) - kita akan membutuhkannya di langkah berikutnya.
Peran lambda-acme-dns-route53-executor
telah dibuat, sekarang kita perlu menentukan izin untuk itu. Cara termudah untuk melakukan ini adalah dengan menggunakan perintah aws iam attach-role-policy
, melalui AWSLambdaBasicExecutionRole
ARN AWSLambdaBasicExecutionRole
sebagai berikut:
$ aws iam attach-role-policy --role-name lambda-acme-dns-route53-executor \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
Catatan: daftar dengan kebijakan lain dapat ditemukan di sini .
Membuat fungsi lambda yang menjalankan acme-dns-route53
Hore! Sekarang Anda dapat menggunakan fungsi kami untuk AWS menggunakan perintah aws lambda create-function
. Lambda harus dikonfigurasi menggunakan variabel lingkungan berikut:
AWS_LAMBDA
- membuat acme-dns-route53 memahami bahwa eksekusi terjadi di dalam AWS Lambda.DOMAINS
- daftar domain yang dipisahkan oleh koma.LETSENCRYPT_EMAIL
- Berisi Mari Enkripsi Email .NOTIFICATION_TOPIC
- SNS Notification Topic name (opsional).STAGING
- jika diatur ke 1
, lingkungan pementasan digunakan.RENEW_BEFORE
- jumlah hari yang menentukan periode sebelum berakhirnya periode di mana sertifikat harus diperpanjang.1024
MB - batas memori, dapat berubah.900
detik (15 mnt) - batas waktu.acme-dns-route53
- nama biner kami, yang ada di arsip.fileb://~/acme-dns-route53.zip
- path ke arsip yang kita buat.
Sekarang sebarkan:
$ 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\",LETSENCRYPT_EMAIL=begmaroman@gmail.com,STAGING=0,NOTIFICATION_TOPIC=acme-dns-route53-obtained,RENEW_BEFORE=7}" \ --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": "your@email.com", "NOTIFICATION_TOPIC": "acme-dns-route53-obtained", "RENEW_BEFORE": "7", "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" }
Membuat pengatur waktu CloudWatch yang memicu fungsi 2 kali sehari
Langkah terakhir adalah mengatur mahkota, yang memanggil fungsi kita dua kali sehari:
- Buat aturan CloudWatch dengan nilai
schedule_expression
. - buat tujuan aturan (apa yang harus dilakukan) dengan menentukan ARN dari fungsi lambda
- memberikan izin kepada aturan yang memanggil fungsi lambda.
Di bawah ini saya memasang konfigurasi Terraform saya, tetapi sebenarnya ini dilakukan dengan sangat sederhana menggunakan konsol AWS atau 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}" }
Sekarang Anda dikonfigurasikan untuk secara otomatis membuat dan memperbarui sertifikat SSL