[AWS lambda] Slack Bot이 시간 초과로 여러 번 응답하는 것을 방지

여러 번 응답하는 사례



이전 기사 에서 slack bot를 AWS lambda를 사용하여 만들었지만 마지막으로 언급했듯이 여러 번 동일한 응답을 할 수 있습니다.
이것은 slack의 타임 아웃 시간이 3 초 밖에 없고, 3 초 이내에 응답 할 수 없다면 에러로 간주되어 여러 번 같은 이벤트를 보내 온다. 원인입니다.


해결 방법



새로운 lambda 함수를 만들고 거기에서 비동기로 slack에 post lambda 함수를 호출하기로 결정!
이렇게하면 slack API에 대한 응답은 새로운 lambda 함수에서 즉시 수행 할 수 있으며 나중에 천천히 작업 공간에 postMessage 할 수 있습니다.

새로운 lambda 함수 만들기



IAM 역할 만들기



마지막 기사 과 같은 순서로 역할을 만듭니다.
이번에는 롤의 이름을 invokeBotRole 로 했습니다.
이전과 다른 것은 Permissions Policies에 AWSLambdaBasicExecutionRole 이외에 AWSLambdaRole를 추가하십시오. 이렇게 하면 다른 lambda 함수를 호출할 수 있습니다.


lambda 함수 만들기



마지막 기사 그럼 Java 묶음으로 작성했습니다만, 이번은 바삭바삭하고 Python3.7로 만들어 갑니다.
lambda 페이지에서 다음과 같이 설정하여 invokeBot라는 lambda 함수를 만들었습니다.


API Gateway 만들기



이것도 마지막 기사 와 같이 작성해 갑니다.
이번은 invokeBotAPI 라는 이름의 APIGateway로 하고, 배포시의 스테이지명은 invokeBotStage 로 했습니다.
배포 시 표시되는 URL을 기록해 두는 것을 잊지 마십시오.

lambda 함수 편집



다시 lambda 함수 페이지로 돌아가 편집합니다.
API Gateway에서 들어가서 다른 lambda 함수에 연결할 수 있는지 확인할 수 있다고 생각합니다.


lambda 함수를 다음과 같이 편집합니다.
  • FunctionName='sampleBot' 부분에서 호출 할 lambda 함수의 이름을 설정합니다.
  • InvocationType='Event'로 설정하면 비동기 실행이 가능합니다.
  • Slack Event API 인증도 지원합니다.
    import json
    import boto3
    import logging
    
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    
    def lambda_handler(event: dict, context):
    
        logging.info(json.dumps(event))
        if "challenge" in event:
            return event.get("challenge")
    
        client = boto3.client('lambda')
        response = client.invoke(
            FunctionName='sampleBot',
            InvocationType='Event',
            LogType='Tail',
            Payload= json.dumps(event)
        )
    
        return {
            'statusCode': 200,
            'body': json.dumps('OK')
        }
    

    또한 일응념을 위해 lambda 함수의 timeout 시간도 3초로 설정해 두면 확실히 3초 이내에 slack API에 응답이 보내지기 때문에 안전합니다.


    이벤트의 요청 URL로 설정



    slack API가 호출하는 URL을 새 URL로 변경합시다.
    이전 API를 배포할 때 메모해 둔 URL을 다시 설정합니다.


    동작 확인



    타임 아웃없이 실행할 수 있습니다!


    참고



    AWS Lambda에서 Lambda를 부르고 빠진 이야기.
    AccessDeniedException: User is not authorized to perform: lambda:InvokeFunction
  • 좋은 웹페이지 즐겨찾기