Single InstanceのElastic Beanstalkに証明書を入れる
Elastic Benastalk(EB)を利用してHTTPSを有効化する場合、大抵の人はELBを導入して、ELBに証明書を設定するかと思います。
しかし時には料金の理由などによってSingle Instance構成にする場合があるかと思います。この場合はEBのextensionを使ってEC2をカスタマイズして、証明書をインストールするしかありません。今回はそれができたので、やり方をメモしておきます。
(ちなみにSelf-Signed Cert、自己証明書・オレオレ証明書を使います。ちゃんとやる場合はちゃんと発行されたものを使いましょう)
基本方針
- EBはEC2上でreverse proxyとしてnginxを動かしている。そのnginxがport 80へのリクエストをdocker container側へ流す
- ebextensionsを使ってEC2に証明書を入れ、nginxが使えるようにする
- このあたりの資料を参考にする
設定の準備
# .ebextensions/https-instance.config
files:
/etc/nginx/conf.d/https.conf:
mode: "000644"
owner: root
group: root
content: |
# HTTPS Server
server {
listen 443;
server_name localhost;
ssl on;
ssl_certificate /etc/pki/tls/certs/server.crt;
ssl_certificate_key /etc/pki/tls/certs/server.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://docker;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
}
}
/etc/pki/tls/certs/server.crt:
mode: "000400"
owner: root
group: root
content: |
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
httpsでlistenするようにしつつ、証明書を設定します。このファイルはGitHubにpushする予定だったので公開鍵(server.crt)だけ直接書いています。
秘密鍵は
https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/https-storingprivatekeys.html
この辺を参考にして
#.ebextensions/privatekey.config
Resources:
AWSEBAutoScalingGroup:
Metadata:
AWS::CloudFormation::Authentication:
S3Auth:
type: "s3"
buckets: ["my-secrets"]
roleName:
"Fn::GetOptionSetting":
Namespace: "aws:autoscaling:launchconfiguration"
OptionName: "IamInstanceProfile"
DefaultValue: "aws-elasticbeanstalk-ec2-role"
files:
# Private key
"/etc/pki/tls/certs/server.key":
mode: "000400"
owner: root
group: root
authentication: "S3Auth"
source: https://my-secrets.s3-ap-northeast-1.amazonaws.com/ssl_certs/self-signed-certs-for-https/server.key
さっきの.crtはconfigに直接書きましたが、.keyである秘密鍵はs3に置いて動的に持ってくるようにしました。
当初はACMを使う予定だったんですが、ドキュメントないので断念しました。ACMでできるならその方が良さそうですね。
port 443でアクセスするためにSecurityGroupも変更しておきます。
以上です。ほぼドキュメント通りですが、これでHTTPSで接続できるようになりました。