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

認証フローは、次のステップで構成されます。
DICOMweb エンドポイントへのベアラートークンを使用した HTTP リクエスト
AWS HealthImaging チェックトークンの有効期限
Lambda オーソライザーへのリクエストの転送
Lambda が ID プロバイダー (IdP) でトークンを検証する
Lambda が IAM ロールを返す
ポリシー評価とユーザー認証の完了
前提条件
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 を返します
実装フロー
クライアント側の認証フロー
ユーザー認証: ユーザーを IdP の認可エンドポイントに誘導する
トークン取得: ID トークンとアクセストークンの Exchange 認可コード (JWT)
API コール: HTTP Authorization Bearer ヘッダーにアクセストークンを含める
トークン検証: HealthImaging と Lambda オーソライザーによる完全な検証プロセス
セットアップ手順
Lambda オーソライザーの実装
AuthInput/AuthResult インターフェイスを実装する
トークンを検証する (署名、有効期限、発行者、対象者、スコープ)
決定と IAM ロール ARN を返す
IAM 設定
最小の DICOMweb オペレーション許可を持つポリシーを作成する
の信頼ポリシーを使用してロールを作成する
medical-imaging.
region
.amazonaws.comLambda 実行アクセス許可を設定する
データストア 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:
すべてのトークンクレームを検証します (nbf、exp、iat)
ロール ARN 形式を検証します
ロールを引き受ける
ユーザーに代わって SigV4 を使用して元のリクエストに署名します
DICOMweb リクエストを処理します
例外
条件 | AHI レスポンス |
---|---|
Lambda オーソライザーが存在しないか、無効です | 424 オーソライザーの設定ミス |
実行の失敗によりオーソライザーが終了しました | 424 オーソライザーが失敗しました |
マッピングされていない他のオーソライザーエラー | 424 オーソライザーが失敗しました |
オーソライザーが無効な/不正な形式のレスポンスを返しました | 424 オーソライザーの設定ミス |
オーソライザーが 1 秒以上実行されました | 408 オーソライザーのタイムアウト |
トークンの有効期限が切れているか、無効です | 403 無効または期限切れのトークン |
オーソライザーの設定ミスにより、AHI は返された IAM ロールをフェデレーションできません | 424 オーソライザーの設定ミス |
オーソライザーが空のロールを返しました | 403 アクセスが拒否されました |
返されたロールは呼び出せません (assume-role/trust misconfig) | 424 オーソライザーの設定ミス |
リクエストレートが DICOMweb Gateway の制限を超えています | 429 リクエストが多すぎる |
データストア、リターンロール、またはオーソライザーのクロスアカウント/クロスリージョン | 424 オーソライザークロスアカウント/クロスリージョンアクセス |