使用无服务器创建 S3 存储桶时出现“存储桶名称不应包含大写字符”错误

Getting the error `Bucket name should not contain uppercase characters` when creating S3 buckets using serverless

我写了一个 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

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

Bucket names can consist only of lowercase letters, numbers, dots (.), and hyphens (-).

因此代替:

    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'