LoginSignup
14
17

More than 5 years have passed since last update.

【AWS】SDKからSQSを操作する(送受信)【Python】【Node.js】

Last updated at Posted at 2016-08-19

Lambda × SQS ってよく使う

SQSってよく使うので送受信のサンプルを書いておきます。
自分の備忘録的な意味合いも大きい記事です。

前提

  • LambdaからSQSを操作できるロールがひっついていることを前提とします。
  • SQSキューは作成済でキューのURLは取得済みとします

SQSからのメッセージ受信

Pythonを用いてSQSからメッセージを取得します

sample
# -*- coding: utf-8 -*-

from __future__ import print_function
import ConfigParser
import boto3
import json

# configファイルの読み込み
ini = ConfigParser.SafeConfigParser()
ini.read("./config.ini")

# sqs
sqs = boto3.client('sqs')
sqsUrl = ini.get("sqs", "url")

# 取得するメッセージの上限
limit = 100

# 処理本体
print('Loading function...')
def lambda_handler(event, context):
    print('========== FUNCTION START ==========')

    for cnt in range(0, limit):
        queMessage = get_sqs_message(sqsUrl)

        if queMessage is not None:
            if "Messages" in queMessage:
                receiptHandle = queMessage['Messages'][0]['ReceiptHandle']
                message = queMessage['Messages'][0]['Body']
                print('receiptHandle:' + str(receiptHandle))
                print('messageBody:' + str(message))
            else:
                print('no message')
                break
        else:
            ercnt += 1
            print("ERROR COUNT:" + str(ercnt))

    print('========== FUNCTION END ============')


# SQSメッセージ取得処理
def get_sqs_message(sqs_url):
    url = sqs_url

    try:
        response = sqs.receive_message(
            QueueUrl=url,
        )

    except Exception as e:
        print('=====Error=====')
        print('get_sqs_message')
        print('ERROR:' + str(e))
        print('===============')
        return None

    return response

SQSからの受信はURLがわかっていれば可能です。

node.jsを用いてSQSからメッセージを取得します

sample
//モジュールの読み込み
var aws = require('aws-sdk');
var sqs = new aws.SQS({region: 'ap-northeast-1'});

// 取得するメッセージの上限
var limit = 100;

//sqsのURL
var ini = require('./config.json');
var url = ini.sqs.url.test

//メイン処理
exports.handler = function (event, context) {
    var cnt = 0;
    var params = {
            QueueUrl: url
    };

    for (var i = 0; i < limit; i++) {
    cnt++;
            sqs.receiveMessage(params, function (err, data) {
                    if (err) {
                            console.log(err, err.stack);
                    } else {
                            if (data.Messages) {
                                    var messageBody = data.Messages[0].Body;
                                    var receiptHandle = data.Messages[0].ReceiptHandle;
                                    console.log(messageBody);
                                    console.log(receiptHandle);
                            } 
                    }
                    if (cnt === limit) context.succeed();
            });
    }
};

config.json
{
  "sqs": {
    "url": {
      "test": "https://sqs.ap-northeast-1.amazonaws.com/************/hogehoge-test"
    }
}

node側はjsonで書いてみました。


SQSへのメッセージ送信

今度はSQSへメッセージを送信します

Pythonを用いてSQSへメッセージを送信します

sample
# -*- coding: utf-8 -*-

from __future__ import print_function
import ConfigParser
import boto3


# configファイルの読み込み
ini = ConfigParser.SafeConfigParser()
ini.read("./config.ini")

# sqs
sqs = boto3.client('sqs')
sqsUrl = ini.get("sqs", "url")


# 処理本体
print('Loading function...')
def lambda_handler(event, context):
    print('========== FUNCTION START ==========')

    message = 'hogeeeeeeeeee'
    send_sqs_message(sqsUrl, message)

    print('========== FUNCTION END ============')


# SQSメッセージ送信処理
def send_sqs_message(sqs_url, send_message):
    url = sqs_url
    obj = send_message

    try:
        response = sqs.send_message(
            MessageBody = obj,
            QueueUrl = url,
            DelaySeconds = 0
        )

    except Exception as e:
        print('=====Error=====')
        print('send_sqs_message')
        print('ERROR:' + str(e))
        print('===============')
        return None

    return response

node.jsを用いてSQSへメッセージを送信します

sample

//モジュールの読み込み
var aws = require('aws-sdk');
var sqs = new aws.SQS({region: 'ap-northeast-1'});

//sqsのURL
var ini = require('./config.json');
var url = ini.sqs.url.test;

//メイン処理
exports.handler = function (event, context) {
    var message = 'hogeeeeeeee';
    var params = {
        MessageBody: message,
        QueueUrl: url,
        DelaySeconds: 0
    };

    sqs.sendMessage(params, function (err, data) {
        if (err) {
          console.log(err, err.stack)
        } else {
            console.log(data);
            context.succeed();
        }
    });

};


見て分かる通り、私はnode苦手です。

ところでなんで2言語かって?
両方使ってるからです

14
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
17