如何在S3 Bucket中特定文件写入时触发AWS事件规则?

4
我将尝试创建一个AWS事件(在CloudWatch或EventBridge中),当特定文件放入S3存储桶时,触发运行AWS Step Function。
以下是我的规则事件模式:
{
  "source": [
    "aws.s3"
  ],
  "detail-type": [
    "AWS API Call via CloudTrail"
  ],
  "detail": {
    "eventSource": [
      "s3.amazonaws.com"
    ],
    "eventName": [
      "PutObject"
    ],
    "requestParameters": {
      "bucketName": [
        "bucketname"
      ],
      "key": [
        "date={{TODAYS DATE}}/_SUCCESS"
      ]
    }
  }
}

我希望key元素能指向一个路径,其中TODAYS DATE表示当前日期,_SUCCESS是我的作业成功完成后打印到目录中的空文件(例如,如果今天是2019年10月31日,则要检查的完整bucket路径为bucketname/date=20191031/_SUCCESS)。最终目标是触发事件规则,引导一系列其他每日工作的步骤函数,这些工作只有在输出_SUCCESS文件的第一个作业成功完成后才能运行。
最好情况下,我想让key检查当天的_SUCCESS文件。但是,如果无法处理日期,如果有方法可以在新目录放入bucket时触发规则,则也应该能够使其有效(例如,在创建目录date=XXXXXX时触发)。我不能让触发器每次将任何新文件放入桶中都激活,因为初始作业将在date=XXXXXX目录中创建多个输出文件,这些文件用作以下作业的输入。
如果AWS CloudFormation可以通过某种方式处理这些问题并创建此规则,那将非常有帮助。
非常感谢你提供的帮助,十分感激。
1个回答

4
我不确定我是否理解您在此处尝试实现什么,但为什么不只是订阅 Lambda 函数到存储文件的存储桶(订阅 put 事件),在 Lambda 函数内部以编程方式执行任何种类的检查,并且如果满足所有条件,请从 Lambda 函数内部调用所提到的步骤函数。
如果未满足任何一个条件,则简单地不启动步骤函数。
以下是如何通过 Web 控制台将 Lambda 函数订阅到 S3 put 事件。
  1. 转到 S3
  2. 选择您的存储桶
  3. 进入 属性选项卡
  4. 选中 事件
  5. 检查 PUT 事件
  6. 发送到 下,选择 Lambda Function
  7. 选择现有 Lambda 函数(您需要创建该 Lambda 函数)
如何从 Lambda 函数中访问事件的属性,例如存储桶名称、对象键和时间戳。(使用 Python)
def handler_name(event, context): 
    // get bucket name
    print(event['Records'][0]['s3']['bucket']['name'])

    // get object key
    print(event['Records'][0]['s3']['object']['key'])

    // get event timestamp
    print(event['Records'][0]['eventTime'])

    return 0

以下是完整的S3事件对象(event对象)供参考。

{
  "Records": [
    {
      "eventVersion": "2.1",
      "eventSource": "aws:s3",
      "awsRegion": "us-east-2",
      "eventTime": "2019-09-03T19:37:27.192Z",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
        "principalId": "AWS:AIDAINPONIXQXHT3IKHL2"
      },
      "requestParameters": {
        "sourceIPAddress": "205.255.255.255"
      },
      "responseElements": {
        "x-amz-request-id": "D82B88E5F771F645",
        "x-amz-id-2": "vlR7PnpV2Ce81l0PRw6jlUpck7Jo5ZsQjryTjKlc5aLWGVHPZLj5NeC6qMa0emYBDXOo6QBU0Wo="
      },
      "s3": {
        "s3SchemaVersion": "1.0",
        "configurationId": "828aa6fc-f7b5-4305-8584-487c791949c1",
        "bucket": {
          "name": "lambda-artifacts-deafc19498e3f2df",
          "ownerIdentity": {
            "principalId": "A3I5XTEXAMAI3E"
          },
          "arn": "arn:aws:s3:::lambda-artifacts-deafc19498e3f2df"
        },
        "object": {
          "key": "b21b84d653bb07b05b1e6b33684dc11b",
          "size": 1305107,
          "eTag": "b21b84d653bb07b05b1e6b33684dc11b",
          "sequencer": "0C0F6F405D6ED209E1"
        }
      }
    }

  ]
}

如何在Lambda函数中执行Step Function(使用Python + Boto3)
import boto3

sfn_client = boto3.client('stepfunctions')

def handler_name(event, context): 

    response = sfn_client.start_execution(
        stateMachineArn='string',
        name='string',
        input='string'
    )

    return 0

其中stateMachineArn是要执行的状态机的Amazon资源名称(ARN),name(可选)是执行的名称,input是包含执行JSON输入数据的字符串。


订阅Lambda函数到Put事件是什么意思?是否有一种类似于CloudWatch事件的方式可以使用Lambda函数,使其不断监视S3存储桶中的某个位置,等待在满足适当条件时触发事件?此外,如何编写一个Lambda函数来监视Put事件或触发步骤函数?抱歉,我对此还比较陌生。 - mattc-7
是的,您可以通过CF来实现。S3存储桶具有一个名为“NotificationConfiguration”的属性,在其中您可以指定“LambdaConfiguration” - 事件类型(PUT)和要执行的Lambda函数。 - Matus Dubrava
我在使用AWS CloudFormation设置触发器的模板时遇到了问题(请参见我对主要问题的最近编辑)。在“Type:”行上,我一直收到“未识别的资源类型”错误,您知道这一行需要填写什么吗? - mattc-7
你应该撤销你所做的更改,然后重新提出一个新问题,因为我们将把原来的问题变成完全不适用于任何未来的访问者。但是简单回答你的问题,你做错了。配置是在CF中的S3存储桶下执行的,而不是在那个临时类型下执行。请参见https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3-bucket.html,在那里你可以找到上述类型以及如何使用它们。 - Matus Dubrava
为了更好地组织,我将我的后续问题分成了单独的一个问题。请在此处查看链接 https://stackoverflow.com/questions/58739265/set-up-s3-bucket-level-events-using-aws-cloudformation - mattc-7
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接