[AWS] AWS CLIでELBへSSL証明書をアップロード、削除する。

こんにちは、与儀です。

ELB(Elastic Load Balancing)にSSL証明書を配置して、HTTPS ロードバランサーとして利用することで、ELB → EC2間はHTTP通信のみとして利用することができます。

ロードバランサーの HTTPS リスナーの設定

EC2コンソールまたは、AWS CLIを用いてSSL証明書をアップロードしてHTTPS リスナーの追加をすることができますが、アップロードされたSSL証明書を削除する方法は、現状AWS CLIからしかできないため、今回は、このSSL証明書アップロードと削除の作業をAWS CLIより実行してみたいと思います。

今回、下記のIAMポリシーを持ったIAMユーザを使用します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iam:DeleteServerCertificate",
        "iam:ListServerCertificates",
        "iam:UploadServerCertificate"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}

また、下記のようにHTTPリスナーが有効になっているELBに対して、HTTPSリスナーを追加します。

AWS CLI よりアップロードする。

IAM へのサーバー証明書のアップロード
↑の公式ドキュメントを参考にして、サーバ証明書ファイル、秘密鍵ファイル、中間証明書ファイルをそれぞれ、my-crt.pem、my-key.pem、my-chain.pemとして下記のように配置して、upload-server-certificateコマンドで証明書名を「test-ssl-upload-01」としてアップロードします。

[root@test testdir]# ls
my-chain.pem  my-crt.pem  my-key.pem
[root@test testdir]# aws iam upload-server-certificate --server-certificate-name test-ssl-upload-01 --certificate-body file://my
-crt.pem --private-key file://my-key.pem --certificate-chain file://my-chain.pem
{
    "ServerCertificateMetadata": {
        "ServerCertificateId": "ASCAIMIHK332C6DK4OZCU",
        "ServerCertificateName": "test-ssl-upload-01",
        "Expiration": "2016-12-15T23:59:59Z",
        "Path": "/",
        "Arn": "arn:aws:iam::アカウントID:server-certificate/test-ssl-upload-01",
        "UploadDate": "2016-03-20T10:36:46.994Z"
    }
}
[root@test testdir]#

実際にEC2コンソールで確認してみます。
変更を選択。

既存の証明書を選択すると、証明書名に「test-ssl-upload-01」がアップロードされていることがわかります。そのまま「保存」を選択します。

「保存」を選択。

「閉じる」を選択。

以上で、HTTPSリスナーの追加が完了しました。

ところで、SSL証明書をいくつアップロードできるか試してみましょう。確か以前は10個までだったはず、と思って調べてみたところ、
IAM エンティティにおける制限およびオブジェクト
より、「AWS アカウントに格納されるサーバー証明書: 20」ということで上限は20個らしいので、試しに、upload-server-certificateコマンドで証明書名を「test-ssl-upload-02」~「test-ssl-upload-20」までやってみました。
すると下記のように確かに、20個までアップロードできていることが確認できました。

そして、21個目を試すと下記のようにエラーとなりました。

[root@test testdir]# aws iam upload-server-certificate --server-certificate-name test-ssl-upload-21 --certificate-body file://my-crt.pem --private-key file://my-key.pem --certificate-chain file://my-chain.pem
 
A client error (LimitExceeded) occurred when calling the UploadServerCertificate operation: Cannot exceed quota for ServerCertificatesPerAccount: 20
[root@test testdir]#

では次に、この20個いっぱいになったサーバ証明書を削除してみます。

AWS CLI より削除する。

IAM からのサーバー証明書の削除
を参考に、delete-server-certificateコマンドで、証明書名「test-ssl-upload-20」を指定して削除してみます。

[root@test testdir]# aws iam delete-server-certificate --server-certificate-name test-ssl-upload-20
[root@test testdir]#

実際にEC2コンソールで確認すると、削除されていることがわかります。

試しに、「test-ssl-upload-01」の削除を試みてみると、

[root@test testdir]# aws iam delete-server-certificate --server-certificate-name test-ssl-upload-01
 
A client error (DeleteConflict) occurred when calling the DeleteServerCertificate operation: Certificate: ASCAIMIHK332C6DK4OZCU is currently in use by arn:aws:elasticloadbalancing:ap-northeast-1:アカウントID:loadbalancer/ssl-test. Please remove it first before deleting it from IAM.
[root@test testdir]#

ということで、ELBにて利用中の証明書については削除できないようにエラーとなるようです。本番環境のELBで利用中のSSL証明書を誤って削除することも防げて安心ですね。
ELBに対してACMの利用が東京リージョンで利用可能となればこのようなアップロード作業も不要となるので、待ち遠しいですね。

以上です。