吉岡です。最近寒くなってきましたね。 鍋と熱燗とコタツの季節が来たと思うと、少しテンションが上がります!
さて、今回はAWS Amplifyを利用して開発を行った際にAppSync(GraphQL)について得た知見について書きたいと思います。
AWS Amplifyを利用してウェブアプリケーションを作りました。そして、バックエンド側でAWS AppSyncを利用して入力されたデータに対して、定期的にLambda(Node.js)を実行して、不要になったデータの削除する処理を行う処理を実装しました。
ちなみに、AWS Amplify と AWS AppSyncはAWSが提供しているマネージドサービスで、フロントエンドがデプロイできたり、GraphQLをお手軽に利用できるサービスになります。
参考:AWS Amplify
https://aws.amazon.com/jp/amplify/
参考:AWS AppSync
https://aws.amazon.com/jp/appsync/
まずは、今回一番のハマりどころであった、APIへアクセスする際の認証について書きたいと思います。
AppSyncにアクセスする時に制限をかける場合はIAMを利用した方法とApiKeyを利用した方法があります。今回はApiKeyを利用したアクセスではなく、IAM(ロール)を利用したアクセスを考えました。(ApiKeyの管理とかしたくない)
まず最初に、Amplifyのドキュメント(Functions - Overview - Amplify Docs)にLambdaからAppSync(GraphQL)へのアクセス方法が書かれていましたので、そちらを参考にささっとコードを書いて実行したのですが、うまく動かず。。
他に情報はないかと思い、検索すると情報はそこそこ出てきました(技術系ブログがよく引っかかりました)。ですが、その多くはApiKeyを利用したアクセス方法の解説でした。IAM(ロール)を利用したアクセス方法はなかなかこれと言った情報が見つかりませんでした。
仕方なくAWSのドキュメントに戻り、「認証」というキーワードを頼りにあちこち調べたら、認証モードが IAM である場合には、 IAM クレデンシャルを使用した署名をリクエストに付与する必要がということで、何やら署名を取得しないといけないようです。
AWS API リクエストの署名 - AWS 全般のリファレンス
上記ドキュメントを読みながら、さらに調べましたところ、なんと!参考サイト(上記Amplifyのドキュメント)のやり方ではなく、AppSyncのドキュメント(NodeJS クライアントアプリを作成する - AWS AppSync)の方を参考にすると解決できました!!
AppSyncのドキュメントを見るのはそりゃそうか!最初っからAppSyncで探せば良かった!!と思いつつも、Amplifyのドキュメントのサンプルで動かなかったのは謎です。。(cognitoの絡みかしら?と思いつつ、そっとブラウザのタブを閉じました。)
実際のコードは以下のような感じです。
const aws = require('aws-sdk') const AWSAppSyncClient = require('aws-appsync').default const gql = require('graphql-tag') const listTempUserDatas = gql` query ListUserDatas( $filter: ModelUserDataFilterInput $limit: Int $nextToken: String ) { listUserDatas(filter: $filter, limit: $limit, nextToken: $nextToken) { items { id email name timestamp } nextToken } } ` const url = process.env.API_TEMPDATAAPI_GRAPHQLAPIENDPOINTOUTPUT const region = process.env.REGION const client = new AWSAppSyncClient({ url: url, region: region, auth: { type: 'AWS_IAM', credentials: ()=> aws.config.credentials }, disableOffline: true }) exports.handler = async (event) => { console.log('Reference Time:', new Date(referenceTime)) try { const response = await client.query({ query: listTempUserDatas }) const items = response.data.listTempUserDatas.items console.log('items: ',items) return { statusCode: 200, body: items, headers: { "Access-Control-Allow-Origin": "*", } } } catch (err) { console.log('error posting to appsync: ', err) } }
その他、いくつかハマったところがありましたので、紹介したいと思います。
const AWSAppSyncClient = require('aws-appsync').default
aws-appsyncをrequireしてるのですが、これを通常のnpm installを利用すると Lambda 関数 xxxx のデプロイパッケージが大きすぎて、インラインコード編集を有効にできません。
というメッセージが表示されてインライン編集ができなくなってしまいます。
別途aws-appsyncがrequireされたLayerを準備して、使用するLambdaに設定(追加)する必要がありました。
Layerについては以下のドキュメントをご確認ください。
AWS Lambda レイヤー - AWS Lambda
そもそもNode.jsをよく理解していなかった話ですが、LambdaでNode.jsを利用して通信する場合は非同期処理(async, await)の利用は必須でした。
Node.js の AWS Lambda 関数ハンドラー - AWS Lambda
最初よく分かってなくて、なかなか思ったようなレスポンスが得られなくて苦労しました。
Amplifyを利用しているからと行ってAmplifyのドキュメントばかり調べるのではなく、Amplifyが利用しているサービスのドキュメントも調べる。(今回はAppSyncのドキュメントも見るべきでした)
以上、無事にLambdaからAppSyncにアクセスできるようになり、無事にスケジューリングされた処理を実行できるようになりました!個人的には学習コストは高めだと思いますが、覚えてしまえば非常に便利で開発速度が上がりそうです。
今後も、積極的にAWS Amplifyを利用していきたいと思います!!
![]() |
「AWS Amplify」を利用して、ログイン画面の実装について手順を紹介します。 |
![]() |
お客様のご協力により、サービスを改善できたことはとてもうれしいです。 |
![]() |
想像していた以上に簡単に室温管理・分析のための仕組みを構築することができました。 |
![]() |
フレックスタイム制の導入で従業員の満足度向上・労務管理の簡素化などが実現できました。 |
![]() |
マインドマップ作成ツール「XMind」を使用。マインドマップを用いることで頭の中が整理されより理解を深めることができます。 |
![]() |
社員研修に伴うサポート体制変更・休業のお知らせ(5/20〜23) 社員研修に伴い、5月20日〜23日はサポート体制の変更および休業とさせていただきます。 |
![]() |
オープンソースカンファレンス2025 Nagoyaに弊社代表の前田が登壇(ブース出展あり) オープンソースカンファレンス(OSC)2025 Nagoyaに弊社代表の前田が登壇。『Redmineの意外と知らない便利な機能(Redmine 6.0 対応版)』をテーマに発表します。 |
![]() |
エンタープライズプラン向け「優先サポート」を開始 My Redmineでは、エンタープライズプランをご契約のお客様向けにサポート対応を優先的に行う「優先サポート(プライオリティサポート)」を開始いたしました。 |
![]() |
プロジェクト管理ツール「RedMica」バージョン 3.1.0をリリース Redmine互換のオープンソースソフトウェア ファーエンドテクノロジー株式会社は、2024年11月19日(日本時間)、Redmine互換のプロジェクト管理ソフトウェア「RedMica 3.1.0」をリリースしました。 |
![]() |
Redmineの最新情報をメールでお知らせする「Redmine News」配信中 新バージョンやセキュリティ修正のリリース情報、そのほか最新情報を迅速にお届け |