質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.48%

LINEbotに送った画像と動画を自動でAWSのS3に保存したい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 952

score 2

前提・実現したいこと

LINEbotに送った画像と動画を自動でAWSのS3に保存したいです。
LINE→API GATEWAY→lambda→S3で実現できると理解しています。

発生している問題・エラーメッセージ

LINEからのメッセージをトリガーにlambda関数が動くところまではhello worldで確認できたのですが、
いざ画像を取得してみようとするとうまくいきません。
まずは下記記事の内容を動かしてみたいです。
https://qiita.com/vedokoy/items/165eaa90015e0181475a

特に疑問なのが、lambda関数をnode.jsで使うのならば
exports.handler = (event, context, callback) =>
が真っ先に来るかと思っていたのですが、
記事中ソースコードでは一切触れられていないため
そういうやり方もあるのか?と混乱しています。

該当のソースコード

node.js
var https = require('https');

// 引数のmessage_idは
// event_data.events[0].message.typeが"image"だった場合に
// event_data.events[0].message.idで取得したもの
var get_image = function(message_id,callback){

    // Request Headers
    var send_options = {
        host: 'api.line.me',
        path: '/v2/bot/message/'+message_id+'/content',
        headers: {
            "Content-type": "application/json; charset=UTF-8",
            "Authorization": " Bearer " + "{ MY_TOKEN }" // ←ここに自分のトークンを入れる(LINE Developersで発行したやつ)
        },
        method:'GET'
    };

    // APIリクエスト
    var req = https.request(send_options, function(res){
        var data = [];
        res.on('data', function(chunk){
          //image data dividing it in to multiple request
          data.push(new Buffer(chunk));
        }).on('error', function(err){
          console.log(err);
        }).on('end', function(){
          // ここに画像取得後の処理を書く
          // この場合は、引数で受け取った画像取得後の処理用callbackを実行
          // dataに画像のバイナリデータが入ってる
          save_image(data);
        });
    });
    req.end();
};
var AWS = require('aws-sdk');
AWS.config.region = 'ap-northeast-1';
var s3 = new AWS.S3({ apiVersion: '2006-03-01' });

// dataは画像のバイナリデータ
// ②の関数のcallbackがこれになるイメージ
var save_image = function(data){
    var params = {
        Bucket: 'my_bucket', // ←バケット名
        Key: 'test.png', // ←バケットに保存するファイル名
        Body: Buffer.concat(data)
    };
    s3.putObject(params, function(err, data) {
        // 画像保存後の処理
    });
};

試したこと

実際に動作した際は矢印でコメントされている部分は正しい値を入力しました。

補足情報(FW/ツールのバージョンなど)

VBAしかいじったことがないため、半端な知識で申し訳ないのですがご教授よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

特に疑問なのが、lambda関数をnode.jsで使うのならば
exports.handler = (event, context, callback) =>
が真っ先に来るかと思っていたのですが、
記事中ソースコードでは一切触れられていないため
そういうやり方もあるのか?と混乱しています。

この記事では単にexports.handler = (event, context, callback) =>...の部分を省略しているだけだと思います。記事の「①LINE Botを使えるようにする」で参照しているhttp://www.kazuweb.asia/aws/lambda/chatbot の記事にその辺りのコードがあるので割愛したのでしょう。

動作確認はしていないのですが、下記のコードを一番最後に追加すると動作するようになると思います。

exports.handler = function(event, context) {
    var event_data = JSON.parse(event.body);
    event_data.events.forEach(function(event) {
      if(event.message.type === 'image') {
        get_image(event.message.id, save_image)
      }
    })
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/08/12 19:19

    遅くなり申し訳ありません。
    ログが下記のようにでました。
    events: [
    {
    type: 'message',
    replyToken: '204c365f91d94aa88ef35015ccc8ebd',
    source: [Object],
    timestamp: 1597199223174,
    mode: 'active',
    message: [Object]
    }
    ],
    destination: 'U6742e5f7f70f2611183b108c7b0e57ed'
    }


    {
    "errorType": "SyntaxError",
    "errorMessage": "Unexpected token u in JSON at position 0",
    "stack": [
    "SyntaxError: Unexpected token u in JSON at position 0",
    " at JSON.parse (<anonymous>)",
    " at Runtime.exports.handler (/var/task/index.js:3:23)",
    " at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)"
    ]
    }

    キャンセル

  • 2020/08/12 20:35

    失礼しました。ちょっと古い書き方をしてしまったようです。
    JSONはパース済みでlamdaに来てるみたいですね。


    exports.handler = function(event, context) {
    event.events.forEach(function(eve) {
    if(eve.message.type === 'image') {
    get_image(eve.message.id, save_image)
    }
    })
    }

    で動作するはずです。

    キャンセル

  • 2020/08/12 21:38

    おかげさまでS3に画像保存できました!
    何度もありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る