【Golang】AWS が提供しているサンプルコードでSQSに触れてみる

どもども!最近少しずつ暖かくなってきてテンション上がり気味の僕です。ずっとこの気温でええんやで…


さて、本日はAWSが提供してくれているサンプルコードを利用してAmazon SQS に触ってみようの記事です。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-sqs-create-package.html#:~:text=%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82-,Go,-Amazon%20SQS%20%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88


使用言語はGoでAWS LambdaからSQSにキューイングされているメッセージを取得してみたいと思います。


それでは参りましょう。

Lambda作成

まずはメッセージを取得するLambdaを作成、デプロイしていきましょう。

Lambdaに紐づけるIAM Roleを事前に準備しておいてください。下記のポリシーがあれば問題ないでしょう。

・AmazonSQSFullAccess
・AWSLambdaBasicExecutionRole

コードはサンプルのものをそのまま使用します。

package main

import (
	"context"
	"fmt"

	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
)

func handler(ctx context.Context, sqsEvent events.SQSEvent) error {
	for _, message := range sqsEvent.Records {
		fmt.Printf("The message %s for event source %s = %s \n", message.MessageId, message.EventSource, message.Body)
	}

	return nil
}

func main() {
	lambda.Start(handler)
}

非常にシンプルでSQSとっかかりには非常に便利かと思います。


それではLambrollでデプロイしましょう。最近デプロイでこのツールを使用する頻度が増えたのでinit周りをスクリプト化してみました。一応こちらも載せておきます。

#!/bin/sh -ex

functionname="Lambda関数名"
profile="使用するAWSプロファイル"
handler="main"
role="Lambdaに紐づけるIAM Role名"
runtime="go1.x"

lambroll init --function-name=${functionname} --profile=${profile}

cp function.json function.json.bk

sed -i -e "s/index.handler/${handler}/g" function.json
sed -i -e "s/YOUR_LAMBDA_ROLE_NAME/${role}/g" function.json
sed -i -e "s/nodejs10.x/${runtime}/g" function.json

cat <<EOL >> deploy.txt
コンパイル
GOARCH=amd64 GOOS=linux go build ${handler}.go

デプロイ
lambroll deploy --region "ap-northeast-1" --profile="${profile}"

削除
lambroll delete
EOL

他のRuntimeを使用する場合でも、少し改良すればこちらのスクリプトで対応できると思います!


それでは、上記スクリプトをmain.goと同じディレクトリに作成し、実行しましょう。

$ chmod 700 lambroll.sh
$ ./lambroll.sh

これでinitが完了したのでデプロイしていきましょう。今回はGolangですがコンパイルとデプロイ手順が記載されたdeploy.txtも作成されているはずです!(スクリプトにしてもいいかも)


手順通り上から順に実行すればLambda関数がデプロイされるはずです!


SQSキューを作成

次にSQSキューを作成しましょう。


と言ってもやることは単純で、AWS コンソール画面からSQSのページに移動し、"キューを作成"をクリック、今回はキューの名前のみ入力して作成でOKです!


これでリソースは揃いましたね!

Lambdaからメッセージを取得する

それではSQSにメッセージを送信し、Lambdaから受信してみましょう。


まずはAWSコンソール画面のLambdaのページに移動し、 “+ トリガーを追加"からトリガーを追加します。サービスはSQSを選択し、先ほどのキューを選択しましょう。


続いてSQSのページに戻り、先ほど作成したキューを選択、"メッセージを送受信"をクリックし何か適当なメッセージを送信してください!


次にLambdaのページに戻りテスト実行してみます。下記のようにSQSの情報とメッセージが取得できていれば成功です!(テスト実行結果、CloudWatch logsから確認できます!)

The message メッセージID for event source aws:sqs = メッセージ内容


お疲れ様でした!

まとめ

本日はAWSが提供しているサンプルコードでLambdaに触れてみました。


今回の作業内容ではイマイチユースケースがわかりにくいかもしれません。実際には様々な場面で使用されますが、例えば一度に大量の処理要求がくる場合などに、要求を一旦キューイングしておき、順次メッセージを受信して処理していくことでコンピューティングリソースの負荷を抑えると言った方法でよく使用されます。


他にも非同期的に処理を行いたい場合など様々なユースケースが考えれれる非常に便利なサービスですので、一度触ってみることをお勧めします!


以上、最後まで読んでいただきありがとうございました!


お勧め教材

AWS,Golang

Posted by CY