VPC エンドポイント経由で S3 へアクセスする時の注意点

2017.07.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、菅野です。
先日、Amazon Linux と Windows Server 2016 で AWS CLI の挙動が異なっている事に気付いたのでその現象の説明と対処法について書いておきます。

はじめに

VPC エンドポイント、皆さんは活用されていますでしょうか。
現在では S3 との接続と、一部リージョンですが DynamoDB(プレビュー) への接続が用意されています。

VPC エンドポイントを使うメリット

VPC エンドポイントを使うことにより、EC2 から S3 へ接続する際にインターネットゲートウェイや NAT ゲートウェイが不要となります。
「プライベート環境だけど S3 は使いたい」という時に必要なサービスです。
利用する時は、VPC エンドポイントは目的の S3 バケットと同じリージョンで作成しましょう。

今回の検証環境

  • パブリック IP を持たない Amazon Linux の EC2 と Windows Server 2016 の EC2 をインターネットへの通信ができないプライベートサブネット内に用意
  • それぞれの EC2 には S3 バケット「sugano-policy-test」への Full Access を許可する IAM Role を付与
  • それぞれの EC2 で「aws configure」は実行していません(クレデンシャルは IAM Role のみ)
  • SSH や RDP で接続するための踏み台(Bastion)サーバーをパブリックサブネットに設置
  • 東京リージョンの s3 バケットなので、東京リージョンの VPC エンドポイントを設置

構成図

検証(1-1)- Amazon Linux の場合

  • sugano-policy-test バケットの中身のリストを取得しています。
  • 結果として「new」と「new2」の二つのフォルダが表示されました。
$ aws s3 ls s3://sugano-policy-test/
                           PRE new/
                           PRE new2/
$

検証(1-2)- Windows Server 2016 の場合

  • sugano-policy-test バケットの中身のリストを取得しています。
  • Amazon Linux と全く同じコマンドですが、S3 へ接続に失敗しました。
C:\Users\Administrator>aws s3 ls s3://sugano-policy-test/

('Connection aborted.', error(10060, 'A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond'))

C:\Users\Administrator>

検証(2-1)- Amazon Linux の場合(リージョン指定有り)

  • 東京リージョンの指定を追加しました。
  • 当然ですが、リージョン指定有りでも問題なくバケットの中身のリストが取得できました。
$ aws s3 ls --region ap-northeast-1 s3://sugano-policy-test/
                           PRE new/
                           PRE new2/
$

検証(2-2)- Windows Server 2016 の場合(リージョン指定有り)

  • 東京リージョンの指定を追加しました。
  • リージョン指定により、バケットの中身のリストを取得できました。
C:\Users\Administrator>aws s3 ls --region ap-northeast-1 s3://sugano-policy-test/
                           PRE new/
                           PRE new2/

C:\Users\Administrator>

検証(3-1)- Amazon Linux の場合(間違ったリージョン指定有り)

  • バージニアリージョンの指定を追加しました。
  • 間違ったリージョン指定なのにバケットの中身のリストが取得できました。
$ aws s3 ls --region us-east-1 s3://sugano-policy-test/
                           PRE new/
                           PRE new2/
$

検証(3-2)- Windows Server 2016 の場合(間違ったリージョン指定有り)

  • バージニアリージョンの指定を追加しました。
  • リージョン指定が間違っているため、S3 への接続に失敗しました。
C:\Users\Administrator>aws s3 ls --region us-east-1 s3://sugano-policy-test/

('Connection aborted.', error(10060, 'A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond'))

C:\Users\Administrator>

検証結果について

Amazon Linux の場合

  • リージョン指定は有っても無くても間違っていても関係ありません

Windows Server 2016 の場合

  • リージョン指定が必要です
  • リージョンが間違っていると S3 にアクセスできません

まとめ

VPC エンドポイント の有無に関わらず、また OS に関わらず「aws s3 〜」 というコマンドを使う時は必ず「--region 〜」オプションでバケットのリージョンを指定しましょう。
常にリージョン指定を付けていれば環境や OS に左右されませんし、急に VPC エンドポイントを使うことになっても今回の問題を気にする必要はありません。

さいごに

今回の内容は、実際にお客様の環境で発生した現象となります。
同様の現象でお悩みの方や、エラーコード「10060」で検索しても英語のページしか出てこないとお嘆きの方のお力になれれば幸いです。

参考ページ

これらのページを参考にさせていただきました。
ありがとうございました。
Amazon S3 におけるエンドポイント