使用无服务器框架如何使用 Cloud Watch 事件记录 Amazon S3 对象级操作
Using Serverless Framework how to Logging Amazon S3 Object-Level operation using Cloud Watch events
我有一个 S3 资源,我可以在上面放置和删除对象。这些操作是客户端操作,这意味着这些操作不涉及 lambda 函数。后端是使用无服务器创建的。
这里是 serverless.yml
中 resource 键下的 S3 资源
resources:
Resources:
AttachmentsBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: ${self:provider.environment.PROJECTS_S3_BUCKET}
CorsConfiguration:
CorsRules:
- AllowedOrigins:
- '*'
AllowedHeaders:
- '*'
AllowedMethods:
- GET
- PUT
- POST
- DELETE
- HEAD
MaxAge: 3000
BucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref AttachmentsBucket
PolicyDocument:
Id: MyPolicy
Version: "2012-10-17"
Statement:
- Sid: PublicReadWriteBucketPolicy
Effect: Allow
Principal: '*'
Action:
- 's3:GetObject'
- 's3:PutObject'
Resource: 'arn:aws:s3:::${self:provider.environment.PROJECTS_S3_BUCKET}/*'
我需要使用 Cloudwatch 事件(PUT 和 DELETE 对象)记录 Amazon S3 对象级操作,以便以后可以使用这些日志(作为 Step 函数的来源)
有人可以告诉我如何在无服务器框架中使用 CloudWatch 事件记录 Amazon S3 对象级操作吗?
BR
我以前用过这里描述的方法:https://docs.aws.amazon.com/eventbridge/latest/userguide/log-s3-data-events.html
简而言之,您启用 Cloudtrail,将 Eventbridge 配置为 match/filter 您感兴趣的 S3 资源和操作,然后使用 Lambda 记录那些特定事件,或者可以触发其他操作。
使用无服务器框架的最快方法可能是将 lambda 函数连接到 s3 事件流,如 here 所述。
那么我想您可以只写入 cloudwatch(使用 console.log)- 但跳过 cloudwatch 并使用此 lambda 函数触发您的步骤函数可能会更简单。
serverless.yml 文件应如下所示(从下面获取的其他上下文):
imagewasuploadedevent:
handler: src/stepfunctions/imageWasUploadedEvent.handler
events:
- s3:
bucket: !Ref AttachmentsBucket
existing: true
@Aaton Stuyvenberg 指出的 link 上面解释了解决方案
我们需要声明存储桶存在
该事件将是 S3 事件,函数的定义应为
imagewasuploadedevent:
handler: src/stepfunctions/imageWasUploadedEvent.handler
events:
- s3:
bucket: !Ref AttachmentsBucket
existing: true
key existing: true 表示没有创建新的bucket
有关此的更多信息,请参见此处
Serverless Framework Documentation
我有一个 S3 资源,我可以在上面放置和删除对象。这些操作是客户端操作,这意味着这些操作不涉及 lambda 函数。后端是使用无服务器创建的。
这里是 serverless.yml
中 resource 键下的 S3 资源resources:
Resources:
AttachmentsBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: ${self:provider.environment.PROJECTS_S3_BUCKET}
CorsConfiguration:
CorsRules:
- AllowedOrigins:
- '*'
AllowedHeaders:
- '*'
AllowedMethods:
- GET
- PUT
- POST
- DELETE
- HEAD
MaxAge: 3000
BucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref AttachmentsBucket
PolicyDocument:
Id: MyPolicy
Version: "2012-10-17"
Statement:
- Sid: PublicReadWriteBucketPolicy
Effect: Allow
Principal: '*'
Action:
- 's3:GetObject'
- 's3:PutObject'
Resource: 'arn:aws:s3:::${self:provider.environment.PROJECTS_S3_BUCKET}/*'
我需要使用 Cloudwatch 事件(PUT 和 DELETE 对象)记录 Amazon S3 对象级操作,以便以后可以使用这些日志(作为 Step 函数的来源)
有人可以告诉我如何在无服务器框架中使用 CloudWatch 事件记录 Amazon S3 对象级操作吗?
BR
我以前用过这里描述的方法:https://docs.aws.amazon.com/eventbridge/latest/userguide/log-s3-data-events.html
简而言之,您启用 Cloudtrail,将 Eventbridge 配置为 match/filter 您感兴趣的 S3 资源和操作,然后使用 Lambda 记录那些特定事件,或者可以触发其他操作。
使用无服务器框架的最快方法可能是将 lambda 函数连接到 s3 事件流,如 here 所述。
那么我想您可以只写入 cloudwatch(使用 console.log)- 但跳过 cloudwatch 并使用此 lambda 函数触发您的步骤函数可能会更简单。
serverless.yml 文件应如下所示(从下面获取的其他上下文):
imagewasuploadedevent:
handler: src/stepfunctions/imageWasUploadedEvent.handler
events:
- s3:
bucket: !Ref AttachmentsBucket
existing: true
@Aaton Stuyvenberg 指出的 link 上面解释了解决方案
我们需要声明存储桶存在 该事件将是 S3 事件,函数的定义应为
imagewasuploadedevent:
handler: src/stepfunctions/imageWasUploadedEvent.handler
events:
- s3:
bucket: !Ref AttachmentsBucket
existing: true
key existing: true 表示没有创建新的bucket 有关此的更多信息,请参见此处 Serverless Framework Documentation