AWS Private Link 経由で Momento Cache にアクセスする
今日は、Momento社に問い合わせていた Private Linkエンドポイントが作成されたので、その情報を元に作業を行い、Momento CacheへのPrivateアクセスを試していきます。クラウドを活用している企業の中にはVPCのみ利用が許可される、もしくはVPC外のサービスは承認手続きが複雑になるなど困ったケースがあると思います。
先日別の記事でも記載しましたが、AWS内部のパブリック通信は、AWSが管理している通信網を通り、パブリックインターネットを通るわけではないのですが、やはりこの辺りはあまり理解されていないケースがよくあります。このPrivate Link対応はそういうケースに有効ではないでしょうか。
さっそくやってみる
まずMomentoからCloudFormationテンプレートが送られてきました。
Parameters:
cacheservicename:
Type: String
Description: The service name of the Momento vpc endpoint. This is given to you by a Momento engineer.
controlservicename:
Type: String
Description: The service name of the Momento vpc endpoint. This is given to you by a Momento engineer.
subnetids:
Type: List<AWS::EC2::Subnet::Id>
Description: The IDs of subnets in which to create an endpoint network interface
securitygroupids:
Type: List<AWS::EC2::SecurityGroup::Id>
Description: The IDs of security groups to associate with the endpoint network interface
vpcid:
Type: AWS::EC2::VPC::Id
Description: The ID of the VPC in which the endpoint will be used
Resources:
momentocachevpcendpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
ServiceName:
Ref: cacheservicename
VpcId:
Ref: vpcid
PrivateDnsEnabled: true
SecurityGroupIds:
Ref: securitygroupids
SubnetIds:
Ref: subnetids
VpcEndpointType: Interface
momentocontrolvpcendpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
ServiceName:
Ref: controlservicename
VpcId:
Ref: vpcid
PrivateDnsEnabled: true
SecurityGroupIds:
Ref: securitygroupids
SubnetIds:
Ref: subnetids
VpcEndpointType: Interface
このテンプレートでStackを作成しますが、その際に入力が求められるパラメータも2つ送られてきました。
cacheservicename = com.amazonaws.vpce.ap-northeast-1.vpce-svc-xxxxxxxxxxxx
controlservicename = com.amazonaws.vpce.ap-northeast-1.vpce-svc-xxxxxxxxxxxx
この2つのパラメータは私の環境固有のようですので、値をxxxxxx
にしています。
まずはテンプレートを適当な名前で*.yamlで保存しておき、CloudFormationからアップロードします。
スタック名に適当な名前を付けます。
cacheservicename
とcontrolservicename
に与えられたパラメータを入力します。
次に、セキュリティグループ、サブネット、VPCを指定します。
後ほど起動するMomento CLI環境のEC2はここで指定される同じVPC、サブネットに起動する必要があります。また当該EC2ではアウトバウンドのセキュリティグループの宛先を、ここで指定したセキュリティグループに指定することで、パブリックエンドポイントの通信を禁止し、Private Linkエンドポンとのみに制限させます。
スタックを実行してしばらく待つと作成が完了します。
CLI環境をEC2で起動
VPCのエンドポイント画面に行くと2つのエンドポイントができています。
どちらか一つをクリックし、画面下部の詳細を見てみるとDNS名
には以下のような値が複数個セットされているはずです。
これにより、Momento CLIが外部へアクセスする際の名前解決先がパブリックエンドポイントから、Private Link経由エンドポイントに代わります。
では、Momento CLI 環境をLinuxで作成する方法に従いCLI環境を起動します。先ほど指定したのと同じVPC、サブネットを必ず指定してEC2を起動してください。
手順に従いトークンをセットし以下を実行できれば完了です。
./momento cache set foo bar
./momento cache get foo
bar
ただしこれだけだと通信がPrivate経由なのかはよくわかりません。--verbose
オプションをつけて再度実行してみます。
./momento cache set foo bar --verbose
細かいDEBUGログが出てきますが以下の部分に注目して下さい。
[2023-09-15T01:33:17Z DEBUG momento::simple_cache_client] connecting to cache endpoint: "https://cache.cell-ap-northeast-1-1.prod.a.momentohq.com", connecting to control endpoint: "https://control.cell-ap-northeast-1-1.prod.a.momentohq.com"
[2023-09-15T01:33:17Z DEBUG rustls::anchors] add_parsable_certificates processed 134 valid and 0 invalid certs
[2023-09-15T01:33:17Z DEBUG rustls::anchors] add_parsable_certificates processed 134 valid and 0 invalid certs
[2023-09-15T01:33:17Z DEBUG momento::utils::client] setting...
[2023-09-15T01:33:17Z DEBUG hyper::client::connect::dns] resolving host="cache.cell-ap-northeast-1-1.prod.a.momentohq.com"
[2023-09-15T01:33:17Z DEBUG hyper::client::connect::http] connecting to 172.31.11.59:443
[2023-09-15T01:33:17Z DEBUG hyper::client::connect::http] connected to 172.31.11.59:443
https://control.cell-ap-northeast-1-1.prod.a.momentohq.com
を名前解決した結果として172.31.11.59
が戻ってきています。これはPrivateIPですので、無事Private Link経由通信ができていることがわかります。
EC2のセキュリティグループのアウトバウンドルールを以下に変更してみます。
送信先をPrivate Linkエンドポイントが持つセキュリティグループに限定しています。
この状態で通信が確認できればOKです。
パフォーマンス確認
ではパブリックエンドポイント利用時とパフォーマンスを比べてみます。
Momento 入門 その2:キャッシュへの通信とパフォーマンスを探るで行ったテストを行います。
100回書き込みの結果が以下です。
実行時間: 410.25912199984305 ミリ秒
パブリックエンドポイント利用時は1アイテムあたり2ミリ秒強でしたので、約倍のパフォーマンスになります。これは利用を決定する前に知っておいたほうがいいでしょう。
では次に100回読み込みです。
実行時間: 323.9730569999665 ミリ秒
パブリックエンドポイントだと書き込みと読み込みはほぼ同じ2ミリ秒強でしたが、Private Link環境だと読み込みと書き込みでパフォーマンスに差が出るようです。パブリックエンドポイントの約1.5倍の、3ミリ秒強となりました。これは少し興味深い動きをします。Serverless DaysでMomentoの人に聞いてみようと思います。
Discussion