DNS-01 āĻšā§āĻ¯āĻžāĻ˛ā§‡āĻžā§āĻœ āĻāĻŦāĻ‚ AWS āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ Let's Encrypt SSL āĻ¸āĻžāĻ°ā§āĻŸāĻŋāĻĢāĻŋāĻ•ā§‡āĻŸ āĻŦā§āĻ¯āĻŦāĻ¸ā§āĻĨāĻžāĻĒāĻ¨āĻžāĻ° āĻ…āĻŸā§‹āĻŽā§‡āĻļāĻ¨

āĻĒā§‹āĻ¸ā§āĻŸāĻŸāĻŋ āĻĨā§‡āĻ•ā§‡ SSL āĻ¸āĻžāĻ°ā§āĻŸāĻŋāĻĢāĻŋāĻ•ā§‡āĻŸā§‡āĻ° āĻŦā§āĻ¯āĻŦāĻ¸ā§āĻĨāĻžāĻĒāĻ¨āĻž āĻ¸ā§āĻŦāĻ¯āĻŧāĻ‚āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻ•āĻ°āĻžāĻ° āĻĒāĻĻāĻ•ā§āĻˇā§‡āĻĒāĻ—ā§āĻ˛āĻŋ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°ā§‡ā§ˇ āĻ†āĻ¸ā§āĻ¨ CA āĻāĻ¨āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻ•āĻ°āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° DNS-01 āĻšā§āĻ¯āĻžāĻ˛ā§‡āĻžā§āĻœ и āĻĄā§‡āĻ¸ā§āĻ•āĻŸāĻĒ AWS.

acme-dns-route53 āĻāĻ•āĻŸāĻŋ āĻŸā§āĻ˛ āĻ¯āĻž āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻ‡ āĻŦā§ˆāĻļāĻŋāĻˇā§āĻŸā§āĻ¯ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻžāĻ° āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§‡āĻŦā§‡āĨ¤ āĻāĻŸāĻŋ Let's Encrypt āĻĨā§‡āĻ•ā§‡ SSL āĻļāĻ‚āĻ¸āĻžāĻĒāĻ¤ā§āĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡, āĻ¸ā§‡āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ Amazon Certificate Manager-āĻ āĻ¸ā§‡āĻ­ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡, DNS-53 āĻšā§āĻ¯āĻžāĻ˛ā§‡āĻžā§āĻœ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻ¤ā§‡ Route01 API āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡, āĻāĻŦāĻ‚ āĻ…āĻŦāĻļā§‡āĻˇā§‡, SNS-āĻ āĻĒā§āĻļ āĻŦāĻŋāĻœā§āĻžāĻĒā§āĻ¤āĻŋāĻ—ā§āĻ˛āĻŋāĨ¤ āĻ­āĻŋāĻ¤āĻ°ā§‡ acme-dns-route53 AWS Lambda-āĻāĻ° āĻ­āĻŋāĻ¤āĻ°ā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§āĻ¤āĻ°ā§āĻ¨āĻŋāĻ°ā§āĻŽāĻŋāĻ¤ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻžāĻ°āĻŋāĻ¤āĻžāĻ“ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ āĻāĻŦāĻ‚ āĻāĻŸāĻŋ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨āĨ¤

āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋ 4āĻŸāĻŋ āĻŦāĻŋāĻ­āĻžāĻ—ā§‡ āĻŦāĻŋāĻ­āĻ•ā§āĻ¤:

  • āĻāĻ•āĻŸāĻŋ āĻœāĻŋāĻĒ āĻĢāĻžāĻ‡āĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž;
  • āĻāĻ•āĻŸāĻŋ IAM āĻ­ā§‚āĻŽāĻŋāĻ•āĻž āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž;
  • āĻāĻ•āĻŸāĻŋ āĻ˛ā§āĻ¯āĻžāĻŽā§āĻŦāĻĄāĻž āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻ¯āĻž āĻšāĻ˛ā§‡ acme-dns-route53;
  • āĻāĻ•āĻŸāĻŋ āĻ•ā§āĻ˛āĻžāĻ‰āĻĄāĻ“āĻ¯āĻŧāĻžāĻš āĻŸāĻžāĻ‡āĻŽāĻžāĻ° āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻ¯āĻž āĻĻāĻŋāĻ¨ā§‡ 2 āĻŦāĻžāĻ° āĻāĻ•āĻŸāĻŋ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻŸā§āĻ°āĻŋāĻ—āĻžāĻ° āĻ•āĻ°ā§‡;

āĻŦāĻŋāĻƒāĻĻā§āĻ°āĻƒ: āĻ†āĻĒāĻ¨āĻŋ āĻļā§āĻ°ā§ āĻ•āĻ°āĻžāĻ° āĻ†āĻ—ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ GoLang 1.9+ и āĻāĻĄāĻžāĻŦā§āĻ˛ā§āĻāĻ¸ āĻ¸āĻŋ āĻāĻ˛ āĻ†āĻ‡

