AWS 기술 블로그

AWS PrivateLink를 사용하여 Amazon Bedrock 프라이빗 접근 설정하기

이 글은 AWS Machine Learning Blog에 게시된 Use AWS PrivateLink to set up private access to Amazon Bedrock By Ram Vittal, Michael Daniels, and Ray Khorsandi를 한국어 번역 및 편집하였습니다.

Amazon Bedrock은 AWS에서 제공하는 완전 관리형 서비스로, 개발자에게 여러 파운데이션 모델들과 각 모델들을 사용자의 어플리케이션에 맞게 커스터마이징할 수 있는 도구들을 제공합니다. 이를 통해 개발자는 인프라를 관리할 필요 없이 API를 통해 파운데이션 모델을 사용하여 생성형 AI 애플리케이션을 빌드하고 확장할 수 있습니다. 여러분은 Amazon과 AI21 Labs, Anthropic, Cohere, Stability AI와 같은 선도적인 AI 스타트업의 다양한 파운데이션 모델 중에서 여러분의 요구 조건에 가장 적합한 모델을 찾을 수 있습니다. 여러분은 Amazon Bedrock의 인터페이스를 통해서 서버를 관리할 필요  없이 빠르고 쉽게 다양한 파운데이션 모델을 가지고 실험할 수 있으며, 여러분이 갖고 있는 자체 데이터로 모델들을 외부 유출에 대한 우려 없이 커스터마이징할 수 있습니다. 또한, AWS의 다양한 도구와 기능을 사용하여 여러분의 모델을 여러분의 어플리케이션에 매끄럽게 연동하고, 배포할 수 있습니다.

고객들은 자체적으로 확보한 고유한 데이터를 사용하여 Amazon Bedrock API를 통해 혁신적인 생성형 AI 애플리케이션을 구축하고 있습니다. Amazon Bedrock API에 액세스할 때, 고객은 자사의 데이터가 인터넷에 노출되는 위협으로부터 보호받는 장치가 확보되어 있기를 바랍니다. AWS PrivateLink로 구동되는 Amazon Bedrock VPC 엔드포인트를 사용하면 고객 계정의 VPC와 Amazon Bedrock 서비스 계정 간에 프라이빗 연결을 설정할 수 있습니다. 이를 통해 VPC 인스턴스는 퍼블릭 IP 주소 없이도 서비스 리소스와 통신할 수 있습니다.

이 게시물에서는 AWS 계정에서 프라이빗 액세스를 설정하여 PrivateLink로 구동되는 VPC 엔드포인트를 통해 Amazon Bedrock API에 액세스하여 자체 데이터로 생성형 AI 애플리케이션을 안전하게 구축하는 방법을 설명합니다.

솔루션 개요

여러분은 생성형 AI를 사용하여 텍스트 요약, 콘텐츠 분류 등과 같은 다양한 애플리케이션을 개발할 수 있습니다. 파운데이션 모델을 사용하여 이러한 생성형 AI 애플리케이션을 구축할 때 고객은 기업 데이터베이스에 존재하는 고객의 자체 데이터에 기반한 응답이 생성되기를 기대하되 이 데이터가 퍼블릭 인터넷을 거쳐가지 않기를 원합니다.

다음 그림은 생성형 AI 애플리케이션에서 제품 관련 질의에 응답할 때 Amazon 관계형 데이터베이스 서비스 (Amazon RDS)에 있는 자체 데이터로 Amazon Bedrock API를 향하는 질의 요청을 증강해주는 아키텍처를 보여 줍니다. 이 그림에서는 설명 목적으로 Amazon RDS를 사용했지만, 이 게시물에 제공된 가이드를 사용하여 Amazon Bedrock API의 프라이빗 액세스를 처음부터 끝까지 테스트할 수 있습니다.

