Posting ini menjelaskan langkah-langkah yang diperlukan untuk menyiapkan pembuatan dan pembaruan sertifikat SSL otomatis, menggunakan Let's Encrypt sebagai Otoritas Sertifikat otomatis, yang menyediakan API yang terpelihara dengan baik.
acme-dns-route53
adalah alat untuk mendapatkan sertifikat SSL dari Let's Encrypt menggunakan tantangan DNS-01 dengan Route53 dan Amazon Certificate Manager oleh AWS. acme-dns-route53
juga memiliki fungsi acme-dns-route53
untuk menggunakan alat ini di dalam AWS Lambda, dan inilah yang akan kita lakukan.
Posting ini dipecah menjadi 4 bagian:
- membangun file zip mandiri yang dapat digunakan
- membuat peran IAM untuk fungsi lambda yang memberikan izin yang diperlukan untuk mengeksekusi
- membuat fungsi lambda yang mengeksekusi
acme-dns-route53
- membuat pengatur waktu CloudWatch yang memicu fungsi lambda dua kali sehari
Catatan: sebelum memulai, pastikan GoLang 1.9+ dan AWS CLI sudah diinstal.
Membangun file zip mandiri dan dapat digunakan
acme-dns-route53
ditulis dalam GoLang dan versi pendukungnya tidak kurang dari 1.9. Kita perlu membuat file zip mandiri yang bisa digunakan yang berisi executable dari alat acme-dns-route53
di dalamnya.
Langkah pertama adalah membangun sebuah executable dari repo GitHub dari alat acme-dns-route53
menggunakan perintah go install
:
$ env GOOS=linux GOARCH=amd64 go install github.com/begmaroman/acme-dns-route53
Eksekusi akan diinstal di $GOPATH/bin
. Penting: sebagai bagian dari perintah ini kami menggunakan env untuk sementara menetapkan dua variabel lingkungan untuk durasi untuk perintah ( GOOS=linux
dan GOARCH=amd64
). Ini menginstruksikan kompiler Go untuk membuat executable yang cocok untuk digunakan dengan OS Linux dan arsitektur amd64 - yang akan dijalankan saat kami menyebarkannya ke AWS.
AWS mengharuskan kami untuk mengunggah fungsi lambda kami dalam file zip, jadi mari kita buat file zip acme-dns-route53.zip
berisi file executable yang baru saja kita buat:
$ zip -j ~/acme-dns-route53.zip $GOPATH/bin/acme-dns-route53
Perhatikan bahwa file yang dapat dieksekusi harus di root dari file zip - bukan di folder di dalam file zip. Untuk memastikan ini, saya telah menggunakan flag -j
di snippet di atas untuk nama direktori junk.
Sekarang file zip dapat digunakan, tetapi masih membutuhkan izin untuk dijalankan.
Membuat peran IAM untuk fungsi lambda yang memberikan izin yang diperlukan untuk mengeksekusi
Kita perlu mengatur peran IAM yang mendefinisikan izin yang akan dimiliki fungsi lambda saat dijalankan.
Untuk saat ini, mari kita membuat peran lambda-acme-dns-route53-executor
dan melampirkan kebijakan terkelola AWSLambdaBasicExecutionRole
ke sana. Ini akan memberi fungsi lambda kami izin dasar yang diperlukan untuk menjalankan dan masuk ke layanan AWS CloudWatch.
Pertama, kita harus membuat file JSON kebijakan kepercayaan. Ini pada dasarnya akan menginstruksikan AWS untuk memungkinkan layanan lambda untuk mengambil peran lambda-acme-dns-route53-executor
:
$ touch ~/lambda-acme-dns-route53-executor-policy.json
Konten file JSON yang dibuat harus 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/*" ] } ] }
Kemudian gunakan perintah aws iam create-role
untuk membuat peran dengan kebijakan trust ini:
$ aws iam create-role --role-name lambda-acme-dns-route53-executor \ --assume-role-policy-document ~/lambda-acme-dns-route53-executor-policy.json
Catat ARN (Nama Sumber Daya Amazon) yang dikembalikan - Anda akan memerlukan ini di langkah berikutnya.
Sekarang peran lambda-acme-dns-route53-executor
telah dibuat, kita perlu menentukan izin yang dimiliki oleh peran tersebut. Cara termudah untuk melakukan ini adalah dengan menggunakan perintah aws iam attach-role-policy
, dengan memasukkan ARN AWSLambdaBasicExecutionRole
kebijakan izin seperti:
$ aws iam attach-role-policy --role-name lambda-acme-dns-route53-executor \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
Catatan: Anda dapat menemukan daftar kebijakan izin lainnya yang mungkin berguna di sini .
Membuat fungsi lambda yang mengeksekusi acme-dns-route53
Sekarang kita siap untuk benar-benar menggunakan fungsi lambda ke AWS, yang bisa kita lakukan menggunakan perintah aws lambda create-function
. Fungsi lambda perlu dikonfigurasi dengan opsi berikut:
AWS_LAMBDA
variabel lingkungan dengan nilai 1
yang menyesuaikan alat untuk menggunakan fungsi Lambda di dalam.DOMAINS
adalah variabel lingkungan yang berisi daftar domain yang dipisahkan koma yang akan dikeluarkan sertifikatnya.LETSENCRYPT_EMAIL
adalah variabel lingkungan yang berisi email kadaluarsa Let's Encrypt.NOTIFICATION_TOPIC
adalah variabel lingkungan yang berisi SNS Notification Topic ARN.STAGING
adalah variabel lingkungan yang harus berisi 1
nilai untuk menggunakan lingkungan staging Let's Encrypt atau 0
untuk lingkungan produksi.RENEW_BEFORE
adalah jumlah hari yang menentukan periode sebelum berakhirnya saat sertifikat harus diperbarui.1024
MB adalah batas memori (dapat diubah jika diperlukan).900
detik (15 mnt) adalah batas waktu maksimum.acme-dns-route53
adalah nama handler dari fungsi lambda.fileb://~/acme-dns-route53.zip
adalah file .zip yang dibuat di atas.
Teruskan dan coba gunakan:
$ 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 lambda sekali sehari
Langkah terakhir adalah membuat pemicu harian untuk fungsi tersebut. Untuk melakukan ini kita dapat:
- buat aturan CloudWatch dengan
schedule_expression
diinginkan (kapan harus dijalankan). - membuat target aturan (apa yang harus dijalankan) dengan menentukan ARN fungsi lambda.
- memberikan izin aturan CloudWatch untuk menjalankan fungsi lambda.
Saya telah menempelkan konfigurasi Terraform saya untuk itu di bawah ini, tetapi juga sangat mudah untuk melakukannya dari konsol AWS atau 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 juga dapat memiliki 100% pembaruan sertifikat TLS otomatis!