LINE의 MessagingAPI를 사용하여 수신한 메시지를 S3에 저장

소개



LINE@에서 제공되는 MessageingAPI를 사용하여 LINEbot을 만들고, 발화 내용을 DB에 넣어두고 싶었기 때문에, 보내져 온 메시지를 APIGateway로 받아 S3에 돌진해 보았습니다. (거기에서 앞의 DB에의 인서트는 할애)

준비


  • AWS에 계정이 있습니다
  • LINE@에서 MessagingAPI를 사용하도록 설정한 계정이 있습니다.
  • LINE@에서 MessagingAPI를 활성화하면 아래와 같은 제약이 있으므로 주의



  • S3에서 메시지를 넣는 버킷 만들기




    알기 쉬운 버킷명을 넣어 작성.
    필요에 따라 각종 설정은 변경하면 OK이지만 기본적으로 기본적으로 좋다고 생각합니다.

    받은 메시지를 S3에 저장하기 위한 lambda 함수 만들기




    역할은 lambda와 S3에 액세스 할 수있는 것을 새로 만들거나 기존 중에서 선택하여 부여합니다.
    이번에는 Node.js 6.10에서 만들었습니다.
    'use strict';
    var AWS = require('aws-sdk');
    AWS.config.region = {S3のバケットのregion};
    var bucketName = {S3のバケット名};
    
    var s3 = new AWS.S3({apiVersion: '2006-03-01'});
    
    exports.handler = function(event, context, callback) {
    
      if (event.headers) {
    
        // line からのリクエストか判定
        const crypto = require('crypto');
        const channelSecret = {LINEの管理画面上から取得するチャンネルシークレット};
        const body = event.body;
        const signature = crypto.createHmac('SHA256', channelSecret).update(body).digest('base64');
    
        if (signature == event.headers['X-Line-Signature']) {
          var date = new Date();
          var fileName = date.getTime() + '-' + signature.replace( /\//g , "" ) + '.txt';
          var params = {
            Bucket: bucketName,
            Key: fileName,
            Body: event.body
          };
    
          // 内容をS3に保存
          s3.upload(params, function(err, data) {
            if (err) {
              console.log("Error uploading data: ", err);
            } else {
              console.log("Successfully uploaded data to " + bucketName + "/" + fileName);
            }
    
            callback(null, response_success);  // SUCCESS with message
            context.done(null, 'Finished UploadObjectOnS3');
    
          });
        }
      }
    };
    
    const response_success = {
      'isBase64Encoded': false,
      'statusCode': 200,
      'headers': {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        message: 'ok'
      }),
    };
    

    엔드포인트인 APIGateway 작성




    액션 → 메소드 작성에서 POST 메소드를 작성합니다.
    ※저는 여기를 GET로 만들어 버리고 있어 LINE의 관리 화면에서 WebhookAPI의 등록을 하고, 소통 테스트를 실시하면 테스트가 통하지 않고 빠졌습니다…



    그리고 방법을 설정합니다.
    Lamda 지역과 함수 이름은 방금 만든 것을 넣습니다.
    설정이 완료되면 작업에서 이 API를 배포합니다.



    배포가 가능하면 URL이 발행되므로 그 URL을 LINE@의 관리 화면에서 WebhookURL로 등록합니다.

    움직였다.



    LINE에서 말을 걸면



    들어갔다!

    좋은 웹페이지 즐겨찾기