主要処理フローの通信シーケンスを表示。タブで切り替えてください。
関連するLambda・データストア・外部連携を機能クラスタ別に表示。各クラスタをクリックすると詳細が展開されます。
| 指標 | 結果 | 目標値 |
|---|---|---|
| レスポンスタイム(p95) | 103ms | 3,000ms以下 |
| Lambdaスロットル | 0件 | 0件 |
| ピーク同時接続数 | 1,200 / 1,200人 | 1,200人 |
| 総リクエスト数 | 214,014件 | — |
| 指標 | 結果 | 目標値 |
|---|---|---|
| 残業サマリー取得(p95) | 280ms | 3,000ms以下 |
| エラー率 | 0.00% | 1%未満 |
| Lambdaスロットル | 0件 | 0件 |
| 指標 | 結果 | 目標値 |
|---|---|---|
| 打刻書き込み(p95) | 524ms | 3,000ms以下 |
| エラー率 | 0.00% | 1%未満 |
| Lambdaスロットル | 0件 | 0件 |
| 指標 | 結果 | 目標値 |
|---|---|---|
| タスク取得(p95) | 276ms | 3,000ms以下 |
| エラー率 | 0.00% | 1%未満 |
| Lambdaスロットル | 0件 | 0件 |
| アーカイブ方法 | Xcode 手動アーカイブ(方法B) |
| 署名 | Ad Hoc プロビジョニングプロファイル |
| 出力 | IPAファイルをエクスポート |
| 配布 | テストデバイスに直接インストール |
| プロファイル名 | WTR-Internal-Adhoc-Testing |
| Bundle ID | com.benben0505.Project01App20250531 |
| 有効期限 | 2026年10月27日 |
| 登録デバイス数 | 26台(上限100台 / 年) |
| 配布方式 | Apple Business Manager + カスタムアプリ配信 |
| メリット | UDID登録制限なし(本番展開対応) |
| 対象 | 全社員への展開 |
アプリは3つの外部エンタープライズシステムと連携しています。タブで各システムの認証設定・API・Lambda構成・トラブル対処を確認できます。
| 項目 | 値 / 説明 |
|---|---|
| OAuth アプリ名 | Mobile App Flow API(ServiceNow Application Registry に登録) |
| Grant Type | client_credentials |
| Token エンドポイント | POST {SN_URL}/oauth_token.do |
| トークン有効期限 | 60分(Lambda 内 60秒バッファ付きキャッシュ) |
| Lambda 環境変数 | SN_URL / SN_CLIENT_ID / SN_CLIENT_SECRET(全5 Lambda に設定) |
| Lambda | テーブル / エンドポイント | 操作 |
|---|---|---|
| ServiceNowLambda | u_work_task | 担当タスク一覧取得(最大1,000件) |
| ServiceNowUpdateStatusLambda | Flow: workstateupdate_ejecmobileapp | タスク状態更新(state フィールド書き込み) |
| ServiceNowMetricInstanceLambda | metric_instance | 作業時間レコード取得(直近3日間) |
| ServiceNowUpdateMetricTimeLambda | Flow: mobile_edit_workflow_time | 作業開始・終了時刻の更新 |
| PMLambda | u_work_task | プロジェクト管理者向けタスク取得 |
| フロー名 | トリガー | 処理 | 重要な注意点 |
|---|---|---|---|
workstateupdate_ejecmobileapp | REST PATCH(非同期) | 入力: record_sys_id, state → u_work_task.state を更新 | ⚠ スクリプトステップは必ず Global スコープ で実行。EJEC Mobile App スコープのみでは u_work_task の ACL に阻まれ .update() が null を返す |
mobile_edit_workflow_time | REST PATCH(非同期) | 入力: metric_instance_sys_id, new_start, new_end → duration を自動計算して更新 |
| 症状 | 原因 | 対処 |
|---|---|---|
| タスク取得が空 / 401 | OAuth トークン失効 or 環境変数未設定 | Lambda 環境変数を確認。CloudWatch で [ServiceNowLambda] ログ参照 |
| 状態更新が反映されない(エラーなし) | Flow のスクリプトが EJEC スコープで動作し ACL にブロックされている | Flow Designer のスクリプトステップを Global スコープに変更 |
| Flow の入力値が空 | トリガーボディの変数がフローにワイヤリングされていない | Input Variable に inputs.record_sys_id 等を正確にマッピング |
| OAuth App の User フィールドが空 | ServiceNow UI では非表示のフィールド | REST API で PATCH /api/now/table/oauth_entity/{sys_id} に {"user":"<user_sys_id>"} を送信 |
| 項目 | 値 / 説明 |
|---|---|
| SOAP Login URL | https://ejec-saleforce.my.salesforce.com/services/Soap/u/59.0 |
| Lambda 環境変数 | SF_USERNAME / SF_PASSWORD(パスワード+APIセキュリティトークンを連結した文字列) |
| セッション有効期限 | 90分(Lambda モジュール変数にキャッシュ) |
| REST クエリ URL | {instanceUrl}/services/data/v59.0/query |
| オブジェクト | Lambda | 用途 | 主なフィールド |
|---|---|---|---|
WorkItem__c | ServiceNowLambda | ServiceNow タスクとプロジェクト情報のクロス参照(TransferId で紐付け) | WRI_TransferId__c, WRI_ProjectName__c, WRI_Gijutsusha__r.Name |
Bumon__c | PMSalesforceLambda | 個別プロジェクト詳細(契約期間・進捗・予算状況) | BMN_AccountName__c, BMN_KeiyakuKokiFromDate__c, BMN_YosanshoStatus__c |
| 症状 | 原因 | 対処 |
|---|---|---|
| SOAP ログイン失敗 | SF_PASSWORD にセキュリティトークンが連結されていない | [設定 → セキュリティトークンのリセット] で新トークンを取得し パスワード+トークン の形式で設定 |
| プロジェクト情報が空 | WRI_TransferId__c が ServiceNow タスクと一致しない | ServiceNow の u_work_item_number と Salesforce TransferId を照合 |
| Socket hang-up / タイムアウト | ネットワーク不安定 | Lambda は最大3回・1秒間隔で自動リトライ。継続する場合は Salesforce 側の API 制限を確認 |
| 項目 | 値 / 説明 |
|---|---|
| IAS テナント (test) | ejec-qas-sa001.authentication.jp10.hana.ondemand.com |
| OData ベース URL (test) | ejec-qas-btp001-sf01-bxlbe-odata-srv.cfapps.jp10.hana.ondemand.com/odata/v4/kinmu |
| Lambda 環境変数 | TOKEN_URL / CLIENT_ID / CLIENT_SECRET / ODATA_BASE_URL / TOKEN_TABLE_NAME |
| コールバック URI | https://{api-gateway}.execute-api.ap-northeast-1.amazonaws.com/{stage}/callback |
| トークン保管先 | DynamoDB: SSOBTPToken — PK: USER_{email} SK: CURRENT |
| Lambda | トリガー | 役割 |
|---|---|---|
| SSOBTPIASLambda | API Gateway GET /callback | OAuth 認可コードを受け取りアクセス・リフレッシュトークンを取得。id_token から empCode とメールを抽出して DynamoDB に保存 |
| BTPSSOLambda | AppSync GraphQL | 打刻操作(001=出勤 / 002=退勤)。DynamoDB からトークン取得 → OData 送信 → 401 時に SSORefreshToken を呼び出してリトライ |
| SSORefreshToken | BTPSSOLambda 呼び出し(リアクティブ) | refresh_token で新アクセストークンを取得。分散ロック+ランダムジッター(0〜300秒)で同時リフレッシュを防止 |
| BTPTokenRefresherLambda | EventBridge rate(30分)(プロアクティブ) | 60分以内に失効するトークンを全ユーザー分スキャンして事前更新。朝ピーク時の一斉失効を防止 |
| 操作 | メソッド | 主なフィールド |
|---|---|---|
| 打刻状態取得 | GET /TimeRecorderSet?$expand=HistoryList | EmpCd, KinmuDate, DakokuTime, DakokuKbn, HimatagiFlg, HistoryList |
| 出勤打刻 | POST /TimeRecorderSet | DakokuKbn: 001(011=変形労働), TzOffsetMin: -540(JST) |
| 退勤打刻 | POST /TimeRecorderSet | DakokuKbn: 002(012=変形労働), HimatagiFlg: 0/1(日またぎ) |
| 経路 | 条件 | ブラウザ方式 | 動作 |
|---|---|---|---|
| Path A — シームレス | 前回と同じユーザー | openBrowserAsync(Safari 共有 Cookie) | Microsoft / IAS セッションを再利用 → パスワード入力不要 |
| Path B — アカウント切替 | 別ユーザーを検出 | openAuthSessionAsync + preferEphemeralSession | 独立 Cookie ジャー → 必ず該当ユーザーの資格情報で認証 |
| 症状 | 原因 | 対処 |
|---|---|---|
| 打刻が 401 で失敗し続ける | リフレッシュトークンも失効(約7日間未使用) | アプリ内の再認証モーダルで BTP SSO フローを再実行。CloudWatch [BTPSSOLambda] で REAUTH_REQUIRED を確認 |
| DynamoDB にトークンが存在しない | 初回 OAuth コールバックが未完了 | SSOBTPIASLambda のコールバック URL が IAS に登録されているか確認。API Gateway がステージにデプロイ済みか確認 |
| 常に 401(エラー詳細なし) | DynamoDB キーのメールアドレスに大文字・空白が混入 | DynamoDB で USER_{email} キーを直接確認。保存・参照の両側で trim().toLowerCase() が適用されているか検証 |
| OAuth コールバックが届かない | API Gateway がステージに未デプロイ | API Gateway コンソールで [APIをデプロイ] を実行(Lambda テストは通るが本番 URL には反映されない) |
本アプリの稼働状況は 3 つの手段で継続的に監視しています。それぞれ対象読者と目的が異なります。
| 対象読者 | EJEC 管理職・人事担当 |
| URL | activity-dashboard-1ef.pages.dev |
| 更新頻度 | 60 秒ごとに自動リロード |
| 目的 | 現在のチーム稼働状況をリアルタイムで把握 |
| 対象読者 | EJEC IT 担当者・マリンスフィア |
| 配信先 | Slack #mobile-daily-monitor |
| 配信時刻 | 毎日 08:00 JST(自動) |
| 目的 | 前日の利用状況と Lambda エラーを朝一番に確認 |
| 対象読者 | マリンスフィア 開発担当 |
| 通知先 | Slack #mobile-lambda-alert + メール |
| 発火条件 | 5分以内に Lambda エラー ≥ 3 件(認証系は ≥ 1 件) |
| 目的 | 障害を発生後5分以内に検知し、即座に対応開始 |
React Native(Expo Router)のレイヤー構成。画面層からバックエンドへの依存は一方向。各層は Context API 経由で疎結合に接続。
app/ ディレクトリsrc/components/src/services/ + src/hooks/各機能で画面・Context・Service・バックエンドがどう連携するかをシーケンス図で表示。タブで切り替えてください。
全ての重要データは AppSync GraphQL → Lambda → DynamoDB 経路で直接クラウドに保存されます。AsyncStorage はセッション中のUIキャッシュ用途に限定されており、ログアウト時にクリアされます。
| 操作 | AppSync Mutation / Query | Lambda | 保存先 |
|---|---|---|---|
| 出退勤打刻 | createTimeRecorderSSO | BTPSSOLambda | SAP BTP |
| 退勤時ログ保存 | saveDailyActivityLog | dailyActivityLogSaver | DynamoDB: dailyActivityLog |
| 残業時間送信 | updateOvertime | OTupdaterLambda | DynamoDB: OvertimeSummary |
| タスク状態更新 | updateWorkTaskStatus | ServiceNowUpdateStatus | ServiceNow |
| 活動ログ記録 | putActivityLog | activityLog Lambda | DynamoDB: ActivityLog (TTL 30日) |
| 個人設定保存 | saveUserProfile | PersonalConfigDB Lambda | DynamoDB: PersonalConfigDB |
| キー | 用途 | スコープ |
|---|---|---|
@EmailStatusStorage | 受信トレイタスク一覧(セッション中の表示キャッシュ) | ログアウト時クリア |
@TimeRecordsStorage | アクティビティ時刻記録(退勤時にDynamoDBへ送信) | 退勤後クリア |
inbox_breakRecords | 休憩セグメント(退勤ログに統合して送信) | 退勤後クリア |
inbox_breakTaskId / _breakStartTime | 現在の休憩タスクID・開始時刻 | 休憩終了時クリア |
ACTIVE_SESSION_ID | デバイスセッション識別子(AppSync認証に使用) | ログアウト時クリア |
lastBtpUserEmail | 前回ログインユーザー(SSO経路選択に使用) | デバイス保持 |
@TaskFavorites | お気に入りタスク一覧(PersonalConfigDB Lambdaとも同期) | ユーザースコープ |
saveDailyActivityLog mutation → dailyActivityLogSaver Lambda → DynamoDB に永続保存。iOS Ad Hoc 配布と EAS OTA(Over The Air)アップデートにより、ストア審査なしで迅速な機能リリースを実現。
| プロビジョニング | Ad Hoc(テスト配布) |
| プロファイル名 | WTR-Internal-Adhoc-Testing |
| 有効期限 | 2026年10月27日 |
| 登録デバイス数 | 26台(上限100台 / 年) |
| OTAチャンネル | preview(クライアント向け) |
| 配信プラットフォーム | EAS Update(Expo) |
| チェックタイミング | アプリ起動時に自動チェック |
| 適用タイミング | 次回起動時(バックグラウンドDL) |
| 適用条件 | JS・アセット変更のみ(ネイティブ変更は再ビルド必要) |
| 配布方式 | Apple Business Manager |
| メリット | UDID登録制限なし(本番展開対応) |
| 対象 | 全社員への展開 |