aws

Single InstanceのElastic Beanstalkに証明書を入れる


Elastic Benastalk(EB)を利用してHTTPSを有効化する場合、大抵の人はELBを導入して、ELBに証明書を設定するかと思います。

しかし時には料金の理由などによってSingle Instance構成にする場合があるかと思います。この場合はEBのextensionを使ってEC2をカスタマイズして、証明書をインストールするしかありません。今回はそれができたので、やり方をメモしておきます。

(ちなみにSelf-Signed Cert、自己証明書・オレオレ証明書を使います。ちゃんとやる場合はちゃんと発行されたものを使いましょう)

基本方針

設定の準備

# .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で接続できるようになりました。