我正在尝试将应用程序发布到无服务器应用程序存储库,但是选择“ template.yml”文件时出现错误:
禁止访问(服务:Amazon S3;状态代码:403;错误代码:403 禁止要求编号:XXXXXXXXXXXXXX; S3扩展请求ID: XXXXXXXXXXXXXXXXX)
这是我的“ template.yml”:
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Resources:
DataScraper:
Type: 'AWS::Serverless::Function'
Properties:
Handler: data_scraper.handler
Runtime: python3.6
CodeUri:
Bucket: ht-helpbot
Key: data_scraper.zip
Version: 1.0
CodeUri: 's3://ht-helpbot/data_scraper.zip'
Policies:
- DynamoDBCrudPolicy:
TableName: HTServiceProviderTable
FindService:
Type: 'AWS::Serverless::Function'
Properties:
Handler: find_service.handler
Runtime: python3.6
CodeUri: 's3://ht-helpbot/find_service.zip'
Policies:
- DynamoDBCrudPolicy:
TableName: HTServiceProviderTable
答案 0 :(得分:3)
为了能够使用无服务器应用程序存储库(serverlessrepo)发布应用程序,serverlessrepo需要能够在打包应用程序期间读取上载到S3的S3工件。
如Publishing Applications中所述,提供这些权限的标准方法是向GetObject
的{{1}}提供存储桶上的资源策略,例如以下示例,其中serverlessrepo
将替换为您的S3存储桶的名称。
<your-bucket-name>
它在you made your bucket public时开始工作的原因是因为这样做,您使该存储桶中的对象(包括来自打包世界的工件)变得可读,包括{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "serverlessrepo.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::<your-bucket-name>/*"
}
]
}
服务。在Access Control Lists文档中已指出,此方法有效:
如果您将存储桶公开(不建议使用),则任何未经身份验证的用户都可以将对象上传到存储桶。
答案 1 :(得分:2)
我通过为我的存储桶输入以下策略来解决此问题:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "serverlessrepo.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::BUCKET_NAME/*"
}
]
}
其中BUCKET_NAME
是我的存储桶的名称。
请回答此问题,并使用大量的NaCl,因为我不太了解AWS权限。
仅向我的S3存储桶授予公共READ访问权限对我不起作用(就像对@harry一样)。另外,我还必须包括sam deploy
构建的packaged.yaml模板-它包含完整的S3 URL。
答案 2 :(得分:0)
我必须授予对我的S3存储桶和对象的公共读取访问权限,才能使其工作。