今回はNext.jsアプリケーションにAmazon Connectの標準CCPを埋め込み、かかってきた電話がどのキュー経由でかかってきたか視覚的に確認できるアプリケーションを作成したいと思います。
Next.jsは今盛り上がっているフレームワークなので是非使いたいですよね。
当初私はamazon-connect-streamsのライブラリの影響でNext.jsとは相性が良くないと思っていたのですがNext.jsの勉強も兼ねて試しに作ってみたら動作したのでご紹介をしたいと思います。
※なお、本記事はNext.jsとamazon-connect-streamsの組み合わせが絶対的に安全であるという主張ではないのでもし本番運用を想定している場合は要件が実現できるか必ずPoCをすることを推奨いたします。
※また、本記事では動画も載せますがVercelやその他ホスティングサービス等にデプロイはしておらず動作確認は全てローカルで行いましたのでご注意ください。デプロイ環境によっては動作しないことなども考えられます。
Next.js環境を構築
はじめにNext.js環境を構築します。
ちなみに筆者の使用環境は以下です。
Node.js: ^20
TypeScript: ^5
React: ^19
Next: 15.1.3
OS: MacOS
まずはcreate-next-appコマンドを使用します。
1 2 3 4 5 6 7 8 9 10 |
npx create-next-app@latest What is your project named? nextjs-amazon-connect-custom Would you like to use TypeScript? Yes Would you like to use ESLint? No / Yes Would you like to use Tailwind CSS? No / Yes Would you like your code inside a `src/` directory? No / Yes Would you like to use App Router? (recommended) No / Yes Would you like to use Turbopack for `next dev`? No / Yes Would you like to customize the import alias (`@/*` by default)? No / Yes What import alias would you like configured? @/* |
次にamazon connect streamsライブラリをインストールします。
1 |
yarn add amazon-connect-streams |
これで準備完了です。
フロントエンドコーディング
先に本記事で作成したコードはこちらのリポジトリに公開しているので全体のコードを確認したい方はこちらからどうぞ。
また、このコードはクローンして環境変数にAmazon Connectのインスタンスエイリアス名を入力したら実際にローカルで試してみることも可能です。
その際にAmazon Connectのインスタンス設定にて承認済みオリジンのところにlocalhost:3000などローカルサーバーを追加してください。
追加を忘れると動作致しませんのでご注意ください。
今回はPage Router ではなくAppRouterを採用しております。
それでは初期状態のlayout.tsを編集します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import type { Metadata } from "next"; import { FC } from "react"; import "./globals.css"; export const metadata: Metadata = { title: "Create Next App", description: "Generated by create next app", }; const RootLayout: FC<{ children: React.ReactNode; }> = ({ children }) => { return ( <html lang="ja"> <body> <main className="w-screen h-screen">{children}</main> </body> </html> ); }; export default RootLayout; |
このような形ですね。
次にpage.tsxを以下のように設定します。
1 2 3 4 5 6 7 8 9 10 11 |
import CCP from "@/components/ui/CCP"; import { FC } from "react"; const Home: FC = () => { return<CCP/>; }; export default Home; |
この二つはReact Server Componentsですが次に作成するCCPコンポーネントはClient Componentsになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
"use client"; import { useRef, useEffect, useState } from "react"; const CCP = ({}) => { const ccpContainerEl = useRef<HTMLDivElement>(null); const [queue, setQueue] = useState<string | null>(null); useEffect(() => { require("amazon-connect-streams"); if (ccpContainerEl.current) { connect.core.initCCP(ccpContainerEl.current, { ccpUrl: `https://${process.env.NEXT_PUBLIC_AMAZON_CONNECT_INSTANCE_NAME}.my.connect.aws/ccp-v2`, loginUrl: `https://${process.env.NEXT_PUBLIC_AMAZON_CONNECT_INSTANCE_NAME}.my.connect.aws/ccp-v2/login`, loginPopup: true, loginPopupAutoClose: true, softphone: { allowFramedSoftphone: true, }, }); connect.agent(async (agent: any) => { constagentConf = agent.getConfiguration(); console.log(agentConf); agent.onError((error: any) => { console.log(error); }); }); connect.contact(async (contact: any) => { contact.onConnected(() => { console.log("connected"); constqueue = contact.getQueue(); setQueue(queue.name); }); contact.onEnded(() => { console.log("ended"); setQueue(null); }); }); } return () => { connect.core.terminate(); ccpContainerEl.current = null; }; }, []); useEffect(() => { console.log(queue); }, [queue]); return ( <> <divclassName="h-2rem text-center text-2xl text-gray-750"> Queue: {queue || "非通話状態です"} </div> <div id="ccp-container" ref={ccpContainerEl} className="h-[calc(100vh-2rem)] w-full" /> </> ); }; export default CCP; |
こうですね。
動作確認
このように動作いたしました。
今回はQueue名を表示する機能をつけただけですがご覧のようにamazon connect streamsの情報を動的に取得することができたので拡張することができると思います。
また標準CCPを埋め込むだけでなくUIも自前で作成することもできるので標準CCPのUIでは実現できない要件を実装したい場合はお試しください。
最後に
ここまで読んでいただきありがとうございました。
この記事がどなたかの参考になったら幸いでございます。
他にも技術ブログをあげているのでそちらもよろしければ見ていってださい。
また、株式会社ギークフィードでは開発エンジニアなどの職種で一緒に働く仲間を募集しています。
弊社に興味を持っていただいたり、会社のことをカジュアルに聞いてみたいという場合でも、ご気軽にフォームからお問い合わせください。その場合はコメント欄に、カジュアルにお話したいです、と記載ください!
- Next.jsでAmazon Connectの標準CCPを埋め込み動的データを取得する方法 - 2025-01-06
- Twilio Flex v2.x.x系でLINE連携を実装する方法 - 2024-12-23
- AWS Bedrockを活用したAI生成テキスト評価と再生成の実装技法 - 2024-06-17
- AWSから公開されたJavaScriptランタイム「LLRT」を使ったLambdaをAWS CDKで構築する方法 - 2024-02-19
- 【Bun】JavaScriptでシェルスクリプトを書けると噂のBun Shell使ってみた - 2024-02-08