前提
- EC2インスタンス(A)とEC2インスタンス(B)が存在する
- それぞれのインスタンスが稼動するサブネットはs3への通信をvpcendpointに流すようルーティング済み
- s3のバケットポリシーでvpcendpoint以外のアクセスは拒否
- EC2インスタンス(A)はHTTP,HTTPSプロキシとしてEC2インスタンス(B)の方を向いている
疑問
- Proxyを有効にした状態でEC2インスタンス(A)からs3にaws cliを利用してputする場合どうなるか。
予測
- vpcendpointへのルーティングはVPC内の全サブネットで有効
- なのでインスタンス(A)からインスタンス(B)に入っても結局ルーティング的にはvpcendpointに向かいそう
- 大丈夫じゃないかな
実証
環境
インスタンス(A):AmazonLinux2
インスタンス(B):AmazonLinux2+Squid
セットアップ
インスタンス(B)
- squidをセットアップ
yum install squid -y
systemctl enable squid
systemctl start squid
netstat -anp | grep 3128
インスタンス(A)
- AmazonLinuxを使用している為、aws cliはセットアップ済み
- 以下のポリシーを持つEC2ロールを付与
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::{BucketName}"
]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::{BucketName}/*"
]
}
]
}
s3 バケットポリシー
- バケットポリシーは上記VPCで持つS3エンドポイントからのアクセスだけ許可
{
"Version": "2012-10-17",
"Id": "test",
"Statement": [
{
"Sid": "test",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::{BucketName}",
"arn:aws:s3:::{BucketName}/*"
],
"Condition": {
"StringNotEquals": {
"aws:sourceVpce": "{s3vpcendpoint-id}"
}
}
}
]
}
実行
- 実行
- ショック
[root@ip-10-1-0-197 ~]# aws s3 cp ./test s3://{BucketName} --region ap-northeast-1 --output json
upload failed: ./test to s3://{BucketName}/test Unable to locate credentials
[root@ip-10-1-0-197 ~]#
- 試しに以下のポリシーを持つEC2ロールをインスタンス(B)にも付与
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::{BucketName}"
]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::{BucketName}/*"
]
}
]
}
再実行
- 何で通るねん
[root@ip-10-1-0-197 ~]# aws s3 cp ./test s3://{BucketName} --region ap-northeast-1 --output json
upload: ./test to s3://{BucketName}/test
[root@ip-10-1-0-197 ~]#
調査
- どう考えてもおかしい
- というか、そもそも切り分けのアプローチの仕方もどうかと思う。
- 事例を調べる
事例
- ぴったりのを3秒で見つける。
- ありがたや
https://qiita.com/TK1989/items/3635a619b9a7ae429c64
再試行
- EC2インスタンス(B)のロールを外す
- EC2インスタンス(A)でメタデータアクセス用IPについてProxy設定をはずす
export NO_PROXY=169.254.169.254
- 再実行->OK
[root@ip-10-1-0-197 ~]# aws s3 cp ./test s3://{BucketName} --region ap-northeast-1 --output json
upload: ./test to s3://{BucketName}/test
[root@ip-10-1-0-197 ~]#
まとめ
- 前提って大事
- Endpointの話というかProxy配下でEC2Roleを利用した時の話になってる気がする。
- EC2インスタンス(B)にインスタンス(A)と同じRoleつけてうまく行ったのは何故なのかは、後で調べようきっときっと。