워크플로 단계는 다음과 같습니다:

  1. 프라이빗 VPC 서브넷에서 실행 중인 AWS Lambda가 생성형 AI 애플리케이션으로부터 프롬프트 요청을 수신합니다.
  2. Lambda는 자체 RDS 데이터베이스를 호출하여 프롬프트 질의 컨텍스트(예: 제품 정보 추가)를 증강하고 이렇게 컨텍스트가 증강된 질의 요청으로 Amazon Bedrock API를 호출합니다.
  3. API 호출은 Amazon Bedrock API에 대한 허용 권한이 있는 VPC 엔드포인트 정책과 연결된 Amazon Bedrock VPC 엔드포인트로 라우팅됩니다.
  4. Amazon Bedrock 서비스 API 엔드포인트는 퍼블릭 인터넷을 경유하지 않고 PrivateLink를 통해 API 요청을 수신합니다.
  5. Amazon Bedrock VPC 엔드포인트 정책을 거부 권한으로 변경하여 Amazon Bedrock API 호출이 거부되는지 확인할 수 있습니다.
  6. 또한 AWS Direct Connect 게이트웨이를 통해 회사 네트워크에서 VPC 엔드포인트를 통해 Amazon Bedrock API에 프라이빗하게 액세스할 수도 있습니다.

준비물

시작하기 전에 다음 필수 구성 요소가 있는지 확인하세요:

  • AWS 계정
  • 다음 작업을 수행할 수 있는 액세스 권한이 있는 AWS ID 및 액세스 관리(IAM) 페더레이션 역할:
    • VPC 네트워크 리소스 생성, 편집, 보기 및 삭제
    • Lambda 함수 생성, 편집, 보기 및 삭제
    • IAM 역할 및 정책 만들기, 편집, 보기 및 삭제하기
    • 파운데이션 모델 조회 및 Amazon Bedrock 파운데이션 모델 호출하기
  • 이 게시물에서는 us-east-1 리전을 사용합니다.
  • Amazon Bedrock 콘솔을 통해 파운데이션 모델 액세스 요청하기

프라이빗 액세스 인프라 설정

이 섹션에서는 AWS CloudFormation 템플릿을 사용하여 VPC, 프라이빗 서브넷, 보안 그룹, Lambda 함수 등의 인프라를 설정합니다.

다음 템플릿을 사용하여 AWS 계정에서 인프라 스택 Bedrock-GenAI-Stack을 생성합니다.

CloudFormation 템플릿은 사용자를 대신하여 다음 리소스를 생성합니다:

  • 별도의 가용 영역에 2개의 프라이빗 서브넷이 있는 VPC
  • 보안 그룹 및 라우팅 테이블
  • Lambda, Amazon Bedrock, Amazon Elastic Compute Cloud (Amazon EC2)에서 사용하기 위한 IAM 역할 및 정책

Amazon Bedrock용 VPC 엔드포인트 설정하기

이 섹션에서는 Amazon 가상 프라이빗 클라우드 (Amazon VPC)를 사용하여 VPC에서 Amazon Bedrock으로의 프라이빗 연결을 용이하게 하기 위해 Amazon Bedrock용 VPC 엔드포인트를 설정합니다.

1. Amazon VPC 콘솔의 탐색 창에 있는 Virtual Private Cloud에서 엔드포인트를 선택합니다.

2. 엔드포인트 생성을 선택합니다.

3. 이름 태그bedrock-vpce를 입력합니다.

4. 서비스에서 bedrock-runtime을 검색하고 com.amazonaws.<region>.bedrock-runtime을 선택합니다.

5. VPC의 경우, 이전 섹션에서 CloudFormation 스택을 통해 생성한 VPC Bedrock-GenAI-Project-vpc를 지정합니다.

6. 서브넷 섹션에서 가용성 영역을 선택하고 드롭다운 메뉴에서 해당 서브넷 ID를 선택합니다.

