こんにちは!
今回は、AppSync で HTTP データソースを使って SQS を使ってみます!現在、データソースで SQS を指定することはできませんが、AppSync から SQS を使ってみたいと思っている方はぜひ参考にしてください。
現在、AppSync で SQS を利用するには、マネージドサービスとはいえ GUI 画面で選択すればできるというわけではありません。
しかし今回紹介するアプローチで AppSync を設定すれば利用が可能となります。ぜひ参考にしてください。
AppSync で SQS を利用するには、HTTP データソースを利用します。
手順としては AppSync ⇒ SQS 用の IAM ロールの作成、HTTP データソースの作成を順に行うことで利用できるようになります。
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: '*'
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 を作成しておきます。そのあとに、作成済みの 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 に関する開発は、お気軽にお問い合わせください。
スモールスタート開発支援、サーバーレス・NoSQLのことなら
ラーゲイトまでご相談ください
低コスト、サーバーレスの
モダナイズ開発をご検討なら
下請け対応可能
Sler企業様からの依頼も歓迎