proxy経由でs3 endpoint

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