āĻāĻ•āĻŸāĻŋ āĻœāĻŋāĻĒ āĻĢāĻžāĻ‡āĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

acme-dns-route53 GoLang-āĻ āĻ˛ā§‡āĻ–āĻž āĻāĻŦāĻ‚ 1.9-āĻāĻ° āĻ•āĻŽ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ āĻ•āĻ°ā§‡āĨ¤

āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻŦāĻžāĻ‡āĻ¨āĻžāĻ°āĻŋ āĻĻāĻŋāĻ¯āĻŧā§‡ āĻāĻ•āĻŸāĻŋ āĻœāĻŋāĻĒ āĻĢāĻžāĻ‡āĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ 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 āĻ†āĻļāĻž āĻ•āĻ°ā§‡ āĻ¯ā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻœāĻŋāĻĒ āĻĢāĻžāĻ‡āĻ˛ā§‡ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻž āĻšāĻŦā§‡, āĻ¤āĻžāĻ‡ āĻ†āĻ¸ā§āĻ¨ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻŋ acme-dns-route53.zip āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖāĻžāĻ—āĻžāĻ° āĻ¯āĻž āĻ¨āĻ¤ā§āĻ¨ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻž āĻŦāĻžāĻ‡āĻ¨āĻžāĻ°āĻŋ āĻ§āĻžāĻ°āĻŖ āĻ•āĻ°āĻŦā§‡:

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

āĻŦāĻŋāĻƒāĻĻā§āĻ°āĻƒ: āĻŦāĻžāĻ‡āĻ¨āĻžāĻ°āĻŋāĻŸāĻŋ āĻœāĻŋāĻĒ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖāĻžāĻ—āĻžāĻ°ā§‡āĻ° āĻŽā§‚āĻ˛ā§‡ āĻĨāĻžāĻ•āĻž āĻ‰āĻšāĻŋāĻ¤āĨ¤ āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻŽāĻ°āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ -j āĻĒāĻ¤āĻžāĻ•āĻž

āĻāĻ–āĻ¨ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻœāĻŋāĻĒ āĻĄāĻžāĻ•āĻ¨āĻžāĻŽ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤, āĻ¯āĻž āĻŦāĻžāĻ•āĻŋ āĻ†āĻ›ā§‡ āĻ¤āĻž āĻšāĻ˛ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻ…āĻ§āĻŋāĻ•āĻžāĻ° āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻ­ā§‚āĻŽāĻŋāĻ•āĻž āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻžāĨ¤

āĻāĻ•āĻŸāĻŋ āĻ†āĻ‡āĻāĻāĻŽ āĻ­ā§‚āĻŽāĻŋāĻ•āĻž āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž

āĻāĻŸāĻŋ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻ° āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ˛ā§āĻ¯āĻžāĻŽā§āĻŦāĻĄāĻž āĻĻā§āĻŦāĻžāĻ°āĻž āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻ…āĻ§āĻŋāĻ•āĻžāĻ°āĻ—ā§āĻ˛āĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ†āĻ‡āĻāĻāĻŽ āĻ­ā§‚āĻŽāĻŋāĻ•āĻž āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤
āĻāĻ° āĻāĻ‡ āĻ¨ā§€āĻ¤āĻŋ āĻ•āĻ˛ āĻ•āĻ°āĻž āĻ¯āĻžāĻ• lambda-acme-dns-route53-executor āĻāĻŦāĻ‚ āĻ…āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§‡ āĻ¤āĻžāĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻŽā§ŒāĻ˛āĻŋāĻ• āĻ­ā§‚āĻŽāĻŋāĻ•āĻž āĻĻāĻŋāĻ¨ AWSLambdaBasicExecutionRole. āĻāĻŸāĻŋ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ˛ā§āĻ¯āĻžāĻŽā§āĻŦāĻĄāĻžāĻ•ā§‡ AWS āĻ•ā§āĻ˛āĻžāĻ‰āĻĄāĻ“āĻ¯āĻŧāĻžāĻš āĻĒāĻ°āĻŋāĻˇā§‡āĻŦāĻžāĻ¤ā§‡ āĻ˛āĻ—āĻ—ā§āĻ˛āĻŋ āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻāĻŦāĻ‚ āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§‡āĻŦā§‡ā§ˇ
āĻĒā§āĻ°āĻĨāĻŽāĻ¤, āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ 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 Resource Name) āĻŽāĻ¨ā§‡ āĻ°āĻžāĻ–āĻŦā§‡āĻ¨ - āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻ§āĻžāĻĒā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻŸāĻŋāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻšāĻŦā§‡āĨ¤

āĻ­ā§‚āĻŽāĻŋāĻ•āĻž 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 āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨ 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 āĻļāĻ‚āĻ¸āĻžāĻĒāĻ¤ā§āĻ° āĻ¤ā§ˆāĻ°āĻŋ āĻāĻŦāĻ‚ āĻ†āĻĒāĻĄā§‡āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°ā§‡āĻ›ā§‡āĻ¨ā§ˇ

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