如何从互联网访问 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 access
是 off
。
给每个人阅读权限,在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 对象时的安全性。
起初,我用这个脚本制作了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 access
是 off
。
给每个人阅读权限,在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 对象时的安全性。