はじめに
Linuxコンテナに配置した.NET6のアプリケーションからTLSを有効にしたDocumentDBへの接続で沼ったので、誰かがしなくて良い苦労をしないために、備忘録を残しておきます。
私の環境はmcr.microsoft.com/dotnet/aspnet:6:0
をベースとしたコンテナをECSに配置していました。
TL;DR
こちらの記事にある通りですが、以下の記述をDockerfileに追記することでTLSによる通信ができるようになりました。
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
# add AWS RDS CA bundle
ADD https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem /tmp/rds-ca/aws-rds-ca-bundle.pem
# split the bundle into individual certs (prefixed with xx)
# see http://blog.swwomm.com/2015/02/importing-new-rds-ca-certificate-into.html
RUN cd /tmp/rds-ca && cat aws-rds-ca-bundle.pem|awk 'split_after==1{n++;split_after=0} /-----END CERTIFICATE-----/ {split_after=1} {print > "cert" n ""}' \
&& for CERT in /tmp/rds-ca/cert*; do mv $CERT /usr/local/share/ca-certificates/aws-rds-ca-$(basename $CERT).crt; done \
&& rm -rf /tmp/rds-ca \
&& update-ca-certificates
WORKDIR /app
EXPOSE 80
EXPOSE 443
...
...
...
接続文字列はDocumentDBの管理画面でアナウンスがあったものをそのまま使用しています。
mongodb://<user>:<password>@<endpoint>:27017/?tls=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false
なぜ沼ったか
公式ではpemをダウンロードし、それをアプリケーション内で証明書のストアにインポートしてと書かれているからです。
恐らくそれで動く環境もあると思います。
RDSやWindowsサーバーだとまた違ってくるのかもしれません。
ですが、もし私と同じような状態で困っている人はこの方法を試してみてください。
以下、公式ドキュメント