2019』の19日目のエントリです。System編」でした。今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。AWSをこれから学ぼう!という方にとっては文字通りの入門記事として、またすでにAWSを活用されている方にとってもAWSサービスの再発見や2019年のサービスアップデートのキャッチアップの場となればと考えておりますので、ぜひ最後までお付合い頂ければ幸いです。AppSync編』です。始める前にAppSyncは割と最近出たサービスにてアップデートのスピード感も凄いサービスです。構築事例やベストプラクティスは少ないです。それであくまでに本記事はAppSyncの使い方のベストプラクティスなどではなく、個人的な意見が多く含まれています。作成も読んでいただくと、より早く簡単理解できると思います。AppSyncとはAppSyncはAWSの管理系GraphQLサービスにて、ApolloやPrismaと比べてAWSからインフラやサーバーまで提供してくれるサービスになります。その場合私たちは何をすべきかというと以下の三つぐらいですね。GraphQLスキーマの定義リゾルバーの作成データソースおよびIAMロールの管理つまり、サーバーレスの形でGraphQLのバックエンドを実装できるサービスです。Lambdaなどを活かせてGraphQLのバックエンドを構築するのができましたが、この場合だとLambdaのメモリーサイズ、コールドスタート、データソースとの通信、認証ユーザーのトークン等直接開発しなければならないことがもっと多かったです。AppSyncを用いる場合にはGraphQLのスキーマを作成してフィールドごとのリゾルバーを作成するだけでGraphQLのエンドポイントが生成されます。何よりも本当に便利なのはリゾルバーをVTLというテンプレート言語で作成することです。VTLに初めて接する方には少し難解に見えるかも知れませんが、VTLでリゾルバーを作成するとほとんどの作業がコピー・アンド・ペーストだけでめっちゃ便利です!(しかし、デバッグは難しいです。Endpoint等データソースに直接繋がるためデータハンドルが簡単です。AppSyncを使うと便利機能がたくさんあって、バックエンドAPIを開発する時凄いスピードで開発できるところが長所です。Firebaseを用いても簡単に開発が可能ですが、Firebaseに比べてAppSyncの長所は完全なGraphQLサービスとしての優れた自由度と柔軟さにあります。ProjectAppSyncは四つのサンプルプロジェクトを提供しています。本記事を読んで本気でAppSyncをいじってみようと考える方がいらっしゃったら、このサンプルを必ず分析するのを推奨します。AppSyncの機能AppSyncコンソルに新たなAPIを作ると下のような画面が見えます。APIを生成した後のキャプチャ画面になります。左側に5つのメニューがあります。これからはメニューごとについて説明させていただきます!スキーマ(Schema)まずはスキーマ画面から始めます。Resourcesというボタンがあります。Resourcesボタンを押した時の画面です。Resourcesボタンを押して、スクロールするとこの項目も見えます。(DynamoDBのテーブル生成はもちろん、インデックスも一緒に生成できます)リソースを生成した時の画面です(この時点でDynamoDBの生成も終わった状態です)リゾルバー側から見える項目の中でMutation.createMyCustomTypeをクリックして自動生成されたリゾルバーを見てみましょう。このようにAppSyncを始めてる方のためにリゾルバーやスキーマな、データソースどが自動的に設定されます。このように自動的に生成されたスキーマが動作するかどうかをテストするためには、クエリメニューに移動して確認することができますが、クエリメニューに関しては少しあとで説明します。ここでちょっとだけ指摘したい部分があります。AppSyncコンソールでこんなに強力な機能を提供するにもかかわらず、本番環境ではこのAppSyncコンソールを使用して実装することは推奨されません。スキーマやリゾルバーの管理も難しいし、複数人での共同作業にも不都合があるし、いろいろ不便な点が多いからです。このためAWSからAmplifyというCLI+SDKを提供されています。APIの開発する以外にもCognitoユーザーとの連携やS3バケットのファイルアップロードなどクライアント側の開発が楽になるツールです。GraphQLのスキーマを作成してAppSyncにアップロードされるスキーマやリゾルバーを自動生成したり有用な機能がたくさんあります。細かい設定などは難しいところがあって、主に大学生達がアプリ開発プロジェクトを簡単にするためによく使っているそうです。それでは実際に実務で活用できるツールは何かというと、私はserverless-appsync-pluginをオススメします。全ての設定を一つのyamlファイルだけで出来るのでとても楽です。IaCは当然基本的にCloudFormationを使っても可能ですが、AppSyncだけではCloudFormationテンプレートを直接作成するのは推奨しません。人生が辛くなるはずです。(笑)AppSyncの概念説明が終わったらserverless-appsync-pluginを使って簡単なAPIを実装します。その前に一旦スキーマのスカラータイプに進めます。checkをやっています。リクエストやレスポンスでやり取りするデータごとがIntタイプかStringタイプかを開発者がもう検知しなくていいってことです。GraphQLで定義してる一般的なスカラータイプは下のようです。IDStringIntFloatDoubleAppSyncはこれに追加して下のスカラータイプを提供しています。これらを活かせてより楽に開発できます。AWSDateAWSTimeAWSDateTimeAWSTimestampAWSEmailAWSJSONAWSURLAWSPhoneAWSIPAddressスカラータイプについてのより詳細な説明はAWSドキュメントをご参照ください。下のコードはスカラータイプを活用した例です。Resourcesを通じて自動生成されたリゾルバーの画面からもご覧になったと思いますが、リゾルバーはVTLというJAVAベースのテンプレート言語にて作成することになっています。Template)と呼ばれます。一つのリクエスト用マッピングテンプレートと一つのレスポンス用マッピングテンプレートで一つのリゾルバーを成すことになります。そのリゾルバーのマッピングテンプレートをマッピングテンプレートで呼ぶ理由は、本当にデータをマッピングするだけでいいからです。データソースに接続してコネクションを管理したりする必要なくデータをマッピングだけすれば後はAppSync側から処理してくれます。AppSyncで使わられるリゾルバーのタイプは二つあります。Resolver)名前の通りです、で一発で説明が終わってしまうリゾルバーです。一つのデータソース(DynamoDB、RDS等)と連携させて処理するリゾルバーになります。Resolver)実際にGraphQLのAPIを実装してみるとユニットリゾルバーで解決できない複雑なロジックがたくさんあります。Friendshipテーブルから二人が友達に登録された場合のみロジックを実行するとか、ポイントを使って決済する場合Pointテーブルにユーザのポイントが十分な場合のみ決済ロジックを処理するとかのいろんな状況があるかと思います。この時に有用な機能がパイプラインリゾルバーになります。パイプラインリゾルバーは元々はユニットリゾルバーなはずの個別のリゾルバーをFunctionとして登録して使用します。このFunctionというのは他のリゾルバーからも共有されて利用出来ますので共通的なロジックをFunctionとして作っておいてから様々なパイプラインリゾルバーから使うパターンも可能です。本記事では扱いませんが、serverless-appsync-pluginを通じても簡単にパイプラインリゾルバーを作成できます。Sources次はデータソースについて説明させていただきます。Sourcesメニューをクリックしたらこのような画面が見えます。これは私が予め登録しておいたデータソースです。Sourceボタンを押すとすぐ作られます。現時点でAppSyncでデータソースにて登録可能なタイプは以下の6種類になります。Templateによって行われます。このとき,真ん中の部分に位置したのがFunctionになります。resolverに対して詳しく扱っていないのでFunctionsについて簡単に見るだけで行きます。Functionsメニューをクリックすると下のような画面が見えます。今は一つのFunctionを登録しておいた状態です。functionボタンをクリックするとデータソース及びFunctionの名前、リクエスト用マッピングテンプレートやレスポンス用マッピングテンプレートの設定が可能です。ユニットリゾルバーからパイプラインリゾルバーに変えると、生成されたFunctionをパイプラインリゾルバーのFunctionとして登録できます。赤のボタンを押すとユニットリゾルバ−からパイプラインリゾルバーに変更されます。先ほど作ったFunctionを追加した場合このようになります。ドキュメントをご参照できればと思います。クエリ(Queries)クエリメニューはGraphQLのPlaygroundみたいな機能を提供します。Cognitoなどを使ってログインした状態でクエリを実行してみたり、ログアウトした状態でクエリを実行してみたりするのができます。左側がリクエスト、右側はレスポンスです。Key、Cognito、IAM、OpenID)やロギングなどを設定するのが可能です。Settingsに関してはあまり直観的すぎてこれ以上説明が要らないと思います。(笑)それでは、これからは簡単なチュートリアルを通じてserverless-appsync-pluginを活用してAppSyncのプロジェクトをどうやって作るのかを紹介します。Frameworkのserverless-appsync-pluginを活かせて簡単なAppSyncプロジェクトを構築してみます。本チュートリアルで使うデータモデルは以下の三つです。AWSDateTime!}テストのシナリオは以下の通りです。Repositoryでご確認ください。プロジェクトの初期セッティング本チュートリアルを実行するためには以下のツールのインストールが必要になります。npmServerless私が使っているツールのバージョンはこれです。プロジェクトのディレクトリを構成します。私はappsync-tutorialという名前のディレクトリから作業します。10.12sみたいに出力されたら完了です。Schema今回はスキーマを作成します。stitchingという機能を提供していますので、スキーマをModuleごとに分けて作成できます。like.graphql三つのスキーマが用意されたら以下のようにスキーマを作成しましょう。User}ユーザータイプは名前とEメールをインプットとして生成し、idやcreatedAtフィールドはリゾルバーにて自動生成します。postsフィールドの場合は他のフィールドとは異なり、UserテーブルではなくPostテーブルからデータをもたらします。この部分に関してはserverless.ymlファイルを作成する際に改めて説明します。["createPost"])}ポストタイプはユーザーと比べてサブスクリプション(Subscription)が登場しました。サブスクリプション(Subscription)はAppSyncのミューテーション(Mutation)が実行された際、クライアント側にそのデータを伝達してくれます。本チュートリアルはcreatePostが実行されたらonNewPostCreatedというサブスクリプションを登録したクライアントにリアルタイムでそのデータを伝達するシナリオを検証します。AppSyncのサブスクリプションはWebSocket上でMQTTプロトコルで行われっています。詳細な内容はAWSドキュメントをご覧ください。["cancelLikePost"])}最後にライクタイプです。ライクタイプはサブスクリプションがポストタイプと異なり、特定なポストIDについてのサブスクリプションのみが得られます。それ以外にもページネーションなど複雑なクエリのためのフィルターなどの設定も可能になりますが、本チュートリアルはあくまでAppSyncをより直観的に理解できるようにするためそこまでの設定はしていません。AppSyncが提供しているサンプルプロジェクトではこのような様々なパターンを学べますのでご参照くださいませ。Template)次はresolversです。多くのリゾルバーファイルを作らなければいけません。見方によっては一番面倒な作業であるかもしれませんが、実はこれはAmplifyを活用すれば必要なリゾルバーファイルやコードが自動的に生成されてとても便利です。Amplifyは必要に応じて適切に活用しましょう。本チュートリアルではシンプルに説明するため一つずつ全部作ってみます。この時、ファイル名が結構重要になります。serverless-appsync-pluginからdefaultに認識するファイル名がありますので、できれば以下のようなルールを守りましょう。{type}.{field}.respose.vtlスカラータイプやサブスクリプションに関してのリゾルバーは要らないです。Mutation.cancelLikePost.response.vtlかなり多くのファイルができてしまいました。これらをいつ全部作成するのって思っている方もいらっしゃるかもしれませんが、実はこのリゾルバー、ほぼコピー・アンド・ペーストです。Repositoryをご確認ください。ここではこの中でいくつかだけ見てみます。}}Mutation.createUser.response.vtl$util.toJson($context.result)VTLの文法を初めてご覧になった方だとコレなに?って感じるかもしれませんが、AppSyncで使うVTLの説明に関しましてはAWSドキュメント上でやさしく説明されており本当に分かりやすいです。ここには文法抜きでコードの流れの観点で説明させていただきます。最初はそれぞれのリゾルバーまたはマッピングテンプレートを登録する時どのデータソースと繋がるかを選択します。本チュートリアルで使っているserverless-appsync-pluginを利用する場合にはserverless.ymlファイルに作成します。(少し後で説明させていただきます)なのでマッピングテンプレートを読む際はデータソースがもう決まっている状態になります。Mutation.createUser.request.vtl及びMutation.createUser.response.vtlではDynamoDBのUserテーブルと連携されています。"version"はいつでもこのままで"2017-02-28"となります。"operation"はDynamoDBだとcreateUserに該当するoperationが"PutItem"になります。以降のフィールドに関しましてはどんなoperationに該当するかによって異なりますが、ここのDynamoDBのPutItemはKeyとAttributeを要求するため上記のように作成します。Referenceページから詳細な内容を確認できます。}}User.posts.response.vtl$util.toJson($context.result.items)Userタイプにはpostsというフィールドがありました。このフィールドだけはUserテーブルではなくPostテーブルから持します。User.posts.request.vtlを見ると"index"という項目があります。userId-indexを参照して該当するuserIdによる全てのPostをリストで持たせることになります。このGSIもserverless.ymlから定義できます。serverless.yml次は上の全てリソースをyamlファイルにて管理するserverless.ymlについて説明させていただきます。frameworkの"frameworkVersion"が異なる場合必ずこの値を変えてください。"provider"にて"stage"や"region"等を設定してCloudFormationが動作するregionを決めます。スタック一つになります。"plugins"は"serverless-appsync-plugin"を入力します。"custom"の"appSync"の下位に作成されたものをserverless-appsync-pluginで読み込んで処理することになります。Poolを生成して作業します。"userPoolConfig"の下にある"userPoolId"の"Ref"は、"custom"項目下の"resources"のAWS:Cognito:UserPoolのUserPoolNameと一致しなければなりません。"appSync"の"region"を見てください。この項目は直接入力しなくても自動的に"provider"の"region"に設定されます。"mappingTemplatesLocation"はVTLファイルが位置されたディレクトリの経路を意味します。ディフォルトでmaping-templatesが設定されていますが本テュートリアルではresolversというフォルダーの下にVTLファイルを置いたのでresolversと書いておきます。次は"mappingTemplates"です。"type"はGraphQLスキーマのtypeを意味します。Userタイプの場合はpostsというPostタイプのフィールドがありましたが、postsはスカラータイプではない為、このフィールドに該当する別のリゾルバーが必要になります。Postもう一つの例を挙げるとlistUserの場合typeがQueryでした。listUserが接続されるデータソースはDynamoDBのUserテーブルですので下のようになります。Userここでリクエストやレスポンス用のマッピングテンプレートのファイル名は書いてありません。{type}.{field}.response.vtlをデフォルト値として決められています。そのコンベンションに従い本チュートリアルではrequestやresponse項目はなしで進めます。Roleを生成する役割があります。実際にテーブルを作るのは"custom"の下の"resources"で行います。RoleのActionを以下のように設定しましたが、実際のプロジェクトの時は必要な権限のみ含めたほうが推奨です。dynamodb:*最後に"resources"項目です。Pool及びDynamoDBのテーブルの生成を担当しています。Index)もここで生成します。デプロイここまで完了しましたらディプロイは簡単です。-v上記のコマンドを入力したらCloudFormationを通じてディプロイが始まります。slsはserverlessのaliasです。テストしてみよう(Queryメニュー)これからはAWSコンソールに接続して上記のテストシナリオを確認してみます。Userを作りましょう。Cognitoのサービスに移動します。Poolボタンをクリックします。先ほどのディプロイから生成されたUserPoolをクリックします。ボタンをクリックします。Poolを生成した時設定した通りユーザを作ります。email本チュートリアルではemailをユーザ名として使います。パスワードはただ8字以上であればOKです。メニューをクリックします。確認してコピーしておきます。AppSyncコンソルに入ります。Queryメニューをクリックして下のような画面に移動します。クエリを実行する前にログインが必要なのでログインボタンをクリックしてログインしましょう。最初のログインをしたらパスワードの変更が必要です。ユーザから作ってみます。左側のようなミューテーションを書いて実行してみると右側の結果が出してきます。次はポストを作ってみます。新しいユーザとポストを作った後、リストクエリを実行します。今度は特定のユーザのポストのみをリストで持たすlistPostByUserクエリの実行結果です。予想した通りよく動いています。次はサブスクリプションがよく動いているのかどうかを確認する為、もう一つのウェブブラウザーを用意します。新しいポストが生成された際にサブスクリプションが動作するかを確認してみます。右側のブラウザーではサブスクリプションを実行して新たなデータが生成されるのをお待ちしています。左側のミューテーションを実行すると下の画面のように右側に結果が伝達されたのを確認できます。はい、よく動いてます!最後に特定なポストのいいねの生成のみをサブスクリプションできるかどうかも確認してみます。左側のミューテーションの実行をお待ちしている画面です。左側のpostIdと右側のpostIdが異なっていますので、予想される結果は右側に何も伝達されないってことです。左側のミューテーションを実行したら左側の結果は出てきましたが、30秒ほど待っていても右側は何も起こっていませんでした。今回は同じpostIdで設定してみます。Repositoryの完成されているコードから試してください。AppSync』編でした。Serverlessサポートなどのメイジャーアップデートを続いてきました。最近リリースされたサービスですので、まだ使い方やベストプラクティスなどはよく知れていません。実際にAppSyncをいじってみた結果、思ったよりすごく便利なサービスだったことが分かりました。本記事がAppSyncに入門しようといらっしゃる方へ少しでも役に立ったらとても幸いです。93,602まだプロフィールが設定されていません。リモート】クラスメソッドの会社説明会を開催しますクラスメソッドでは、AWS・AI・ビッグデータ・モバイルなどの技術職や営業のメンバーとして一緒にお仕事をする仲間を大募集しています。〜ITエンジニアのお仕事とホンネ〜1月30日に新卒向けの会社説明会〜ITエンジニアのお仕事とホンネ〜を開催します。濱田孝治80EKS初心者の方向けに、EKS周辺のAWSリソースがどのように関連して動作しているのかをステップバイステップでEKSCTLが担っている役割を中心に説明しました。菊池修治45こんにちは、菊池です。VPNの冗長化について、最近何度か続けて社内で質問を受けましたのでまとめようと思います。大前諒祐26MediaLiveでの配信終了時に自動でアーカイブファイルをMediaConvertで変換する仕組みを作ってみました。武田隆志1179このエントリは、2018年、2019年に公開したAWS全サービスまとめの2020年版です。これまではいくつかに分割して公開していましたが、1エントリにまとめてほしいという要望をもらっていたため、今年は1エントリに集約してみました。クラスメソッドの関連会社であるアノテーション株式会社の研修として依頼を受け、チームと心理的安全性、それに礼節というテーマで話をしてきました。CAFEのサービスが「LINEアプリ」として利用できるようになりました。これまではLINEのトークから利用する形でしたが、LINEサービス内から利用できるようになりました。これまでより便利に、シームレスにご利用いただけます。Cafe328件のシェア(そこそこ話題の記事)インフラ未経験の私が内定から入社までに読んだ技術書11冊ブログ記事2020年01月16日Yui328インフラ未経験で入社した私がインフラを勉強するために読んだ技術書11冊を感想とともにまとめました。濱田孝治272「ふわわぁ、眠いな。クラスメソッド株式会社が運営するAWS・iOS・HTML5に関する技術情報サイトです。