AWS Lambda オーソライザーの使用 - AWS HealthImaging

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS Lambda オーソライザーの使用

HealthImaging の OIDC Lambda ワークフローを示す図。

認証フローは、次のステップで構成されます。

  1. DICOMweb エンドポイントへのベアラートークンを使用した HTTP リクエスト

  2. AWS HealthImaging チェックトークンの有効期限

  3. Lambda オーソライザーへのリクエストの転送

  4. Lambda が ID プロバイダー (IdP) でトークンを検証する

  5. Lambda が IAM ロールを返す

  6. ポリシー評価とユーザー認証の完了

前提条件

1. Lambda オーソライザーのセットアップ

  • AuthInput を受け入れて AuthResult を返すオーソライザーを作成する

  • BearerToken (署名、有効期限、スコープ、発行者、ビジネスルール) を検証します

  • 必要な DICOMweb オペレーション許可を持つ IAM ロール ARN を返します

  • ≤ 1 秒で応答する必要があります (プロビジョニングされた同時実行数を設定)

トークン抽出を実装します。

// in Node.js export const handler = async (event) => { try { const token = event.bearerToken; const operation = event.operation; } }

2. データストア設定

  • 作成時に lambdaAuthorizerArn を指定して機能を有効にする

注記

AWS アカウントは、Lambda の呼び出しと期間に対して請求されます。詳細については、「AWS Lambda 料金」を参照してください。

認可プロセスの詳細

トークン検証ルール

HealthImaging は、次のトークンクレームを評価します。

  • exp – UTC の現在の時刻より後である必要があります

  • nbf – UTC の現在の時刻より前である必要があります

  • iat – UTC の現在の時刻より前で、12 時間より前 (トークンの最大有効期間) であってはなりません

イベントとレスポンスのスキーマ

AHI は、次の入力で関数を呼び出し、次の出力を期待します。

オーソライザー入力

{ "datastoreId": "{datastore id}", "operation": "{Healthimaging API name e.g. GetDICOMInstance}", "bearerToken": "{access token}" }
オーソライザー出力

{ "isTokenValid": {true or false}, "roleArn": "{role arn or empty string meaning to deny the request explicitly}" }

リクエスト処理

初期リクエスト処理:

  • 認可がない場合: ベアラーヘッダー → リクエストは SigV4 認証に進みます

  • ベアラートークンが存在する場合:

    • データストアの LambdaAuthorizerArn を解決します

    • 転送アクセスセッション (FAS) を使用してオーソライザーを呼び出す

Lambda 認可プロセス:

  • datastoreId、オペレーション、および bearerToken を含む AuthInput を受信します

  • 1 秒以内に検証を完了する必要があります

  • 検証ステータスとロール ARN を含む AuthResult を返します

実装フロー

クライアント側の認証フロー

  1. ユーザー認証: ユーザーを IdP の認可エンドポイントに誘導する

  2. トークン取得: ID トークンとアクセストークンの Exchange 認可コード (JWT)

  3. API コール: HTTP Authorization Bearer ヘッダーにアクセストークンを含める

  4. トークン検証: HealthImaging と Lambda オーソライザーによる完全な検証プロセス

セットアップ手順

Lambda オーソライザーの実装

  • AuthInput/AuthResult インターフェイスを実装する

  • トークンを検証する (署名、有効期限、発行者、対象者、スコープ)

  • 決定と IAM ロール ARN を返す

IAM 設定

  • 最小の DICOMweb オペレーション許可を持つポリシーを作成する

  • の信頼ポリシーを使用してロールを作成する medical-imaging.region.amazonaws.com

  • Lambda 実行アクセス許可を設定する

  • データストア ARN の AllowHealthLakeInvocation ステートメントを使用してリソースポリシーを追加する

オーソライザーには、次のリソースポリシーステートメントが必要です。

{ "Sid": "health-imaging", "Effect": "Allow", "Principal": { "Service": "medical-imaging.region.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:region:123456789012:function:LambdaAuthorizerName" }

認証 Lambda が返した IAM ロールには、次の信頼関係ポリシーが必要です。

{ "Effect": "Allow", "Principal": { "Service": "medical-imaging.region.amazonaws.com" }, "Action": "sts:AssumeRole" }

同時実行設定

  • ≤ 1 秒の SLO のプロビジョニングされた同時実行数を設定する

  • 必要に応じてコールドスタート緩和を実装する

Lambda オーソライザーテンプレート

import jwt from 'jsonwebtoken'; import jwksClient from 'jwks-rsa'; const CACHE_TTL = 10 * 60 * 1000; const client = jwksClient({ jwksUri: '{Jwks Url}', cache: true, cacheMaxEntries: 5, cacheMaxAge: 600000, rateLimit: true, jwksRequestsPerMinute: 10 }); export const handler = async (event) => { try { console.log(event); const token = event.bearerToken; const decoded = jwt.decode(token, { complete: true }); if (!decoded || !decoded.header.kid) { console.log('Invalid token structure'); return generatePolicy(null, false); } const key = await client.getSigningKey(decoded.header.kid); const signingKey = key.getPublicKey(); const payload = jwt.verify(token, signingKey, { issuer: '{issuer to be verified}', algorithms: ['RS256'], // Additional verification parameters as needed }); return generatePolicy(payload.sub, true); } catch (error) { console.error('Authorization error:', error); return generatePolicy(null, false); } }; function generatePolicy(user, isValid) { return { isTokenValid: isValid, roleArn: user ? `arn:aws:iam::123456789012:role/${user}` : "" }; }

HealthImaging による最終検証

AuthResult を受け取った後、HealthImaging:

  1. すべてのトークンクレームを検証します (nbf、exp、iat)

  2. ロール ARN 形式を検証します

  3. ロールを引き受ける

  4. ユーザーに代わって SigV4 を使用して元のリクエストに署名します

  5. DICOMweb リクエストを処理します

例外

条件 AHI レスポンス
Lambda オーソライザーが存在しないか、無効です 424 オーソライザーの設定ミス
実行の失敗によりオーソライザーが終了しました 424 オーソライザーが失敗しました
マッピングされていない他のオーソライザーエラー 424 オーソライザーが失敗しました
オーソライザーが無効な/不正な形式のレスポンスを返しました 424 オーソライザーの設定ミス
オーソライザーが 1 秒以上実行されました 408 オーソライザーのタイムアウト
トークンの有効期限が切れているか、無効です 403 無効または期限切れのトークン
オーソライザーの設定ミスにより、AHI は返された IAM ロールをフェデレーションできません 424 オーソライザーの設定ミス
オーソライザーが空のロールを返しました 403 アクセスが拒否されました
返されたロールは呼び出せません (assume-role/trust misconfig) 424 オーソライザーの設定ミス
リクエストレートが DICOMweb Gateway の制限を超えています 429 リクエストが多すぎる
データストア、リターンロール、またはオーソライザーのクロスアカウント/クロスリージョン 424 オーソライザークロスアカウント/クロスリージョンアクセス