Lambda 및 StepFunction을 호출하는 EventBridge 규칙

AWS EventBridge는 게시/구독 패턴에서 다양한 서비스와 리소스를 느슨하게 결합하기 위한 이벤트 버스 시스템입니다. 서비스는 이벤트(예: 메시지)를 게시할 수 있으며 여러 다른 서비스가 해당 이벤트를 구독할 수 있습니다.

구독 메커니즘은 이벤트 버스에서 포착할 이벤트의 패턴을 정의하고 해당 이벤트에서 호출할 여러 대상을 정의하는 개별 규칙을 통해 수행됩니다. Lambda 함수 또는 StepFunction 상태 시스템.

동기 부여



이 게시물은 규칙을 사용하여 이 두 서비스를 호출하는 방법과 그 과정에서 일반적인 인증 문제를 처리하는 방법에 대한 청사진 역할을 하기 위한 것입니다. 필요한 리소스는 JSON의 CloudFormation 템플릿으로 정의되지만 YAML로 쉽게 변환할 수 있습니다.

각각의 EventBridge 규칙에 의해 호출될 테스트 Lambda 함수와 테스트 StepFunction 상태 시스템을 생성했습니다. CloudFormation에서 이러한 리소스를 TestLambdaFunctionTestStateMachine 로 참조하지만 이는 논리적 ID일 뿐이며 배포 시 ARN으로 대체됩니다.

StepFunction 상태 머신 호출



이 CloudFormation 템플릿은 InvokeStateMachineEventRulestart-state-machine로 설정된 이벤트에 대해 default 이벤트 버스에서 수신하는 IDdetail-type 및 이름start-state-machine의 이벤트 규칙을 정의합니다.

대상은 규칙이 트리거될 때 호출되는 리소스입니다. 내장 함수Fn::GetAtt는 대상 리소스로 지정된 TestStateMachine의 ARN을 반환합니다.
또한 각 대상은 리소스를 호출하는 데 사용되는 IAM 역할을 RoleArn로 정의해야 합니다.

{
  "InvokeStateMachineEventRule": {
    "Type": "AWS::Events::Rule",
    "Properties": {
      "EventBusName": "default",
      "EventPattern": {
        "detail-type": ["start-state-machine"],
      },
      "Name": "start-state-machine",
      "State": "ENABLED",
      "Targets": [
        {
          "Arn": {
            "Fn: :GetAtt": ["TestStateMachine","Arn"]
          },
          "Id": "TestStateMachine",
          "RoleArn": {
            "Fn: :GetAtt": ["InvokeStateMachineIamRole","Arn"]
          },
        },
      ],
    },
  },
}


IAM 역할은 InvokeStateMachineIamRole로 정의되며 states:StartExecution 리소스에 대한 TestStateMachine 작업을 허용하는 인라인 정책을 포함합니다. 이 역할은 EventBridge 규칙에서 다른 서비스 리소스(예: StepFunction 상태 머신)를 호출하는 데 사용되므로 EventBridge에서 역할을 가져올 수 있도록 추가AssumeRolePolicyDocument가 제공됩니다(예: principalevents.amazonaws.com ).

{
  "InvokeStateMachineIamRole": {
    "Type": "AWS::IAM::Role",
    "Properties": {
      "Policies": [
        {
          "PolicyName": "InvokeStateMachineRolePolicy",
          "PolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
              {
                "Effect": "Allow",
                "Action": ["states:StartExecution"],
                "Resource": [
                  {
                    "Fn: :GetAtt": ["TestStateMachine", "Arn"]
                  }
                ],
              },
            ],
          },
        },
      ],
    },
  },
  "AssumeRolePolicyDocument": {
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": {
          "Service": ["events.amazonaws.com"],
        },
        "Action": "sts:AssumeRole",
      },
    ],
  },
}



Lambda 함수 호출



이 이벤트 규칙InvokeLambdaFunctionEventRule은 이름이 start-lambda-function이고 detail-typestart-lambda-function로 설정된 이벤트를 수신한다는 점을 제외하면 이전 규칙과 유사합니다. 또한 대상 리소스는 TestLambdaFunction이고 RoleArn는 의도적으로 생략했습니다.

{
  "InvokeLambdaFunctionEventRule": {
    "Type": "AWS::Events::Rule",
    "Properties": {
      "EventBusName": "default",
      "EventPattern": {
        "detail-type": ["start-lambda-function"],
      },
      "Name": "start-lambda-function",
      "State": "ENABLED",
      "Targets": [
        {
          "Arn": {
            "Fn: :GetAtt": ["TestLambdaFunction","Arn"]
          },
          "Id": "TestLambdaFunction",
        },
      ],
    },
  },
}

RoleArn 대상에 대해 TestLambdaFunction를 제공하면 배포할 때 오류가 발생합니다.

UPDATE_FAILED: InvokeLambdaFunctionEventRule (AWS::Events::Rule)
RoleArn is not supported for target arn:aws:lambda:eu-central-1:xxxxxxxxxxxx:function:eventbridge-rule-example-dev-test.



다른 서비스와 달리 Lambda는 resource-based permissions을 사용하여 다른 AWS 서비스가 사용자를 대신하여 이 함수를 호출할 수 있도록 합니다. 따라서 InvokeLambdaFunctionPermission 리소스(즉, 함수 이름)에 대해 Lambda:InvokeFunction 작업을 허용하는 TestLambdaFunction 정의를 추가해야 합니다. 또한 이 권한은 EventBridge 규칙에서 이 Lambda 함수를 호출하는 데 사용됩니다. 따라서 실제로 함수를 호출하는 주체events.amazonaws.com와 ARNInvokeLambdaFunctionEventRule을 지정해야 합니다.

{
  "InvokeLambdaFunctionPermission": {
    "Type": "AWS::Lambda::Permission",
    "Properties": {
      "FunctionName": {
        "Fn: :GetAtt": ["TestLambdaFunction", "Arn"],
      },
      "Action": "lambda:InvokeFunction",
      "Principal": "events.amazonaws.com",
      "SourceArn": {
        "Fn: :GetAtt": ["InvokeLambdaFunctionEventRule", "Arn"]
      },
    },
  },
}


GitHub 리포지토리



Serverless Framework를 사용하여 모든 리소스를 배포했지만 Lambda 함수와 StepFunction 상태 머신을 빠르게 생성하기 위해서만 배포했습니다. 모든 중요한 리소스는 AWS CloudFormation 템플릿으로 정의되며 다른 방식으로 배포할 때 유효합니다. AWS SAM, AWS CLI 등

언제든지 전체 템플릿을 확인하고 자신의 AWS 계정에 배포하십시오: GitHub respository

좋은 웹페이지 즐겨찾기