【问题标题】:Getting the error `Bucket name should not contain uppercase characters` when creating S3 buckets using serverless [closed]使用无服务器创建 S3 存储桶时出现错误“存储桶名称不应包含大写字符”[关闭]
【发布时间】:2020-12-30 13:42:30
【问题描述】:

我写了一个serverless.yml,在其中创建了3 个S3 存储桶资源。这是我必须完成的一些带回家的项目,它需要两个用于我必须处理的静态模板的存储桶和一个用于结果的存储桶。我正在定义 SQS,它成功地创建了队列,我能够从我的 lambda 向它发送消息并通过另一个 lambda 接收消息。

但是,定义 S3 存储桶资源给了我 An error occurred: S3LanguageTemplatesBucket - Bucket name should not contain uppercase characters.

我尝试对存储桶名称使用硬编码值,但没有帮助。

我的serverless.yml文件内容如下:

service: process-scores

org: osano

frameworkVersion: '2'

provider:
  name: aws
  runtime: nodejs12.x
  profile: serverless-admin
  region: us-east-1
  environment:
    SQS_URL: MyQueue
    S3_HTML_TEMPLATES: ${self:service}-html-templates-sf68N5umh8gC8yM4
    S3_LANGUAGE_TEMPLATES: ${self:service}-language-templates-gY9b7REadVPtKChV
    S3_STATIC_WEBSITE: '${self:service}-static-website-pD4c7M2297pjAmST'

functions:
  send:
    handler: scores/producer.send
    events:
      - http:
          path: scores
          method: post
          integration: lambda
          cors: true
    iamRoleStatements:
      - Effect: Allow
        Action:
          - "sqs:SendMessage"
          - "sqs:GetQueueUrl"
        Resource:
          Fn::GetAtt: [ MyQueue, Arn ]

  receive:
    handler: scores/consumer.receive
    events:
      - sqs:
          arn:
            Fn::GetAtt:
              - MyQueue
              - Arn
    iamRoleStatements:
      - Effect: Allow
        Action:
          - "s3:GetObject"
        Resource:
          - 'arn:aws:s3:::${self:provider.environment.S3_HTML_TEMPLATES}/*'
          - 'arn:aws:s3:::${self:provider.environment.S3_LANGUAGE_TEMPLATES}/*'
      - Effect: Allow
        Action:
          - "s3:PutObject"
        Resource:
          - 'arn:aws:s3:::${self:provider.environment.S3_STATIC_WEBSITE}/*'

resources:
  Resources:
    MyQueue:
      Type: "AWS::SQS::Queue"
      Properties:
        QueueName: "MyQueue"
    S3HTMLTemplatesBucket:
      Type: "AWS::S3::Bucket"
      Properties:
        BucketName: '${self:provider.environment.S3_HTML_TEMPLATES}'
    S3LanguageTemplatesBucket:
      Type: "AWS::S3::Bucket"
      Properties:
        BucketName: '${self:provider.environment.S3_LANGUAGE_TEMPLATES}'
    S3StaticWebsiteBucket:
      Type: "AWS::S3::Bucket"
      Properties:
        BucketName: '${self:provider.environment.S3_STATIC_WEBSITE}'

我不知道它是否有帮助,但我还在下面提供了生成的 cloudformation 模板的链接:

create-template

update-template

【问题讨论】:

  • S3_STATIC_WEBSITE 和其他环境变量的值是多少?
  • self:service 应该返回在文件顶部设置的 process-scores 值。然后在添加其余 S3_STATIC_WEBSITE 变量后应该等于 process-scores-static-website-pD4c7M2297pjAmST
  • 哦,天哪,我真笨。我知道命名规则,但出于某种原因,我什至没有注意到名称的最后一部分有大写字母。只是改变它并重新部署。一切都很顺利。谢谢!
  • 没问题。如果答案有帮助,我们将不胜感激。

标签: amazon-web-services amazon-s3 amazon-cloudformation serverless


【解决方案1】:

存储桶名称中的大写字母can't be used

存储桶名称只能由小写字母、数字、点 (.) 和连字符 (-) 组成。

因此而不是:

    S3_HTML_TEMPLATES: ${self:service}-html-templates-sf68N5umh8gC8yM4
    S3_LANGUAGE_TEMPLATES: ${self:service}-language-templates-gY9b7REadVPtKChV
    S3_STATIC_WEBSITE: '${self:service}-static-website-pD4c7M2297pjAmST'

你可以试试(只有小写字母):

    S3_HTML_TEMPLATES: ${self:service}-html-templates-sf68n5umh8gc8ym4
    S3_LANGUAGE_TEMPLATES: ${self:service}-language-templates-gy9b7readvptkchv
    S3_STATIC_WEBSITE: '${self:service}-static-website-pd4c7m2297pjamst'

【讨论】:

  • 要添加答案,请添加/ 以访问任何内部文件,如果连接任何文件名(如绝对路径中的文件名)。对我有帮助。
  • @kishore 嗨。你能举个例子吗?我不确定是否必须更新答案,因为它缺少/
  • 其实我也想过加个答案,但是不能。可能是因为,它(问题)已被标记为已关闭
猜你喜欢
  • 1970-01-01
  • 2020-07-16
  • 2018-09-07
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
相关资源
最近更新 更多