[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 함수를 다음과 같이 편집합니다.
새로운 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'
로 설정하면 비동기 실행이 가능합니다.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
타임 아웃없이 실행할 수 있습니다!
참고
AWS Lambda에서 Lambda를 부르고 빠진 이야기.
AccessDeniedException: User is not authorized to perform: lambda:InvokeFunction
Reference
이 문제에 관하여([AWS lambda] Slack Bot이 시간 초과로 여러 번 응답하는 것을 방지), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kamata1729/items/fc6c31a3039599b48305텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)