/ssl-auto-certification

Get Let's Encrypt certificate automatically using certbot. [Docker, aws, Terraform]

Primary LanguageShell

SSL auto certification

EN

JP

aws Lambda上でcertbotを起動してroute53に登録されているドメインのLet's Encrypt証明書を自動発行します. 発行された証明書はaws S3 Bucketに保存されます. 定期実行はaws EventBridgeのSchedulerで定義されます.

  • Dockerコンテナ上にaws-cli, Terraform, Docker (Docker in Docker)作業環境を提供します.
  • awsのMFAを強制したAssume Roleによりセキュリティを高めています1
  • Terraformで定期的な更新環境を自動構築します.
  • docker buildxでamd64版とarm64版のDocker Imageを両方構築します.
    • 作成手続きはbuild.shで自動化されています.
    • 片方不要ならbuild.shを編集してください.

Note

awsの一部のリソースは単純化と削除回避のためTerraformで管理されていません.各自で作成してください.
-> IAM User, IAM Role, S3 Bucket, ECR Repository, Route53,

Note

構造単純化のためバリデーションなどのエラー処理がされていません.必要な人は各自で行ってください.

Tech, Keywords

  • aws
    • aws-cli
    • lambda (using container image)
    • EventBridge scheduler
    • Assume Role
  • Terraform
  • Docker
    • compose
    • Multi Stage Build
    • Docker in Docker
    • buildx
  • certbot
    • dns-route53
  • Let's Encrypt,

Settings

$ make build
$ make up
# in Docker Container
$ aws-assume <profile-name> <MFA-Token> 
$ cd tf

# Check settings.
# -> build.sh, variables.tf...
$ make build
# Wait...

$ make tf-apply

# First Certification
$ make invoke

envfile

load to compose.yml

TF_VAR_DOMAINS='["example.com", "*.example.com"]'
TF_VAR_EMAIL='example@example.com'
TF_VAR_S3_BUCKET_NAME='example-bucket'
AWS_ACCESS_KEY_ID=EXAMPLEACCESSKEYSTRINGS
AWS_SECRET_ACCESS_KEY=ExAmpLsecRetEAcceSskeYSTrinGs
# AWS_SESSION_TOKEN=xxxxxxxxxxxxxxxxxxx
AWS_DEFAULT_REGION=ap-northeast-1 
AWS_DEFAULT_OUTPUT=json

AWS_ACCOUNT_ID="0123456789"
AWS_ROLE_ARN="arn:aws:iam::xxxxxxxxxxxx:role/Example-CLI-Role"
AWS_ROLE_EXTERNAL_ID="ExampleExternalID"
AWS_MFA_SERIAL_ARN="arn:aws:iam::xxxxxxxxxxxx:mfa/example-auth"

作成参考23

Footnotes

  1. ryo0301, MacからAWSにアクセスする時はAssumeRoleすることにした, Qiita

  2. id:cohalz, Let's Encrypt証明書の自動更新システムを作る, Hatena Developer Blog

  3. id:cohalz, CertUpdater, GitHub