7. 보안 그룹의 경우, 그룹 이름이 gen-ai-lambda-stack-VPCEndpointSecurityGroup- 이고 설명이 Allow TLS for VPC Endpoint인 보안 그룹을 선택합니다.

보안 그룹은 인바운드 및 아웃바운드 트래픽을 제어하기 위한 인스턴스의 가상 방화벽 역할을 합니다. 이 VPC 엔드포인트 보안 그룹은 VPC 프라이빗 서브넷에 연결된 보안 그룹에서 발생하는 트래픽만 허용하여 보호 계층을 추가합니다.

8. 엔드포인트 생성을 선택합니다.

9. 정책 섹션에서 사용자 지정을 선택하고 다음과 같은 최소 권한 정책을 입력하여 지정된 파운데이션 모델을 대상으로 지정된 작업만 허용되도록 설정합니다. 아래 코드를 보면 arn:aws:bedrock:*::foundation-model/anthropic.claude-instant-v1 리소스를 대상으로 InvokeModel 작업을 허용하되, 작업 주체는 해당 역할을 부여받은 리소스 (이를 테면 이 역할을 부여받은 Lambda 함수)로 한정합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "bedrock:InvokeModel"
                ],
            "Resource": [
                "arn:aws:bedrock:*::foundation-model/anthropic.claude-instant-v1"
                ],
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<accountid>:role/gen-ai-lambda-stack-BedrockTestLambdaFunctionRole-XXXXXXXXXXXX"
            }
        }
    ]
}

인터페이스 엔드포인트가 생성되고 상태가 사용 가능으로 변경될 때까지 최대 2분이 소요될 수 있습니다. 페이지를 새로 고침하여 최신 상태를 확인할 수 있습니다. 

프라이빗 VPC 서브넷을 통해 Lambda 함수 설정하기

다음 단계를 완료하여 Lambda 함수를 구성합니다:

1. Lambda 콘솔의 탐색 창에서 함수를 선택합니다.

2. gen-ai-lambda-stack-BedrockTestLambdaFunction-XXXXXXXXXXXX 함수를 선택합니다.

3. 구성 탭의 왼쪽 창에서 권한을 선택합니다.

4. 실행 역할 아래에서 gen-ai-lambda-stack-BedrockTestLambdaFunctionRole-XXXXXXXXXX 역할에 대한 링크를 선택합니다.

IAM 콘솔로 리디렉션됩니다.

5. 권한 정책 섹션에서 권한 추가를 선택하고 인라인 정책 생성을 선택합니다.

6. JSON 탭에서 다음과 같이 정책을 수정합니다:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "eniperms",
            "Effect": "Allow",
            "Action": [
                "ec2:CreateNetworkInterface",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DeleteNetworkInterface",
                "ec2:*VpcEndpoint*"
            ],
            "Resource": "*"
        }
    ]
}

7. 다음을 선택합니다.

8. 정책 이름enivpce-policy를 입력합니다.

9. 정책 생성을 선택합니다.

10. CloudFormation 템플릿이 자동으로 생성해준 BedrockPolicy 인라인 정책을 수정하여 VPC 엔드포인트를 통해서만 Amazon Bedrock API에 대한 Lambda 액세스를 제한합니다. 이때 "vpce-<bedrock-runtime-vpce>"는 앞서 생성해 둔 Amazon Bedrock용 VPC 엔드포인트 bedrock-vpce의 id를 설정해줍니다:

{
    "Id": "lambda-bedrock-sourcevpce-access-only",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                 "bedrock:ListFoundationModels",
                "bedrock:InvokeModel"
            ],
            "Resource": "*",
            "Condition": {
                "ForAnyValue:StringEquals": {
                    "aws:sourceVpce": [
                        "vpce-<bedrock-runtime-vpce>"
                    ]
                }
            }
        }
    ]
} 

11. Lambda 기능 페이지의 구성 탭의 왼쪽 창에서 VPC를 선택한 다음 편집을 선택합니다.

