AppSyncでSNSにメッセージを送信してみる!HTTPデータソースを使ってみよう🥳

AppSyncでSNSにメッセージを送信してみる!HTTPデータソースを使ってみよう🥳

こんにちは!

AppSync ではいろんなデータソースを選択できますが、SNS って選択肢にないですよね?でも、HTTP データソースを指定すれば SNS と連携することが可能です。

今回は気になる AppSync における SNS の使い方を解説していきます!

想定する読者

  • AppSync に興味があるヒト
  • AppSync と SNS の接続方法が知りたいヒト
  • HTTP データソースを使ってみたいヒト

はじめに

HTTP データソースを理解し活用することができれば、AppSync の可能性を広げることができます。

AppSync の仕組みを知る上でも、様々なデータソースに触れておいて損はないと思うので、お時間のある方は記事を読みながら AppSync をぜひ触ってみてください。

AppSync と SNS の接続

AppSync で SNS を利用するには、HTTP データソースを利用します。

手順としては AppSync ⇒ SNS 用の IAM ロールの作成、HTTP データソースの作成を順に行うことで利用できるようになります。

IAM ロールの作成

IAM ロールは AppSync が SNS とやり取りするのに必要です。

信頼関係は AppSyncと、権限は CloudWatch Logs と SNS を持つロールを作成しましょう。CloudFormation では以下のようになります。

Resources:
  SNSRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: AppSyncDemoSNSRole
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Action:
          - sts:AssumeRole
          Principal:
            Service:
            - appsync.amazonaws.com
      Path: '/'
      Policies:
        - PolicyName: SNSRolePolicy
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
            - Effect: Allow
              Action:
              - sns:*
              - logs:CreateLogGroup
              - logs:CreateLogStream
              - logs:PutLogEvents
              Resource: '*'

HTTP データソースの作成

SNS を利用する場合は、データソースの作成で「 HTTP データソース」を選択します。CloudFormation では以下のようになります。パラメータ「ServiceRoleArn」には、先ほど作成したロール ARN を指定しましょう。

Resources:
  DataSource:
    Type: AWS::AppSync::DataSource
    Properties:
      ApiId: !GetAtt GraphQLApi.ApiId
      Name: AppSyncDemoDataSource
      Type: HTTP
      ServiceRoleArn: !GetAtt SNSRole.Arn
      HttpConfig:
          Endpoint: https://sns.ap-northeast-1.amazonaws.com/
          AuthorizationConfig:
            AuthorizationType: AWS_IAM
            AwsIamConfig:
              SigningRegion: ap-northeast-1
              SigningServiceName: sns

SNS をパブリッシュしてみる

それでは SNS をパブリッシュしてみましょう。

事前に SNSトピックに E メールのサブスクリプションを作成しておきす。メールアドレスの確認が完了したら、作成済みの AppSync にてスキーマの追加とリゾルバーの作成を行います。CloudFormation では以下のようになります。

Resources:
  GraphQLSchema:
    Type: AWS::AppSync::GraphQLSchema
    Properties:
      ApiId: !GetAtt GraphQLApi.ApiId
      Definition:  |
        type Mutation {
          snsPublish(message: String!): Boolean
        }

        type Query {
          sample: String
        }

        schema {
          query: Query
          mutation: Mutation
        }

  Resolver:
    Type: AWS::AppSync::Resolver
    DependsOn: GraphQLSchema
    Properties:
      ApiId: !GetAtt GraphQLApi.ApiId
      DataSourceName: !GetAtt DataSource.Name
      TypeName: "Mutation"
      FieldName: "snsPublish"
      Kind: UNIT
      RequestMappingTemplate: |
        #set($message = $utils.urlEncode($ctx.args.message))
        #set($topic = $utils.urlEncode("arn:aws:sns:ap-northeast-1:0123456789:AppSyncDemoTopic"))
        {
            "version": "2018-05-29",
            "method": "POST",
            "resourcePath": "/",
            "params": {
                "body": "Action=Publish&Version=2010-03-31&TopicArn=$topic&Message=$message",
                "headers": {
                    "content-type": "application/x-www-form-urlencoded"
                }
            }
        }
      ResponseMappingTemplate: |
        #if($ctx.result.statusCode == 200)
         true
        #else
         false
        #end

リクエストマッピングテンプレートにて topic という変数に対象の SNS トピックARN を記述しているので、こちらはご自由に書き換えてください。

ここまで準備ができたら、あとはクエリを実行してみるだけです。実際に実行すると、サブスクリプションに登録したメールアドレスにメッセージが送られてきます。

無事にメールが届きました!成功です!

なお、SNS に対するアクションについてですが、SNS の API リファレンスを参考にリクエストマッピングテンプレートを書きました。SNS に対して別のアクションを行いたい場合はぜひ参考にしてください。

関連記事

まとめ

HTTP データソースは SNS 以外にも応用できると思うので、今後もいろいろ試していきたいですね。どんどん AppSync を使いこなしていきましょう!

このブログでは、GraphQL や GraphQL のマネージドサービスである AWS AppSync の記事を随時公開しておりますので、ご興味のある方はほかの記事ものぞいてみてください!

AppSync に関する開発は、お気軽にお問い合わせください。