🐷

AWS Private Link 経由で Momento Cache にアクセスする

2023/09/15に公開

今日は、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からアップロードします。

スタック名に適当な名前を付けます。

cacheservicenamecontrolservicenameに与えられたパラメータを入力します。

次に、セキュリティグループ、サブネット、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の人に聞いてみようと思います。
https://tokyo.serverlessdays.io/

Discussion