12. VPC에서 Bedrock-GenAI-Project-vpc를 선택합니다.

13. 서브넷에서 프라이빗 서브넷을 선택합니다.

14. 보안 그룹의 경우, (프라이빗 서브넷의 Amazon Bedrock 워크로드에 대한 보안 그룹인) gen-ai-lambda-stack-SecurityGroup-을 선택합니다.

15. 저장을 선택합니다.

프라이빗 액세스 제어 테스트

이제 프라이빗 액세스 제어(VPC 엔드포인트를 통한 Amazon Bedrock API)를 테스트할 수 있습니다.

1. Lambda 콘솔의 탐색 창에서 함수를 선택합니다.

2. gen-ai-lambda-stack-BedrockTestLambdaFunction-XXXXXXXXXXXX 함수를 선택합니다.

3. 코드 탭에서 Test를 선택합니다.

Amazon Bedrock API 호출에서 다음과 같은 응답이 표시되어야 합니다(Status: Succeeded).


4. VPC 엔드포인트를 통해 Amazon Bedrock API에 대한 액세스를 거부하려면 Amazon VPC 콘솔로 이동합니다.

5. 좌측 탐색 창의 Virtual Private Cloud에서 엔드포인트를 선택합니다.

6. 정책을 선택하고 정책 탭으로 이동합니다.

현재 VPC 엔드포인트 정책은 Allow로 설정되어 있습니다.

7. 액세스를 거부하려면 정책 편집을 선택합니다.

8. AllowDeny로 변경하고 저장을 선택합니다.

VPC 엔드포인트에 대한 정책 변경이 완료되는 데에는 대략 2분 정도 걸릴 수 있습니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "bedrock:InvokeModel"
                ],
            "Resource": [
                "arn:aws:bedrock:*::foundation-model/anthropic.claude-instant-v1"
                ],
            "Effect": "Deny",
            "Principal": {
                "AWS": "arn:aws:iam::<accountid>:role/gen-ai-lambda-stack-BedrockTestLambdaFunctionRole-XXXXXXXXXXXX"
            }
        }
    ]
}

9. Lambda 함수 페이지로 돌아와 코드 탭에서 Test를 선택합니다.

다음 스크린샷에서 볼 수 있듯이, VPC 엔드포인트를 통한 Amazon Bedrock에 대한 액세스 요청이 거부되었습니다(staus: Failed). 
이 테스트 프로세스를 통해 VPC에서 Amazon Bedrock API 엔드포인트로의 트래픽이 인터넷 연결이 아닌 PrivateLink 연결을 통해 이동하는 방법을 시연했습니다.

정리하기

향후 요금이 발생하지 않도록 하려면 다음 단계를 따르세요:

  1. VPC 엔드포인트를 삭제합니다.
  2. CloudFormation 스택을 삭제합니다.

결론

이 게시물에서는 PrivateLink로 구동되는 인터페이스 VPC 엔드포인트를 사용하여 고객 VPC에 배포된 생성형 AI 워크로드와 Amazon Bedrock 간의 프라이빗 연결을 설정하고 운영하는 방법을 보여드렸습니다. 이 게시물에서 설명하는 아키텍처를 사용하면 고객 VPC와 Amazon Bedrock 간의 트래픽이 Amazon 네트워크를 벗어나지 않으므로 데이터가 퍼블릭 인터넷에 노출되지 않으므로 규정 준수 요건을 충족하는 데 도움이 됩니다.

이제 직접 솔루션을 사용해 보고 피드백을 공유해주세요.

Sean Lee

Sean Lee

Sean Lee 어플리케이션 아키텍트는 컨테이너와 서버리스 그리고 DevOps를 중심으로, AWS 기반으로 서비스를 구성하고자 하는 고객들께 클라우드 환경에 최적화된 아키텍처 구성을 컨설팅하고 지원하는 역할을 수행하고 있습니다.