Как импортировать существующую корзину S3, экспортированную стеком, в другой стек через CloudFormation YAML - PullRequest
0 голосов
/ 28 мая 2020

Работает что-то вроде следующего CloudformationYAML. В итоге я получаю лямбда-функцию, которая запускается всякий раз, когда в корзине S3 появляется новый объект.

Resources:
  myS3BucketResource:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref myS3BucketName
      AccessControl: Private
      VersioningConfiguration:
        Status: Enabled

LambdaFunction:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: main.handler
      CodeUri:
        Bucket: !Ref CodeBucketName
        Key: !Ref CodeKey
      Role: !GetAtt
        - LambdaRole
        - Arn
      Runtime: nodejs12.x
      Timeout: !Ref LambdaTimeOut
      MemorySize: !Ref LambdaMemory
      FunctionName: !Sub '${Environment}-${FunctionName}'
      Events:
        S3Event:
          Type: S3
          Properties:
            Bucket: !Ref myS3BucketResource
            Events: 
              - 's3:ObjectCreated:Put'

Однако мне нужно, чтобы лямбда-функция использовала уже существующую корзину S3, который был создан другим стеком. Обратите внимание, что в приведенном выше примере сегмент S3 создается тем же шаблоном CF, который также создает лямбду.

Кажется, я не могу просто сослаться на имя сегмента S3 в свойстве Bucket объекта S3Event, как показано ниже:

      Events:
        S3Event:
          Type: S3
          Properties:
            Bucket: !Ref myS3BucketName
            Events: 
              - 's3:ObjectCreated:Put'

Итак, я думаю, это потому, что он должен быть ресурсом, а не строкой, по крайней мере, на основе приведенного выше шаблона CF, который работает.

Я читал около Fn::ImportValue для импорта чего-то, что было экспортировано из другого стека - это относится к ведру S3, которое мне нужно использовать. Но я не мог понять, как это указать в шаблоне CF.

Пытался, например, ниже, но не работает. Без строки Type: AWS::S3::Bucket.

Resources:
  myS3BucketResource:
    Type: AWS::S3::Bucket
    Properties:
      Bucket:
        Fn::ImportValue: !Sub "${exportedS3Bucket}"

Любой ход будет оценен по достоинству. Если есть способ указать Bucket без прохождения маршрута импорта, тогда это действительно будет лучше.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Нашел это AWS do c => https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-s3.html

Вот это:

Bucket
S3 bucket name. This bucket must exist in the same template.

Type: String

Required: Yes

AWS CloudFormation Compatibility: This property is similar to the BucketName property of an AWS::S3::Bucket. This is a required field in SAM. This field only accepts a reference to the S3 bucket created in this template

И этот пример YAML:

Events:
  S3Event:
    Type: S3
    Properties:
      Bucket:
        Ref: ImagesBucket     # This must be the name of an S3 bucket declared in the same template file
      Events: s3:ObjectCreated:*
      Filter:
        S3Key:
          Rules:
          - Name: prefix      # or "suffix"
            Value: value      # The value to search for in the S3 object key names

Комментарий к YAML указывает, что сегмент S3 должен быть «объявлен в том же файле шаблона». Хотя бит около AWS CloudFormation Compatibility: в разделе Bucket указывает «Это поле принимает только ссылку на корзину S3, созданную в этом шаблоне».

Если только это AWS do c не требует обновления, Не похоже, что есть способ добавить триггер события Lambda, используя существующую корзину S3 через CF. И это не сулит ничего хорошего для моего варианта использования.

0 голосов
/ 28 мая 2020

Однако мне нужно, чтобы лямбда-функция использовала уже существующее ведро S3, которое было создано другим стеком.

Предполагается, что у меня есть контроль над * стек ведра, вы можете экспортировать , чтобы он был виден в других стеках, чтобы они могли быть импортированы в них. Вы правильно указали, что уже .

Поскольку вы не предоставили код для стека ведра, который экспортирует свои выходные данные, я должен основывать свой ответ на примере . В примере обратите внимание на использование exportedBucket name.

стек корзины :

Resources:
  myS3BucketResource:
    Type: AWS::S3::Bucket

Outputs:
  Name: 
    Value: !Ref myS3BucketResource
    Export:
      Name: exportedBucket  # <---- export bucket

стек лямбда , который будет использовать форму корзины стек ведра:

LambdaFunction:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: main.handler
      CodeUri:
        Bucket: !Ref CodeBucketName
        Key: !Ref CodeKey
      Role: !GetAtt
        - LambdaRole
        - Arn
      Runtime: nodejs12.x
      Timeout: !Ref LambdaTimeOut
      MemorySize: !Ref LambdaMemory
      FunctionName: !Sub '${Environment}-${FunctionName}'
      Events:
        S3Event:
          Type: S3
          Properties:
            Bucket: !ImportValue exportedBucket  # <---- import bucket
            Events: 
              - 's3:ObjectCreated:Put'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...