AppSyncでSQSを使ってみた!HTTPデータソースの設定方法も解説🥳

AppSyncでSQSを使ってみた!HTTPデータソースの設定方法も解説🥳

こんにちは!

今回は、AppSync で HTTP データソースを使って SQS を使ってみます!現在、データソースで SQS を指定することはできませんが、AppSync から SQS を使ってみたいと思っている方はぜひ参考にしてください。

想定する読者

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

はじめに

現在、AppSync で SQS を利用するには、マネージドサービスとはいえ GUI 画面で選択すればできるというわけではありません。

しかし今回紹介するアプローチで AppSync を設定すれば利用が可能となります。ぜひ参考にしてください。

AppSync と SQS の接続

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

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

IAM ロールの作成

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

信頼関係は AppSync と、権限は CloudWatch Logs と SQS を持つロールを作成しましょう。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:
              - sqs:*
              - logs:CreateLogGroup
              - logs:CreateLogStream
              - logs:PutLogEvents
              Resource: '*'

HTTP データソースの作成

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

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

SQS にメッセージを送ってみる

それでは SQS にメッセージを送ってみましょう。

まず事前に SQS を作成しておきます。そのあとに、作成済みの AppSync にてスキーマの追加とリゾルバーの作成を行います。CloudFormation では以下のようになります。

Resources:
  GraphQLSchema:
    Type: AWS::AppSync::GraphQLSchema
    Properties:
      ApiId: !GetAtt GraphQLApi.ApiId
      Definition:  |
        type Message {
          id: ID!
          message: String!
        }

        type Mutation {
          sendMessage(input: SendMessageInput!): Message
        }

        type Query {
          sample: String
        }

        input SendMessageInput {
          message: 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: "sendMessage"
      Kind: UNIT
      RequestMappingTemplate: |
        {
          "version": "2018-05-29",
          "method": "GET",
          "resourcePath": "/0123456789/appsync-demo-queue",
          "params": {
            "query": {
              "Action": "SendMessage",
              "Version": "2012-11-05",
              "MessageBody": "$util.urlEncode($util.toJson($ctx.args.input))"
            }
          }
        }
      ResponseMappingTemplate: |
        #set( $result = $utils.xml.toMap($ctx.result.body) )
        {
          "id": "$result.SendMessageResponse.SendMessageResult.MessageId",
          "message": "$ctx.args.input.message",
        }

リクエストでは resourcePath のところで対象の AWS アカウント ID +キュー名を設定してください。SQS に対する操作は、今回 SendMessage を指定しております。

ちなみに SQS のレスポンスは XML 形式のため、 $utils.xml.toMap() を利用して JSON に変換しています。

ではこの設定で AppSync を使って SQS にメッセージを送ってみましょう。

無事にメッセージが送信されました!

HTTP データソースを使った SQS の操作は、リクエストマッピングテンプレートで対象のキューを指定しますので、ご利用の際は忘れずに設定するようにしましょう。

また SQS に限らず、HTTP データソースを指定した場合は、https://sqs.ap-northeast-1.amazonaws.com のように AWS のエンドポイントを設定します。SNS の場合も同様となります。

ご覧の通り AppSync で SQS を利用する設定は簡単にできるのでぜひ試してみてください!

関連記事

まとめ

現状は HTTP エンドポイントで SQS を対応していますが、今後 AppSync がアップデートされていくにつれて、選べるデータソースが増えていくかもしれませんね。今後に期待です!

このブログでは、GraphQL や GraphQL のマネージドサービスである AWS AppSync の記事をどんどん公開しておりますので、ご興味のある方はほかの記事もご覧いただければと思います。

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