月別アーカイブ: 2023年3月

VPCエンドポイントに関してのおさらい

AWS の勉強をしていると時々出てくるVPCエンドポイント。
単語レベルでは覚えていても理解しているとは言い難いところが多いので、一度自分なりに整理して理解に努めて見る

VPCエンドポイントの目的

VPC エンドポイント
https://docs.aws.amazon.com/ja_jp/vpc/latest/privatelink/vpc-endpoints.html

そもそもAWSでいうエンドポイントとは、AWSのサービスに対してアクセスするための必要なURLのようなものとの認識です。

RDSなどがそうですが、サービスによっては構築時にエンドポイントが作成され、エンドポイントに対して接続することでそのサービスを利用することができるようになります。

VPCエンドポイントは、例えばVPC内に配置されたECSやEC2などに構築されたサービスから、パブリックなインターネットを介すことなく他のAWSサービスに対してアクセスを行うために用いられます。
これによってVPC内のリソースから安全かつ高速なアクセスを提供することができます。

実際のところAWS内でインターネットゲートウェイを介してサービスを呼出す際は、パブリックなネットワークを経由せずに、AWSネットワーク内にとどまるため、料金もかかりません。
(VPN経由でAWSサービスにアクセスした場合は転送量がかかる)

しかし、その制御はあくまでAWS側でやってくれているのであって明示的なものではなく、VPCエンドポイントを作成せずにアクセスするにはインターネットゲートウェイなどを必要とします。

タイプとしては3つある

  • ゲートウェイ型
  • インターフェース型
  • Gateway Load Balancer型

ゲートウェイ型は初期に導入されたエンドポイントで、S3とDynamoDBのみが対応しています。
それ以降のエンドポイントはインターフェース型で提供されており、S3のみゲートウェイ型とインターフェース型の両方に対応しています。

Gateway Load Balancerエンドポイントは、セキュリティサービスであるGateway Load Balancerを用いてセキュリティ検査を行う際、トラフィックをインターセプトするために用いられるため、他の二つのエンドポイントとは基本的に異なるものと考えています。

S3をのぞいたサービスに関しては、ゲートウェイエンドポイントとインターフェースエンドポイントの二つで選択肢はないですが、S3の場合にはどちらを用いるのか、その違いを把握しておく必要があります。

ゲートウェイエンドポイントとインターフェースエンドポイントの違い

ゲートウェイエンドポイントを用いる場合、利用者はサービスのグローバルIPを用いてサービスに対してアクセスをします。

この時、エンドポイントの設定が完了すると、VPCルートテーブルにゲートウェイへのルートが追加され、その先はAWS側でうまいこと処理されてサービスに届きます。

それと引き換え、インターフェースエンドポイントでは、VPC内にサービスアクセス用のENI(ElasticNetworkInterface)が作成され、サービス利用者はそのプライベートIPに対してアクセスをするという形をとります。

また、インターフェースエンドポイントに対してセキュリティグループを設定することが可能なので、細かいコントロールをしたい場合には有効かもしれません。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/privatelink-interface-endpoints.html#types-of-vpc-endpoints-for-s3

インターフェースエンドポイントはゲートウェイエンドポイントの拡張であり、互換性を持ち、同じVPC内にこれら二つのエンドポイントを用いることができます。

注意しなければならないのは、インターフェースエンドポイントは時間当たりの料金と、インターフェースを介した通信トラフィックは課金対象となる点です。

インターフェースエンドポイントはサービスごとに用意する必要が生じるため、増えれば増えるほど料金が増すので、本当にトラフィックをプライベートにする必要があるのかは検討が必要そうです。

ゲートウェイエンドポイントに関しては課金対象とならないためそれら違いを理解したうえで利用する必要があります

S3インターフェースエンドポイントに対するオンプレミスからのアクセス

オンプレミスからのアクセスといっても、VPNやDirectConnectを利用した際の話。

この時、PrivateNetwork経由でS3へアクセスするためにインターフェースエンドポイントを利用することができるというもの

最近のアップデート

オンプレミスからのS3プライベートリンク

Amazon S3 simplifies private connectivity from on-premises networks
https://aws.amazon.com/jp/about-aws/whats-new/2023/03/amazon-s3-private-connectivity-on-premises-networks/

VPCエンドポイントのインターフェースエンドポイントにて、プライベートDNSオプションが利用可能になったとのこと。

マルチリージョンアクセスポイント

VPCエンドポイントがVPC内からのアクセスに対するエンドポイントを提供するのに対して、複数のリージョン間でレプリケートされたS3を一番近いロケーションに対してルーティングするためのグローバルエンドポイントを提供するのがマルチリージョンアクセスポイント。

この機能に対して、クロスアカウントでレプリケートされたものも対象とする更新が行われたとアナウンスがあった

