前提

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