Работает что-то вроде следующего 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
без прохождения маршрута импорта, тогда это действительно будет лучше.
Спасибо!