はじめに
EC2からS3を利用しようとaws s3 lsを打つも、反応がなかった際の調査ログを記載します。尚、EC2はプライベートサブネットに存在し、インターネットへの経路はなくS3のVPCエンドポイントは作成済みとします。
環境情報
- aws-cli/2.15.5
調査の流れ
同事象が起きた場合、一番怪しいのはS3のVPCエンドポイントがEC2のルートテーブルに紐づいていない状態となっています。
リージョンを指定してS3のエンドポイントを指定して出力すると
$ aws ec2 describe-vpc-endpoints --filters "Name=service-name,Values=com.amazonaws.ap-northeast-1.s3"
RouteTableIdsにて紐づいているルートテーブルの情報が表示されます。
{
"VpcEndpoints": [
{
"VpcEndpointId": "vpce-xx",
"VpcEndpointType": "Gateway",
"VpcId": "vpc-xx",
"ServiceName": "com.amazonaws.ap-northeast-1.s3",
"State": "available",
...
"RouteTableIds": [
"rtb-xx"
],次は該当のEC2のルートテーブルを特定するため、インスタンスIDを指定してまずはサブネット情報を取得。
$ aws ec2 describe-instances --instance-ids i-xx --query 'Reservations[].Instances[].SubnetId' --output text subnet-xx
そのサブネット情報を用いてルートテーブルを検索することで、EC2が利用しているルートテーブルが表示されました。
$ aws ec2 describe-route-tables --filters "Name=association.subnet-id,Values=subnet-xx" --query 'RouteTables[].RouteTableId' --output text rtb-xx
ここに上で出力したS3のVPCエンドポイントと比較を行い、表示されていない場合はVPCエンドポイントにルートテーブルを登録。そうすると下記コマンドでEC2が利用しているルートテーブルが表示されます。
$ aws ec2 describe-vpc-endpoints --filters "Name=service-name,Values=com.amazonaws.ap-northeast-1.s3"
{
"VpcEndpoints": [
{
"VpcEndpointId": "vpce-xx",
"VpcEndpointType": "Gateway",
"VpcId": "vpc-xx",
"ServiceName": "com.amazonaws.ap-northeast-1.s3",
"State": "available",
..
"RouteTableIds": [
"rtb-xx",
"rtb-xx"
],
...
終わりに
CUIをベースにしたルートテーブルを確認する流れとなります。実際、ルートテーブルを登録することでEC2からs3コマンドが通るようになりました。
以上、ご参考になれば幸いです。