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 및 액세스 토큰에 대한 교환 권한 부여 코드(JWT)

  3. API 호출: HTTP 권한 부여 베어러 헤더에 액세스 토큰 포함

  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 요청을 처리합니다.

예외

Condition AHI 응답
Lambda 권한 부여자가 존재하지 않거나 유효하지 않습니다. 424 권한 부여자 구성 오류
실행 실패로 인해 권한 부여자가 종료됨 424 권한 부여자 실패
매핑되지 않은 다른 권한 부여자 오류 424 권한 부여자 실패
권한 부여자가 유효하지 않거나 형식이 잘못된 응답을 반환함 424 권한 부여자 구성 오류
권한 부여자가 1초 이상 실행됨 408 권한 부여자 제한 시간
토큰이 만료되었거나 유효하지 않습니다. 403 유효하지 않거나 만료된 토큰
권한 부여자 구성 오류로 인해 AHI가 반환된 IAM 역할을 페더레이션할 수 없음 424 권한 부여자 구성 오류
권한 부여자가 빈 역할을 반환함 403 액세스 거부됨
반환된 역할을 호출할 수 없음(assume-role/trust misconfig) 424 권한 부여자 구성 오류
요청 속도가 DICOMweb Gateway 제한을 초과함 429 요청이 너무 많음
데이터 스토어, 반환 역할 또는 권한 부여자 교차 계정/교차 리전 424 권한 부여자 교차 계정/교차 리전 액세스