如何从互联网访问 S3 存储桶?

How can I access the S3 bucket from internet?

起初,我用这个脚本制作了S3 bucket。

const out_bk = new s3.Bucket(this, 'out-bk', { // image-resize用のbucket
  bucketName: s3_out_name,
  removalPolicy: RemovalPolicy.DESTROY,
  autoDeleteObjects: true,
  cors: [{
      allowedMethods: [
        s3.HttpMethods.GET,
        s3.HttpMethods.POST,
        s3.HttpMethods.PUT,
        s3.HttpMethods.DELETE,
        s3.HttpMethods.HEAD,
      ],
      allowedHeaders: ["*"],
      allowedOrigins: ["*"],
      exposedHeaders: ["ETag"],
      maxAge: 3000
    }]
});

const s3_out_name = "s3-my-out-name"

const out_bk = new s3.Bucket(this, 'cdk-st-out-bk', { 
  bucketName: s3_out_name,
  removalPolicy: RemovalPolicy.DESTROY,
  autoDeleteObjects: true,
  cors: [{
      allowedMethods: [
        s3.HttpMethods.GET,
        s3.HttpMethods.POST,
        s3.HttpMethods.PUT,
        s3.HttpMethods.DELETE,
        s3.HttpMethods.HEAD,
      ],
      allowedHeaders: ["*"],
      allowedOrigins: ["*"],
      exposedHeaders: ["ETag"],
      maxAge: 3000
    }]
});

const cfnAccessPoint = new s3.CfnAccessPoint(this, 'MyCfnAccessPoint', {
  bucket: s3_out_name,

  name: 's3-access-point',
  publicAccessBlockConfiguration: {
    blockPublicAcls: false,
    blockPublicPolicy: false,
    ignorePublicAcls: false,
    restrictPublicBuckets: false,
  },
});

至此S3和Access point创建成功

我打开aws控制台->S3->访问点->item

有一个这样的对象URL,

https://s3-access-point-69853XXXXXX.s3-accesspoint.ap-northeast-1.amazonaws.com/1040

从浏览器访问这里时。

出现这个错误,跟授权有关。

我想在未经授权的情况下从浏览器访问它。

我该如何解决这个问题?

<Error>
<script/>
<Code>InvalidRequest</Code>
<Message>The authorization mechanism you have provided is not supported. Please use Signature Version 4.</Message>
<RequestId>YVMHMBJP2D4WDJAK</RequestId>
<HostId>yLesp53LUmB7/rMHkZMAwcMej37WRQOKnbWI4vwhh3xCKY1t60eDd1YiJ+4xRAw3kYWjlI1Csnw=</HostId>
</Error>

我正在尝试在没有 Access Point

的情况下访问

我的 block public accessoff

给每个人阅读权限,在ACL上列出。

然后通过浏览器访问对象URL

但还是报错

<Error>
<script/>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>Y6DPF5RWZ59DTQJD</RequestId>
<HostId>9pXKB5EDTmE6t9AJvwyTQHtyCMokeETw9yR+BFF4JdfDZ0NbfMf3TX1+VzrrJlfULBQOUtaTNM8=</HostId>
</Error>

Amazon S3 中的对象默认是私有的。

如果您想让对象无需用户身份验证即可访问,那么最简单的方法是向存储桶添加存储桶策略

这是 Bucket policy examples - Amazon Simple Storage Service 中的一个示例,它构成了整个桶 public:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicRead",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::BUCKETNAME/*"
            ]
        }
    ]
}

注意:在添加存储桶策略之前,您需要转到存储桶的权限并关闭 S3 块 Public 访问 .

如果您不想制作整个桶 public,您可以使用 制作 Public 制作特定对象 public S3 管理控制台中的选项,或使用 --acl public-read 上传文件。使用 ACL 将 需要停用 S3 块 Public 访问权限。

无论哪种方式,该对象都可以通过 'anonymous' URL 访问,例如:

https://BUCKETNAME.s3.ap-southeast-2.amazonaws.com/foo.jpg

S3 访问点不需要来授予对对象的访问权限。它用于控制从 VPC 访问 S3 对象时的安全性。