3
2

More than 3 years have passed since last update.

Go言語でAWS SNSにメッセージを送信する

Posted at

概要

Amazon Simple Notification Service(SNS)で、Go言語のSDKを使ってトピックに対してメッセージを送信します。

環境

  • Go : 1.14.3
  • Mac OS X : 10.15.4
  • AWS SDK for Go

シンプルな実装

シンプルなメッセージ送信
package main

import (
    "fmt"

    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/sns"
)

// TopicARNとRegionは環境に合わせます
const (
    TopicARN  = "arn:aws:sns:XXXXXXXXXXXXXXXXX"
    AwsRegion = "XXXXXX"
)

func main() {
    // SNSクライアントの作成
    mySession := session.Must(session.NewSession())
    svc := sns.New(mySession, aws.NewConfig().WithRegion(AwsRegion))

    message := "This is sample message."

    // メッセージを送信するための構造体を作成
    inputPublish := &sns.PublishInput{
        Message:  aws.String(message),
        TopicArn: aws.String(TopicARN),
    }

    // メッセージの送信(Publish)
    MessageId, err := svc.Publish(inputPublish)
    if err != nil {
        fmt.Println("Publish Error: ", err)
    }

    fmt.Println(MessageId)

}

シンプルにメッセージを送る場合の実装です。登録されたサブスクリプションに対してメッセージが送信されます。例として、SQSをサブスクリプションにした場合、以下の通り確認できます。
image.png

サブスクリプションごとにメッセージを変える場合

サブスクライブするプロトコルごとのメッセージ
package main

import (
    "encoding/json"
    "fmt"

    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/sns"
)

const (
    TopicARN  = "arn:aws:sns:XXXXXXXXXXXXXXXXX"
    AwsRegion = "XXXXXX"
)

func main() {
    mySession := session.Must(session.NewSession())
    svc := sns.New(mySession, aws.NewConfig().WithRegion(AwsRegion))

    message := "This is sample message."

    // サブスクリプションのプロトコルごとにメッセージを指定
    messageJson := map[string]string{
        "default": message,
        "sqs": "This is sample message for sqs.",
    }
    // メッセージ構造体はJSON文字列にする
    bytes, err := json.Marshal(messageJson)
    if err != nil {
        fmt.Println("JSON marshal Error: ", err)
    }
    messageForSQS := string(bytes)

    inputPublish := &sns.PublishInput{
        Message:  aws.String(messageForSQS),
        MessageStructure: aws.String("json"),    // MessageStructureにjsonを指定
        TopicArn: aws.String(TopicARN),
    }

    MessageId, err := svc.Publish(inputPublish)
    if err != nil {
        fmt.Println("Publish Error: ", err)
    }

    fmt.Println(MessageId)

}

このソースの実行結果は以下の通りです。SQS用に設定したメッセージが送信されています。
image.png

このようにサブスクリプションのプロトコルごとに異なるメッセージを送る場合、MessageStructurejsonを設定します。また、メッセージはJSON文字列として、トップレベルにプロトコル(今回の例ではsqs)を指定します。トップレベルにdefaultは必須です。
プロトコルとして指定する値はCLIのリファレンスを参照。
subscribe - Options

なお、メッセージ属性を設定する場合はMessageAttributesを使います。詳細は以下の公式ドキュメントを参照。
type PublishInput

参考

3
2
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
3
2