LoginSignup
2
3

More than 5 years have passed since last update.

proxy経由でs3 endpoint

Posted at

前提

  • 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秒で見つける。
  • ありがたや

再試行

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3