错误代码:将应用程序提交到无服务器应用程序存储库时出现 403 Forbidden

Posted

技术标签:

【中文标题】错误代码:将应用程序提交到无服务器应用程序存储库时出现 403 Forbidden【英文标题】:Error Code: 403 Forbidden when submitting app to serverless application repository 【发布时间】:2019-03-11 18:36:29 【问题描述】:

我正在尝试将我的应用程序发布到无服务器应用程序存储库,但是当我选择我的“template.yml”文件时出现错误:

禁止(服务:Amazon S3;状态代码:403;错误代码:403 禁止;请求编号:XXXXXXXXXXXXXX; S3 扩展请求 ID: XXXXXXXXXXXXXXXXXX)

这是我的“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

【问题讨论】:

您是否已通过 AWS 账户的身份验证?听起来您没有权限在您使用的帐户上发布服务。 是的,我已登录帐户 嗯。那么除非您使用的帐户已被限制并且不允许执行该功能,否则我不知道。对不起。 【参考方案1】:

为了能够使用无服务器应用程序存储库 (serverles-s-repo) 发布应用程序,serverles-s-repo 需要能够读取在打包应用程序期间上传到 S3 的 S3 工件。

如Publishing Applications 中所述,提供这些权限的标准方法是向serverles-s-repo 提供GetObject,并在您的存储桶上使用资源策略,例如以下示例,其中<your-bucket-name> 将被替换以您的 S3 存储桶的名称命名。


    "Version": "2012-10-17",
    "Statement": [
        
            "Effect": "Allow",
            "Principal": 
                "Service":  "serverles-s-repo.amazonaws.com"
            ,
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::<your-bucket-name>/*"
        
    ]

它在you made your bucket public 开始工作的原因是因为这样做,您使该存储桶中的对象,包括来自包装世界的工件可读,包括serverles-s-repo 服务。正如Access Control Lists 文档中所指出的那样,虽然这有效:

如果您将存储桶公开(不推荐),任何未经身份验证的用户都可以将对象上传到存储桶。

【讨论】:

【参考方案2】:

我通过为我的存储桶创建输入以下策略解决了这个问题:


    "Version": "2012-10-17",
    "Statement": [
        
            "Effect": "Allow",
            "Principal": 
                "Service": "serverles-s-repo.amazonaws.com"
            ,
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::BUCKET_NAME/*"
        
    ]

BUCKET_NAME 是我的存储桶的名称。

请用大量的 NaCl 来回答这个问题,因为我不是很了解 AWS 权限。

仅仅授予对我的 S3 存储桶的公共 READ 访问权限对我不起作用(就像对 @harry 所做的那样)。我还必须包含 sam deploy 构建的 packaged.yaml 模板——它包含完整的 S3 URL。

【讨论】:

【参考方案3】:

我必须授予对我的 S3 存储桶和对象的公共读取访问权限才能使其工作。

【讨论】:

不是推荐的方法——参见上面@jamie Starke 的解释:***.com/a/52685172/2317829

以上是关于错误代码:将应用程序提交到无服务器应用程序存储库时出现 403 Forbidden的主要内容,如果未能解决你的问题,请参考以下文章

通过 FTP 将文件添加到 git 存储库时,在脚本中使用 inotifywait 自动执行 git 提交

当我的同事更改代码并将其提交到存储库时,我可以看到代码,但 xCode 编译时就好像他的贡献不存在一样

推送到 git 存储库时避免自动工作项链接

将浮点值存储到无符号字符数组

将 AWS::Route53::RecordSet DnsRecord 添加到无服务器 Cloudfront Distribution

svn 奇怪的行为:导入 svn 存储库时永远挂在单个文件上