こんにちは!
AppSync ではいろんなデータソースを選択できますが、SNS って選択肢にないですよね?でも、HTTP データソースを指定すれば SNS と連携することが可能です。
今回は気になる AppSync における SNS の使い方を解説していきます!
HTTP データソースを理解し活用することができれば、AppSync の可能性を広げることができます。
AppSync の仕組みを知る上でも、様々なデータソースに触れておいて損はないと思うので、お時間のある方は記事を読みながら AppSync をぜひ触ってみてください。
AppSync で SNS を利用するには、HTTP データソースを利用します。
手順としては AppSync ⇒ SNS 用の IAM ロールの作成、HTTP データソースの作成を順に行うことで利用できるようになります。
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: '*'
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トピックに 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 に関する開発は、お気軽にお問い合わせください。
スモールスタート開発支援、サーバーレス・NoSQLのことなら
ラーゲイトまでご相談ください
低コスト、サーバーレスの
モダナイズ開発をご検討なら
下請け対応可能
Sler企業様からの依頼も歓迎