Announcing cross-account support for Amazon S3 Multi-Region Access Points
https://aws.amazon.com/jp/about-aws/whats-new/2023/03/cross-account-support-amazon-s3-multi-region-access-points/

ただ、このアナウンスで何が変わったのかがいまいち理解できていない。
手順としては、クロスアカウントでパーミッションを与えてレプリケーションを可能にし、その後にマルチリージョンアクセスポイントを設定するような流れなので、どのあたりが新規にサポートされた部分なんだろうか?

参考

DirectConnectからS3に直結!「AWS PrivateLink for Amazon S3」を試してみたhttps://dev.classmethod.jp/articles/privatelink-for-amazon-s3/

「Amazon S3 インターフェースエンドポイント(PrivateLink)ではプライベート DNS をサポートしていません」 の意味を絵をかいて腹落ちさせてみたhttps://dev.classmethod.jp/articles/s3-privatelink-diagram/

Configuring replication when source and destination buckets are owned by different accounts
https://docs.aws.amazon.com/AmazonS3/latest/userguide/replication-walkthrough-2.html

Amazon S3 マルチリージョンアクセスポイント
https://aws.amazon.com/jp/s3/features/multi-region-access-points/

VPC エンドポイント
https://docs.aws.amazon.com/ja_jp/vpc/latest/privatelink/vpc-endpoints.html

Gateway Load Balancer エンドポイント (AWS PrivateLink)
https://docs.aws.amazon.com/ja_jp/vpc/latest/privatelink/vpce-gateway-load-balancer.html

Types of VPC endpoints for Amazon S3
https://docs.aws.amazon.com/AmazonS3/latest/userguide/privatelink-interface-endpoints.html#types-of-vpc-endpoints-for-s3

Gateway Load Balancer の使用開始方法
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/gateway/getting-started.html

2つのVPCエンドポイントの違いを知る
https://dev.classmethod.jp/articles/vpc-endpoint-gateway-type/

S3 Object Lambdaを触ってみる

AWSのBlogを見ていたら、こんな記事が

新着 – Amazon CloudFront で Amazon S3 Object Lambda を使用してエンドユーザーのためにコンテンツをカスタマイズする
https://aws.amazon.com/jp/blogs/news/new-use-amazon-s3-object-lambda-with-amazon-cloudfront-to-tailor-content-for-end-users/

AWSのサービスは多岐にわたっているけれど、いくつかのサービスは全く新しいものというよりは、既存のサービスの組み合わせで出来ていることもある。
今回紹介されているS3 Object Lambdaも名前からそうなんだろうと想像はついたんだけど、聞いたことはなかったので触ってみた

Amazon S3 Object Lambda

https://aws.amazon.com/jp/s3/features/object-lambda/

S3に配備されたファイルを取得したりする際に、前処理としてLambdaを走らせることができるというものらしい。

単純にS3格納時に処理してしまえばいいのでは?と思ったが、画像などを複数のアプリケーションで共用するケースには難しくなってしまう。
S3にはオリジナルを配備し、アプリケーションごとに必要な加工を施して提供するという場合には間にLambdaなどで処理を挟み込めれば楽だ。

それら用途を考えた際に、アクセスする経路を作るのがS3 Access PointでそこにLambdaを関連付けるのがObject Lambda Access Point。。。

言ってる意味はわかるがややこしくなってきそうだ

チュートリアル

Using Amazon S3 Object Lambda to Dynamically Watermark Images as They Are Retrieved
https://aws.amazon.com/jp/getting-started/hands-on/amazon-s3-object-lambda-to-dynamically-watermark-images/

Pythonで書かれたLambdaをS3 Get時に呼び出すことによって、ObjectLambda経由で呼び出された際には画像に対して文字を埋め込むというチュートリアル。

Lambda Layerがうまく関連づかなくてエラーになってしまったけど、マネージドコンソールで設定したら問題なく実施できた

今回のAWSブログで紹介されていたエイリアスももちろん確認。

CloudFrontまでは設定してはいないけれど、この機能周りに関しては少しは理解が進んだかな。

他のユースケース

今回は、画像に対して文字を埋め込むという内容だったけれど、元画像に対しての処理としてはサイズ変更や拡張子変更などのほうがユースケースとしては多そうだ。
もちろん、それらはクライアントサイドでもできるだろうけれど。

一方で、そのたびにLambdaが走るというのは積み重なると結構な金額になってしまわないのだろうか?は気になる。
利用目的がはっきりしているのであればやはり、S3格納時に処理をするべきだし、セキュリティ的な意味合いがないのであればこれらの処理に関してはクライアント側で処理することも選択肢の一つとして考えるべきだと思う。

Lambdaを逐次走らせるという利点を考えるのであれば、やはり動的な処理ということなんだろうな。
これじゃないとNGな処理に関しては何があるのか、気がついたらまた考えてみよう。