ALBの後ろにgRPCサーバーを置く場合、ALB <=> gRPC server
間はInsecureな通信が可能ですが Client <=> ALB
間はHTTP2のため、TLSが必須になります。そのため、証明書を発行しALBに設定する必要があります。
外部に公開しないサーバーであったとしてもALBでのSSL証明書の設定が必須なので、今回は簡単な設定方法の紹介です。
今回紹介の方法
- "grpc.ssl_target_name_override"オプションによる設定
他の方法
- AWS CertificateManager - プライベート認証機関の利用
- オレオレ証明書の利用
"grpc.ssl_target_name_override"オプションによる設定
前提: すでに、何らかの有効なSSL証明書を取得している
取得がない場合は、他の方法を取ったほうが楽かもしれません。
前準備
ALBに、有効なSSL証明書の登録をしておいてください。証明書さえ設定しておけば、DNSの設定は不要です。もちろんワイルドカード証明書も利用可能です。
Client Code
import * as grpc from "grpc"
const host = "my.inside.address:50051" // 本来の接続アドレス
const sslCn = "my.domain.org" // ALBに設定したSSL証明書のCN
const cred = grpc.credentials.createSsl()
console.log("Connect to host:", host)
const client = new MyGrpcClient(host, cred, {
"grpc.ssl_target_name_override": sslCn
})
設定はいたって簡単で、credentialにはcreateSsl()で作成、オプションとして grpc.ssl_target_name_override
にSSLのCNを渡すだけになります。
実装はTypeScriptになっていますが、オプションはほぼすべての言語で使用可能だと思うので、各言語のリファレンスを参照してください。
なお、Server自体では追加設定は不要です。ALBとClientのみ設定すれば良いです。
他の方法
今回は方法は割愛します。それぞれを利用した際のデメリットを載せておきます。
プライベート認証機関
こちらを利用することで簡単に内部ネットワーク向け証明書を発行可能だが、最低 400$/月かかるため、経済的に優しくない。
おれおれ証明書
作るのが手間+有効期限があるので、切れたときの更新がだるい