API Gateway&Lambda&DynamoDB 배포 오류 모음

오류 모음



SlackBolt를 사용하여 만든 SlackBot을 API Gateway와 Lambda에 배포할 때 상당히 오류를 만났습니다. 향후 개발되는 분(과 자신)의 참고가 되면(자)라고 생각해, 개발중에 만난 에러집 정리했습니다.

Slack에 API를 등록할 때 URL이 올바르지 않으면 오류가 발생합니다.





index.js
var body = JSON.parse(event.body);
if (body.type == 'url_verification') {
    const res = { challenge: body.challenge }
    return {statusCode: 200, body: JSON.stringify(res) }
  }


SlackAPI 참조

API를 두드린 후 오류가 발생합니다.


"errorMessage": "No token and no authorize options provided. Apps used in one workspace should be initialized with a token. Apps used in many workspaces should be initialized with a authorize.",


APIGateway 로그를 cloud watch로 출력하는 중 오류





해결책은 이것처럼 보입니다.
API Gateway API 문제를 해결하기 위해 CloudWatch 로그를 활성화하려면 어떻게 해야 합니까?

무한 루프



인기자처럼 알림 멈추지 않는다.
초간 2통 정도 메시지 날아와...

원인은 범 미스로, SlackAPI의 Interactive Components의 설정으로 메시지가 투고되면 Lambda를 킥하는 이벤트를 등록하고 있었기 때문에, 메시지가 투고될 때마다 lambda가 두드려져 엄청 메시지가 도착하는 사양이 되어 버리고 있다 했다. .

API Gateway에서 Lambda를 치는 중 오류


400_client_error에서 오류가 발생했습니다.



매개변수를 형성하는 방법에는 2가지가 있다.
1. API Gateway 통합 요청으로 매핑 템플릿 생성
h tps://마이타케라멘. 하테나 bぉg. 코m/엔트리/2019/02/22/105438
2. API Gateway 통합 요청에서 Lambda 프록시 통합 사용 확인
htps : // / cs. 아 ws. 아마존. 이 m/그럼_jp/아피가테와 y/ぁてst/로 HTML

이번에는 2가지 방법으로 에러를 해소.

APIGateway에서 보낸 값을 형식화하고 매개 변수 디코딩



CloudWatchLog
(54b5c973-9a0e-4109-8082-6dffa303f3d8) Method request body before transformations: payload=%7B%22type%22%3A%22message_action%22%2C%22token~~~~~~`block_id%22%3A%221o [TRUNCATED]

아무래도 파라미터의 값이 갖추어지지 않은 것 같다.
로그에서 확인하면 매개 변수에 불필요한 payload='가 붙어 있거나 개체가 아니거나 매개 변수를 검색 할 수없는 문제가있었습니다.

여기까지 오는데, 엄청 시간이 걸렸습니다.
뭐니뭐니해도 람다와 APIGateway 디버깅에 너무 오래 걸렸어요...

매개변수를 정렬하고 객체로 변환

index.js
  const body_split = event.body.split('payload=').join('');
  const event_body = decodeURIComponent(body_split);
  var obj = JSON.parse(event_body);

특정 문자열을 삭제하는 방법
정규식을 사용하지 않는 경우 다음과 같이 split과 join을 결합하는 방법이 있습니다.
split을 실행하여 a로 구분된 배열로 변환하고 join에서 배열을 모두 결합함으로써 구분자의 a가 삭제된다는 방법입니다.

참고 예
var str = 'abcabc';
console.log(str.split('a').join('')); // "bcbc"

-----------------
// jsonぽい形のデータをオブジェクト化する
var date ='{"ts":+"1573443403.004500",+"title":+"テストテスト",+"channel":+"QWERTY~~"}'
var body_split = date.split('+').join('');
var date = (new Function("return " + body_split))();
console.log(date);

JSON 같은 문자열을 객체로 변환하는 JavaScript

Lambda 실행 시간이 UTC가되는 문제



Lambda 콘솔에서 환경 변수를 설정합시다.process.env.TZ = "Asia/Tokyo"; Lambda의 Node.js v8.10에서 시간대를 지정해도 Date가 UTC가되는 문제

DynamoDB에 공백을 저장할 수 없음 오류



DynamoDB에 공란을 저장할 수 없기 때문에 ValidationException 오류가 발생합니다.ValidationException: ExpressionAttributeValues contains invalid value: One or more parameter values were invalid: An AttributeValue may not contain an empty string for key이하의 사이트를 참고로 해, 공란 허가의 옵션을 추가하는 것으로, null로서 DB에 보존된다.
DynamoDB 는 하늘의 값을 등록할 수 없지만 DynamoDB document client 의 생성자 에 옵션을 건네주는 것만으로 하늘의 값을 NULL 형에는 변환할 수 있어?

요약



하나의 에러를 해소했다고 생각하면, 비교적 곧바로 다음의 에러를 만나서 심심해질 것 같아졌으므로,
😉라든지 😘라든지로 에러 메세지를 팝으로 해 보았습니다.

이번 에러를 메모 정도로 정리해 두는 것으로, 비교적 자신에게 구해졌습니다.
누군가의 뭔가 도움이되면 다행입니다!

만약 뭔가 수정 부분이 있으면 가르쳐 주시면 도움이 됩니다.

이번 구현에서 참고로 한 사이트



  • DynamoDB
  • DynamoDB 테이블 만들기
  • AWS Lambda에서 Dynamo DB로 데이터 추가
  • AWS SDK에서 DynamoDB 작업(삽입, 검색, 업데이트, 삭제)


  • 람다
  • Lambda의 Node.js v8.10에서 시간대를 지정해도 Date가 UTC가되는 문제

  • 좋은 웹페이지 즐겨찾기