【问题标题】:Error Code: 403 Forbidden when submitting app to serverless application repository错误代码:将应用程序提交到无服务器应用程序存储库时出现 403 Forbidden
【发布时间】: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 账户的身份验证?听起来您没有权限在您使用的帐户上发布服务。
  • 是的,我已登录帐户
  • 嗯。那么除非您使用的帐户已被限制并且不允许执行该功能,否则我不知道。对不起。

标签: amazon-web-services amazon-s3


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案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。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      猜你喜欢
      • 2020-12-22
      • 1970-01-01
      • 2017-08-30
      • 2019-06-09
      • 2012-08-28
      • 1970-01-01
      • 2018-05-24
      • 2018-04-12
      • 2012-03-04
      相关资源
      最近更新 更多