目次
Amazon Connect Health v2.0 完全ガイド(Contact Center & Care Coordination)
概要
Amazon Connect Health は、Amazon Connect(クラウドコールセンター)に組み込まれた医療・ヘルスケア産業向けの統合接客・患者ケアコーディネーション機能です。HIPAA 準拠・患者プロファイル管理・複数科診療レコード統合・ケアコーディネーション ワークフローにより、患者‐医療提供者間の高信頼通信と一貫性のある医療サービスを実現します。Amazon Connect の Contact Flow エンジンをベースに、医療固有の要件(HIPAA 暗号化・監査ログ・Patient Registry・Care Team 管理)を標準装備するエンタープライズ医療ソリューションです。
課題解決
- 医療機関の複数システム統合困難 - 診療記録・予約・保険情報が EHR / 請求 / コールセンター に分散。患者が同じ質問を何度も説明するストレス
- 患者プロファイルの一元管理欠如 - 前回の治療・アレルギー・服用薬・ケアプラン が瞬時に表示されず、誤投薬・重複検査リスク
- ケアコーディネーションの自動化困難 - 医師・看護師・ソーシャルワーカー・薬剤師間の調整が手作業。患者が複数科受診時の統調が破綻
- コンプライアンス・監査負担 - HIPAA・GDPR・州規制への対応コスト。通話録音・アクセスログの管理が煩雑
- 患者エンゲージメント向上の障害 - 待ち時間・繰り返し説明・不正確な情報により患者満足度・継続受診率が低下
アーキテクチャ概要
患者 / 医療者インタラクション層:
①患者ポータル / Patient App:
├─ 予約管理・リスケジュール
├─ 医療者への質問・メッセージ
├─ 処方箋リフィル申請
├─ テレヘルス(Amazon Connect 統合)
└─ 医療記録・検査結果の閲覧
②Amazon Connect Health Contact Flow:
├─ IVR(音声自動応答)
│ ├─ 言語選択(多言語対応)
│ ├─ 受付・トリアージ
│ └─ スケジューリング
│
├─ 医療者への転送
│ ├─ 予約・アポ確認
│ ├─ テレヘルス開始
│ └─ チャット / メッセージング
│
└─ 自動フロー
├─ リマインダー SMS
├─ 待ち時間更新
└─ フォローアップ
③Patient Profile(患者プロファイル層):
├─ Demographics(人口統計)
│ └─ 姓名・生年月日・性別・連絡先
│
├─ Medical History(病歴)
│ ├─ 診断・治療履歴
│ ├─ アレルギー・副反応
│ ├─ 現在の服用薬
│ └─ 手術履歴
│
├─ Care Plans(ケアプラン)
│ ├─ 慢性病管理(糖尿病・高血圧など)
│ ├─ リハビリテーション計画
│ └─ 予防接種スケジュール
│
└─ Insurance / Billing(保険・請求)
├─ 保険証情報
├─ Copay / Deductible
└─ 前回の請求履歴
④Care Coordination Engine:
├─ Care Team Management
│ ├─ 主治医・専門医・看護師・ケースマネージャー
│ ├─ ロール・責任範囲の定義
│ └─ オンコール スケジュール
│
├─ Automated Workflows
│ ├─ 退院後フォローアップ(自動電話 / SMS)
│ ├─ 服薬アドヒアランス監視
│ ├─ 医療者間の 通知・確認フロー
│ └─ 患者の 優先度付け(リスク層別化)
│
└─ Integration
├─ EHR / EMR システム(Epic, Cerner, Meditech)
├─ Pharmacy(薬局システム)
├─ Lab / Imaging(検査・画像結果)
└─ Insurance(請求・承認管理)
⑤HIPAA-eligible Infrastructure:
├─ Encryption at Rest(KMS)
├─ Encryption in Transit(TLS 1.2+)
├─ Audit Logging(CloudTrail / VPC Flow Logs)
├─ Access Control(IAM + Role-based)
├─ Data Residency(Region-specific)
└─ Business Associate Agreements(BAA)
出力層:
├─ Patient Communication
│ ├─ 診療結果通知・紹介状
│ ├─ 予約確認 SMS / Email
│ └─ 医療者からのメッセージ
│
├─ Clinical Decision Support
│ ├─ アラート(薬物相互作用・検査異常値)
│ ├─ ガイダンス(診療ガイドライン)
│ └─ リマインダー(予防医学・健診予約)
│
└─ Analytics & Compliance
├─ Patient Satisfaction(CSAT / NPS)
├─ Clinical Outcomes(Re-admission Rate)
├─ Care Coordination Metrics(TAT)
└─ Compliance Report(HIPAA・州規制)
コアコンポーネント
1. Healthcare-Specific Contact Flow
医療向けカスタマイズされたコンタクトフロー・IVR・トリアージロジック。
# Healthcare Contact Flow の作成例
aws connect create-contact-flow \
--instance-id d-9966c5f9c7 \
--name medical-triage-flow \
--type INBOUND_CONTACT_FLOW \
--content '{
"Version": "2019-07-01",
"StartAction": "12345678-1234-1234-1234-123456789012",
"Metadata": {
"entryPointPosition": {"X": 40, "Y": 40},
"snapToGrid": false,
"canvas": {
"zoom": 1
}
},
"Actions": [
{
"Identifier": "12345678-1234-1234-1234-123456789012",
"Parameters": {
"FlowLoggingBehavior": "Enabled",
"Text": "こんにちは。医療サービスへようこそ。ご用件をお聞かせください。"
},
"Transitions": {
"NextAction": "87654321-4321-4321-4321-210987654321",
"Errors": [],
"Conditions": []
},
"Type": "MessageParticipant"
},
{
"Identifier": "87654321-4321-4321-4321-210987654321",
"Parameters": {
"FlowLoggingBehavior": "Enabled",
"Options": [
{
"Key": "1",
"Text": "新規予約"
},
{
"Key": "2",
"Text": "既存予約の変更"
},
{
"Key": "3",
"Text": "医療相談"
},
{
"Key": "4",
"Text": "検査結果の確認"
}
]
},
"Transitions": {
"NextAction": "...",
"Errors": [],
"Conditions": []
},
"Type": "GetUserInput"
}
// 以降、ユースケース別に分岐
]
}'
2. Patient Profile Management
患者の統合プロファイル・プリファレンス・ケア履歴の一元管理。
import boto3
import json
from datetime import datetime
connect = boto3.client('connect', region_name='ap-northeast-1')
dynamodb = boto3.resource('dynamodb')
# DynamoDB 患者プロファイルテーブル
patients_table = dynamodb.Table('healthcare-patient-profiles')
def create_patient_profile(patient_id, demographics, medical_history):
"""患者プロファイルの作成・更新"""
patient_record = {
'patient_id': patient_id,
'demographics': {
'first_name': demographics.get('first_name'),
'last_name': demographics.get('last_name'),
'date_of_birth': demographics.get('dob'),
'sex': demographics.get('sex'),
'language_preference': demographics.get('language', 'ja'),
'contact_phone': demographics.get('phone'),
'contact_email': demographics.get('email')
},
'medical_history': {
'allergies': medical_history.get('allergies', []),
'chronic_conditions': medical_history.get('chronic_conditions', []),
'current_medications': medical_history.get('medications', []),
'recent_visits': [],
'care_team': medical_history.get('care_team', {})
},
'preferences': {
'communication_method': 'SMS',
'appointment_reminders': True,
'results_notification': 'email',
'telemedicine_eligible': True
},
'insurance': {
'primary_insurer': demographics.get('primary_insurance'),
'policy_number': demographics.get('policy_number'),
'group_number': demographics.get('group_number'),
'copay': demographics.get('copay', 0),
'deductible': demographics.get('deductible', 0)
},
'created_at': datetime.utcnow().isoformat(),
'updated_at': datetime.utcnow().isoformat()
}
patients_table.put_item(Item=patient_record)
print(f"Patient Profile Created: {patient_id}")
return patient_record
def retrieve_patient_profile(patient_id):
"""患者プロファイルの取得(Contact Flow で使用)"""
response = patients_table.get_item(Key={'patient_id': patient_id})
if 'Item' in response:
return response['Item']
else:
return None
def update_patient_contact_history(patient_id, contact_summary):
"""受診履歴・通話履歴の更新"""
patient = retrieve_patient_profile(patient_id)
if patient:
visit_record = {
'contact_id': contact_summary.get('contact_id'),
'contact_date': datetime.utcnow().isoformat(),
'contact_type': contact_summary.get('type'), # 'phone', 'telemedicine', 'chat'
'duration_seconds': contact_summary.get('duration'),
'reason': contact_summary.get('reason'),
'outcome': contact_summary.get('outcome'),
'notes': contact_summary.get('notes')
}
patients_table.update_item(
Key={'patient_id': patient_id},
UpdateExpression='SET #visits = list_append(#visits, :visit)',
ExpressionAttributeNames={'#visits': 'medical_history.recent_visits'},
ExpressionAttributeValues={':visit': [visit_record]}
)
print(f"Patient Contact History Updated: {patient_id}")
# 実行例
create_patient_profile(
patient_id='PAT-2026-00123',
demographics={
'first_name': '山田',
'last_name': '太郎',
'dob': '1980-01-15',
'sex': 'M',
'language': 'ja',
'phone': '09012345678',
'email': 'yamada@example.com',
'primary_insurance': 'HEALTH_INSURANCE_CO',
'policy_number': 'POL-123456789',
'copay': 1500
},
medical_history={
'allergies': ['Penicillin', 'Sulfonamides'],
'chronic_conditions': ['Hypertension', 'Type 2 Diabetes'],
'medications': [
{'name': 'Lisinopril', 'dose': '10mg', 'frequency': 'once daily'},
{'name': 'Metformin', 'dose': '500mg', 'frequency': 'twice daily'}
],
'care_team': {
'primary_care_physician': 'Dr. Suzuki Hanako',
'cardiologist': 'Dr. Tanaka Jiro',
'care_coordinator': 'Nurse Nakamura Yuki'
}
}
)
# プロファイル取得
profile = retrieve_patient_profile('PAT-2026-00123')
print(json.dumps(profile, indent=2, ensure_ascii=False))
3. Care Coordination Workflows
医療チーム間での自動ワークフロー・通知・確認。
def create_discharge_followup_workflow(patient_id, discharge_date, care_plan):
"""退院後フォローアップワークフロー"""
stepfunctions = boto3.client('stepfunctions', region_name='ap-northeast-1')
# Step Functions ステートマシン定義
state_machine_definition = {
"Comment": "退院後ケアコーディネーション",
"StartAt": "DayOneFollowup",
"States": {
"DayOneFollowup": {
"Type": "Task",
"Resource": "arn:aws:lambda:ap-northeast-1:123456789012:function:CallPatient",
"Parameters": {
"patient_id.{{CONTENT}}quot;: "$.patient_id",
"message": "退院おめでとうございます。本日の体調はいかがでしょうか。",
"contact_type": "phone"
},
"Next": "CheckMedicationAdherence",
"Retry": [{
"ErrorEquals": ["States.TaskFailed"],
"IntervalSeconds": 60,
"MaxAttempts": 3,
"BackoffRate": 2.0
}],
"Catch": [{
"ErrorEquals": ["States.ALL"],
"Next": "NotifyCareteam"
}]
},
"CheckMedicationAdherence": {
"Type": "Task",
"Resource": "arn:aws:lambda:ap-northeast-1:123456789012:function:CheckMedicationRefills",
"Parameters": {
"patient_id.{{CONTENT}}quot;: "$.patient_id",
"medications.{{CONTENT}}quot;: "$.medications"
},
"Next": "WaitForDay3",
"Retry": [{
"ErrorEquals": ["States.TaskFailed"],
"IntervalSeconds": 60,
"MaxAttempts": 2,
"BackoffRate": 2.0
}]
},
"WaitForDay3": {
"Type": "Wait",
"Days": 2,
"Next": "Day3Assessment"
},
"Day3Assessment": {
"Type": "Task",
"Resource": "arn:aws:lambda:ap-northeast-1:123456789012:function:TelemedicineConsultation",
"Parameters": {
"patient_id.{{CONTENT}}quot;: "$.patient_id",
"provider_id.{{CONTENT}}quot;: "$.primary_care_physician_id",
"duration_minutes": 15
},
"Next": "AssessRisks",
"Catch": [{
"ErrorEquals": ["States.ALL"],
"Next": "NotifyCareteam"
}]
},
"AssessRisks": {
"Type": "Task",
"Resource": "arn:aws:lambda:ap-northeast-1:123456789012:function:RiskAssessment",
"Parameters": {
"patient_id.{{CONTENT}}quot;: "$.patient_id",
"vitals.{{CONTENT}}quot;: "$.vitals",
"symptoms.{{CONTENT}}quot;: "$.reported_symptoms"
},
"Next": "CheckRiskLevel"
},
"CheckRiskLevel": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.risk_level",
"StringEquals": "HIGH",
"Next": "EscalateToPhysician"
},
{
"Variable": "$.risk_level",
"StringEquals": "MEDIUM",
"Next": "ScheduleFollowup"
}
],
"Default": "CloseCase"
},
"EscalateToPhysician": {
"Type": "Task",
"Resource": "arn:aws:lambda:ap-northeast-1:123456789012:function:NotifyPhysician",
"Parameters": {
"patient_id.{{CONTENT}}quot;: "$.patient_id",
"urgency": "HIGH",
"reason.{{CONTENT}}quot;: "$.risk_reason"
},
"Next": "CloseCase"
},
"ScheduleFollowup": {
"Type": "Task",
"Resource": "arn:aws:lambda:ap-northeast-1:123456789012:function:ScheduleAppointment",
"Parameters": {
"patient_id.{{CONTENT}}quot;: "$.patient_id",
"appointment_type": "follow_up",
"days_ahead": 7
},
"Next": "CloseCase"
},
"NotifyCareteam": {
"Type": "Task",
"Resource": "arn:aws:lambda:ap-northeast-1:123456789012:function:NotifyCareteam",
"Parameters": {
"patient_id.{{CONTENT}}quot;: "$.patient_id",
"alert_type": "CONTACT_FAILED",
"timestamp": "now"
},
"Next": "CloseCase"
},
"CloseCase": {
"Type": "Succeed"
}
}
}
# Step Functions ステートマシン作成
response = stepfunctions.create_state_machine(
name=f'discharge-followup-{patient_id}',
definition=json.dumps(state_machine_definition),
roleArn='arn:aws:iam::123456789012:role/StepFunctionsRole',
tags=[
{'key': 'patient_id', 'value': patient_id},
{'key': 'workflow', 'value': 'discharge_followup'}
]
)
# ワークフロー実行
execution_response = stepfunctions.start_execution(
stateMachineArn=response['stateMachineArn'],
input=json.dumps({
'patient_id': patient_id,
'discharge_date': discharge_date,
'medications': care_plan.get('medications'),
'primary_care_physician_id': care_plan.get('primary_physician')
})
)
print(f"Discharge Followup Workflow Started: {execution_response['executionArn']}")
return execution_response['executionArn']
# 実行例
workflow_arn = create_discharge_followup_workflow(
patient_id='PAT-2026-00123',
discharge_date='2026-04-27',
care_plan={
'medications': [
{'name': 'Lisinopril', 'dose': '10mg', 'refill_date': '2026-05-15'},
{'name': 'Metformin', 'dose': '500mg', 'refill_date': '2026-05-10'}
],
'primary_physician': 'DR-12345'
}
)
4. HIPAA-Eligible Infrastructure
医療データの安全性・プライバシー・コンプライアンスを確保。
# KMS による暗号化キー(医療データ)
aws kms create-key \
--description 'Healthcare Data Encryption Key' \
--key-usage ENCRYPT_DECRYPT \
--origin AWS_KMS \
--region ap-northeast-1
# S3 バケットへの HIPAA-eligible 設定
aws s3api create-bucket \
--bucket healthcare-hipaa-data \
--region ap-northeast-1 \
--create-bucket-configuration LocationConstraint=ap-northeast-1
# バージョニング・MFA Delete 有効化(監査証跡)
aws s3api put-bucket-versioning \
--bucket healthcare-hipaa-data \
--versioning-configuration Status=Enabled,MFADelete=Enabled
# サーバー側暗号化(KMS)
aws s3api put-bucket-encryption \
--bucket healthcare-hipaa-data \
--server-side-encryption-configuration '{
"Rules": [{
"ApplyServerSideEncryptionByDefault": {
"SSEAlgorithm": "aws:kms",
"KMSMasterKeyID": "arn:aws:kms:ap-northeast-1:123456789012:key/12345678-1234-1234-1234-123456789012"
},
"BucketKeyEnabled": true
}]
}'
# VPC Endpoint(データ転送の VPC 内保持)
aws ec2 create-vpc-endpoint \
--vpc-id vpc-12345678 \
--vpc-endpoint-type Interface \
--service-name com.amazonaws.ap-northeast-1.s3 \
--subnet-ids subnet-a subnet-b \
--security-group-ids sg-healthcare
# CloudTrail による監査ログ(HIPAA 要件)
aws cloudtrail create-trail \
--name healthcare-audit-trail \
--s3-bucket-name healthcare-cloudtrail-logs \
--region ap-northeast-1 \
--is-multi-region-trail \
--include-global-service-events
# VPC Flow Logs(ネットワーク監視)
aws ec2 create-flow-logs \
--resource-type VPC \
--resource-ids vpc-12345678 \
--traffic-type ALL \
--log-destination-type cloud-watch-logs \
--log-group-name /aws/vpc-flow-logs/healthcare \
--deliver-logs-permission-role-arn arn:aws:iam::123456789012:role/VPCFlowLogsRole
ユースケース実装
UC1: テレヘルス統合ワークフロー
def initiate_telemedicine_consultation(patient_id, provider_id, complaint):
"""患者-医療者テレヘルス開始"""
connect = boto3.client('connect')
# ① Amazon Connect でテレヘルスセッション作成
contact_response = connect.start_contact_streaming(
InstanceId='d-9966c5f9c7',
ContactId='contact-12345678',
ChatStreamingConfiguration={
'StreamingEndpointArn': 'arn:aws:kinesis:ap-northeast-1:123456789012:stream/telemedicine-stream'
}
)
# ② 医療者に通知・転送
notification = {
'provider_id': provider_id,
'patient_id': patient_id,
'contact_id': contact_response['ContactId'],
'chief_complaint': complaint,
'urgency': 'routine'
}
# ③ 診療画面に患者プロファイル表示
# → 医療者は患者の病歴・薬歴・最近の検査結果を確認しながら診療
print(f"Telemedicine Session Initiated: {contact_response['ContactId']}")
# UC2: 薬局との連携・処方箋管理
def manage_prescription_refill(patient_id, medication_id):
"""処方箋リフィル(薬局との自動連携)"""
connect = boto3.client('connect')
# ① 患者が処方箋リフィルをリクエスト
refill_request = {
'patient_id': patient_id,
'medication_id': medication_id,
'request_type': 'auto_refill',
'preferred_pharmacy': 'local_pharmacy_12345'
}
# ② 医療者に自動通知(医師の確認待ち)
# → 医師が Amazon Connect 画面で承認 / 拒否
# ③ 承認後、薬局システムに自動送信
# → 患者が受け取り準備完了の SMS 通知
print(f"Prescription Refill Request: {medication_id}")
initiate_telemedicine_consultation(
patient_id='PAT-2026-00123',
provider_id='DR-12345',
complaint='定期高血圧フォローアップ'
)
競合他社との比較
| 観点 | Connect Health | Salesforce Health Cloud | Microsoft Cloud for Healthcare | Epic MyChart |
|---|---|---|---|---|
| クラウドプラットフォーム | AWS | Salesforce | Azure | オンプレ / クラウド |
| テレヘルス | ネイティブ(Connect) | ネイティブ | ネイティブ | ネイティブ |
| Patient Portal | Connect 統合 | 包括的 | 包括的 | MyChart |
| Care Coordination | Step Functions 統合 | フロー エンジン | フロー エンジン | ネイティブ |
| EHR 統合 | HL7 / FHIR API | ネイティブ連携 | ネイティブ連携 | ネイティブ |
| HIPAA 準拠 | ネイティブ(BAA) | ネイティブ | ネイティブ | ネイティブ |
| 学習曲線 | 中程度(AWS 知識必須) | 低い | 低い | 高い(医療専用) |
| 拡張性 | 高い(AWS サービス統合) | 最高(AppCloud) | 高い(Power Platform) | 中程度 |
| 導入期間 | 6-12 ヶ月 | 6-18 ヶ月 | 6-18 ヶ月 | 12-24 ヶ月 |
コスト詳細
1. Amazon Connect:
- ユーザーシート: $0.90/ユーザー/日(8 時間)
- 受信 DID: $1.50/月
- 国内通話: $0.007/分
2. Amazon Connect Health 追加:
- Patient Portal: $0.05/患者/月(100 患者~)
- Care Coordination: $0.08/ワークフロー/月
3. ストレージ・データ転送:
- S3 (HIPAA): $0.023/GB/月
- 通話録音 (DynamoDB): $0.25/GB/月
- KMS 暗号化: $1.00/月 + $0.03/万リクエスト
4. 例: 500 患者・50 医療者の小規模診療所
- Connect ユーザー: 50 × $0.90 × 22 日/月 = $990/月
- 患者ポータル: 500 × $0.05 = $25/月
- ストレージ: 500GB × $0.023 = $11.50/月
- 合計概算: $1,026.50/月
ベストプラクティス
BP1: Contact Flow 設計
- 多言語対応: 患者の言語選択を冒頭で確認
- トリアージロジック: 緊急度(高血圧値 > 180、胸痛など)に基づいて医師直通化
- エラーハンドリング: テレヘルス接続失敗時の自動フォールバック
BP2: データセキュリティ
# ログイン試行失敗の監視
def monitor_access_attempts():
cloudwatch = boto3.client('cloudwatch')
cloudwatch.put_metric_alarm(
AlarmName='HealthcareFailedLoginAttempts',
MetricName='UserAuthenticationFailure',
Namespace='AWS/Connect',
Statistic='Sum',
Period=300,
Threshold=5,
ComparisonOperator='GreaterThanThreshold',
AlarmActions=['arn:aws:sns:ap-northeast-1:123456789012:security-alerts']
)
# 患者データアクセスの監査
def audit_patient_access(patient_id):
athena = boto3.client('athena')
query = f"""
SELECT
eventTime,
userIdentity.principalId,
eventName,
sourceIPAddress
FROM cloudtrail_logs
WHERE requestParameters LIKE '%{patient_id}%'
AND eventTime > date_format(current_timestamp - interval '1' day, '%Y-%m-%dT%H:%i:%S')
"""
# CloudTrail ログを Athena で分析
# → HIPAA 監査証跡として保存
BP3: 患者エンゲージメント
- 予約リマインダー: テレヘルス 24h 前に SMS で確認
- 結果通知: 検査結果をポータルで自動配信
- 継続フォローアップ: 慢性疾患の定期受診・検査スケジュール自動提案
トラブルシューティング
| 症状 | 原因 | 対応 |
|---|---|---|
| テレヘルス接続失敗 | ネットワーク遅延 / VPC 設定ミス | VPC Endpoint 確認、CloudWatch ログで接続エラー確認 |
| 患者プロファイル読込遅延 | DynamoDB スロットリング / EHR 遅延 | DynamoDB キャパシティ増設、EHR API タイムアウト延長 |
| HIPAA コンプライアンス警告 | 暗号化なし / ログ不足 | KMS 有効化、CloudTrail 確認 |
| Care Coordination ワークフロー失敗 | Step Functions タイムアウト / Lambda エラー | Lambda ロジック確認、タイムアウト値調整 |
採用判断チェックリスト
- [ ] テレヘルス・オンライン診療の提供予定?
- [ ] 複数科・複数施設でのケアコーディネーション管理?
- [ ] 患者ポータル・セルフサービスの自動化?
- [ ] HIPAA(米国)/ PIPEDA(カナダ)など医療規制対応?
- [ ] EHR(Epic・Cerner 等)との統合予定?
まとめ
Amazon Connect Health は、医療機関向けの統合接客・ケアコーディネーションプラットフォームです。テレヘルス・患者プロファイル管理・Care Coordination ワークフロー・HIPAA-eligible インフラをネイティブに統合し、患者‐医療提供者間の一貫性のあるコミュニケーションと高度なケア調整を実現します。
最終更新:2026-04-27 バージョン:v2.0