前提
- 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つけてうまく行ったのは何故なのかは、後で調べようきっときっと。
 
					