정적 IP 주소와 연결된 엔드포인트를 사용하여 Amazon S3 미리 서명된 URL 생성 및 객체 다운로드 통합 - 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

정적 IP 주소와 연결된 엔드포인트를 사용하여 Amazon S3 미리 서명된 URL 생성 및 객체 다운로드 통합

Amazon Web Services의 송진, 조은혜, 이준성

요약

이 패턴은 객체 다운로드를 위해 안전한 사용자 지정 미리 서명된 URLs을 생성하여 Amazon Simple Storage Service(Amazon S3)에 대한 액세스를 간소화합니다. 솔루션은 고유한 도메인과 정적 IP 주소가 있는 단일 엔드포인트를 제공합니다. 정적 IP 주소가 있는 통합 도메인에서 API 및 Amazon S3 엔드포인트를 통합해야 하는 고객에게 맞게 조정되었습니다. 사용 사례에는 IP 및 도메인 허용 목록 방화벽 정책을 따르는 사용자가 포함되며, API 액세스를 특정 도메인 및 IP 주소로 제한합니다.

아키텍처는 Amazon API Gateway AWS Global Accelerator, AWS Lambda Application Load Balancer AWS PrivateLink및 Amazon S3를 AWS 서비스포함한 키를 사용합니다. 이 설계는 미리 서명된 URLs와 정적 IP 주소 2개가 있는 액셀러레이터에 연결된 단일 도메인에서 Amazon S3 엔드포인트를 중앙 집중화합니다. 따라서 사용자는 미리 서명된 URLs 손쉽게 요청하고 고정 IP 주소가 있는 통합 도메인 엔드포인트를 통해 Amazon S3 객체를 다운로드할 수 있습니다.

이 아키텍처는 퍼블릭, 의료 및 금융 부문과 같은 엄격한 정책 또는 규정 준수 요구 사항이 있는 고객에게 특히 유용합니다.

사전 조건 및 제한 사항

사전 조건 

  • 활성 AWS 계정

  • 사용자 지정 도메인 이름의 퍼블릭 호스팅 영역

  • AWS 리전 선택한의 AWS Certificate Manager (ACM)에서 가져온 도메인

제한 사항

  • Amazon S3 버킷 이름은 엔드포인트의 도메인 이름과 일치해야 합니다. 이 요구 사항은 Amazon S3 엔드포인트가 단일 API 엔드포인트를 통해 제공될 수 있도록 하기 위한 것입니다.

  • API Gateway에 사용되는 사용자 지정 도메인 이름은 단일 API 엔드포인트의 도메인 이름과 일치해야 합니다.

  • 일부 AWS 서비스 는 전혀 사용할 수 없습니다 AWS 리전. 리전 가용성은 AWS 리전별 서비스를 참조하세요. 특정 엔드포인트는 서비스 엔드포인트 및 할당량을 참조하고 서비스 링크를 선택합니다.

아키텍처

다음 다이어그램은이 패턴의 대상 아키텍처 및 워크플로를 보여줍니다.

미리 서명된 URL 생성 및 객체 다운로드를 위한 구성 요소 및 워크플로입니다.

다이어그램은 다음 개념과 워크플로를 보여줍니다.

  1. 사용자는 사용자 지정 도메인 이름 및 연결된 IP 주소를 사용하여 서비스되는 사용자 지정 엔드포인트를 AWS Global Accelerator사용하여 미리 서명된 URL을 생성하라는 요청을 시작합니다.

  2. Lambda 함수는 사용자 지정 엔드포인트를 가리키는 미리 서명된 URL을 생성합니다. 미리 서명된 URL이 포함된 301 리디렉션으로 응답합니다. 미리 서명된 리디렉션 URL을 통해 사용자는 Global Accelerator를 통해 제공되는 사용자 지정 엔드포인트를 사용하여 객체를 자동으로 다운로드합니다.

미리 서명된 URL 생성 및 객체 다운로드 워크플로를 위한 전체 아키텍처의 구성 요소는 다음과 같습니다.

  • Global Accelerator에 의한 고정 IP 주소 프로비저닝.

  • 사용자 지정 도메인 이름을 사용하여 Amazon Route 53 퍼블릭 호스팅 영역에 액셀러레이터의 별칭을 A 레코드로 등록합니다.

  • 등록된 사용자 지정 도메인 이름과 일치하는 버킷 이름으로 Amazon S3 버킷 생성.

  • API Gateway 및 Amazon S3 서비스를 위한 VPC 엔드포인트 생성.

  • Global Accelerator에 연결하기 위한 내부 Application Load Balancer의 구성입니다.

  • ACM 인증서가 연결된 API Gateway에 대한 사용자 지정 도메인 이름 할당.

  • Lambda 함수와 통합된 프라이빗 API Gateway 배포.

  • Lambda 함수에는 AWS Identity and Access Management (IAM) 역할이 연결되어 있습니다(GetObject 권한 있음).

도구

AWS 서비스

  • Amazon API Gateway는 규모와 관계없이 REST, HTTP 및 WebSocket API를 생성, 게시, 유지 관리, 모니터링 및 보호하는 것을 지원합니다.

  • Application Load Balancer는 여러 가용 영역의 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스와 같은 여러 대상에 수신되는 애플리케이션 트래픽을 분산합니다.

  • AWS Certificate Manager (ACM)을 사용하면 웹 AWS 사이트와 애플리케이션을 보호하는 퍼블릭 및 프라이빗 SSL/TLS X.509 인증서와 키를 생성, 저장 및 갱신할 수 있습니다.

  • AWS 클라우드 개발 키트 (AWS CDK)는 코드로 AWS 클라우드 인프라를 정의하고 프로비저닝하는 데 도움이 되는 소프트웨어 개발 프레임워크입니다.

  • AWS Global Accelerator는 여러에서 엔드포인트를 지원하는 글로벌 서비스입니다 AWS 리전. AWS 글로벌 네트워크를 통해 트래픽을 최적의 엔드포인트로 보내는 액셀러레이터를 생성할 수 있습니다. 이렇게 하면 전 세계 사용자가 이용하는 인터넷 애플리케이션의 가용성과 성능이 향상됩니다.

  • AWS Identity and Access Management (IAM)는 AWS 리소스에 대한 액세스를 인증하고 사용할 권한이 있는 사용자를 제어하여 리소스에 대한 액세스를 안전하게 관리하는 데 도움이 됩니다.

  • AWS Lambda는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행하는 데 도움이 되는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.

  • AWS PrivateLink를 사용하면 가상 프라이빗 클라우드(VPCs)에서 VPC 외부의 서비스로 단방향 프라이빗 연결을 생성할 수 있습니다.

  • Amazon Route 53은 가용성과 확장성이 뛰어난 DNS 웹 서비스입니다.

  • Amazon Simple Storage Service(S3)는 원하는 양의 데이터를 저장, 보호 및 검색하는 데 도움이 되는 클라우드 기반 객체 스토리지 서비스입니다.

기타 도구

  • Terraform은 HashiCorp의 코드형 인프라(IaC) 도구로, 클라우드 및 온프레미스 리소스를 생성하고 관리하는 데 도움이 됩니다.

코드 리포지토리

기본 설정에 따라 AWS CDK 또는 Terraform을 사용하여이 패턴을 배포할 수 있습니다. 에픽 섹션에는 두 배포 방법에 대한 지침이 포함되어 있습니다. 이 패턴의 코드는 다음 GitHub 리포지토리에서 사용할 수 있습니다.

모범 사례

  • 프로덕션 환경에서 보안을 강화하려면 Amazon Cognito와 같은 권한 부여 메커니즘을 구현하여 PresignedUrl 생성 API에 대한 액세스를 제한하는 것이 중요합니다.

  • 최소 권한 원칙을 따르고 작업을 수행하는 데 필요한 최소 권한을 부여합니다. 자세한 내용은 IAM 설명서의 최소 권한 부여보안 모범 사례를 참조하세요.

에픽

작업설명필요한 기술

도메인 이름을 결정합니다.

통합 Amazon S3 엔드포인트의 퍼블릭 도메인 이름을 결정합니다. 도메인 이름은 Amazon S3 버킷 이름으로도 사용됩니다.

AWS 관리자, 네트워크 관리자

퍼블릭 호스팅 영역을 만듭니다.

Amazon Route 53에서 퍼블릭 호스팅 영역을 생성합니다. 도메인 이름은 API Gateway에서 사용되는 도메인 이름과 일치해야 합니다.

AWS 관리자, 네트워크 관리자

SSL 인증서를 준비합니다.

AWS Certificate Manager (ACM)을 사용하여 웹 애플리케이션 도메인에 대한 SSL 인증서를 요청하거나 가져옵니다.

AWS 관리자, 네트워크 관리자
작업설명필요한 기술

Terraform 개발 환경을 설정합니다.

개발 환경을 설정하려면 다음을 수행합니다.

  1. Terraform 버전 1.0 이상을 설치합니다.

  2. 터미널 창에서 다음 명령을 실행하여 GitHub s3-presignedurl-staticips-endpoint-with-terraform 리포지토리를 복제합니다.

    git clone https://github.com/aws-samples/s3-presignedurl-staticips-endpoint-with-terraform.git

AWS 관리자, 클라우드 관리자

.tfvars provider.tf 파일을 수정합니다.

  1. 필요한 파일 생성 .tfvars - 1.vpc_alb_ga2.apigw_s3_lambda 디렉터리 모두에서 apg.tfvars 파일을 생성합니다. 이러한 파일에는 환경별 변수 값이 포함됩니다.

    • 의 경우 다음 템플릿을 사용하여 파일을 1.vpc_alb_ga/apg.tfvars생성합니다.

      hcl environment_name = "test" domain = "your-domain.com" s3_bucket_prefix = "your-bucket-prefix" aws_region = "ap-northeast-2" # Change to your preferred region
    • 의 경우 다음 템플릿으로 파일을 2.apigw_s3_lambda/apg.tfvars생성합니다(1단계 완료 vpc_id 후를 업데이트해야 함).

      hcl vpc_id = "vpc-xxxxxxxxx" # Update this with the VPC ID output from step 1 environment_name = "test" domain = "your-domain.com" s3_bucket_prefix = "your-bucket-prefix" aws_region = "ap-northeast-2" # Change to your preferred region
  2. 파일 수정 provider.tf- 1.vpc_alb_ga2.apigw_s3_lambda 폴더 모두에서 로컬 AWS 구성과 일치하도록 provider.tf 파일을 편집합니다.

    hcl provider "aws" { region = "ap-northeast-2" # Change to your preferred region profile = "apg" # Change to your AWS profile name }

다음을 참조하세요.

  • .tfvars 파일의 자리 표시자 값을 실제 값으로 바꿉니다.

  • 첫 번째 Terraform 배포(1.vpc_alb_ga)를 완료한 후의 vpc_id 값을 출력의 VPC ID2.apigw_s3_lambda/apg.tfvars로 업데이트합니다.

  • provider.tf 파일의 AWS 프로필 이름이 ~/.aws/credentials 파일의 기존 프로필과 일치하는지 확인합니다.

  • 도메인 값은 Route 53 호스팅 영역 도메인과 일치해야 합니다.

  • 도메인과 s3_bucket_prefix 결합된는 Amazon S3 버킷 이름(예: your-bucket-prefix.your-domain.com)을 구성합니다.

  • 를 변경하는 경우 선택한와 일치하도록 main.tf 파일의 하드 코딩된 가용 영역을 업데이트해야 할 aws_region수도 있습니다 AWS 리전.

AWS 관리자, 클라우드 관리자

네트워크 리소스를 프로비저닝합니다.

네트워크 리소스를 프로비저닝하려면 다음 명령을 실행합니다.

cd ./2.vpc_alb_ga terraform init terraform plan --var-file=apg.tfvars terraform apply --var-file=apg.tfvars

apply 명령을 실행하는 동안 메시지가 표시되면 yes를 입력합니다.

AWS 관리자, 클라우드 관리자

API Gateway, Amazon S3 및 Lambda를 프로비저닝합니다.

네트워크 리소스를 프로비저닝하려면 다음 명령을 사용합니다.

cd ./2.apigw_s3_lambda terraform init terraform plan --var-file=apg.tfvars terraform apply --var-file=apg.tfvars
AWS 관리자, 클라우드 관리자
작업설명필요한 기술

AWS CDK 개발 환경을 설정합니다.

개발 환경을 설정하려면 다음을 수행합니다.

  1. 를 설치합니다 AWS CDK.

  2. 터미널 창에서 다음 명령을 실행하여 GitHub s3-presignedurl-staticips-endpoint-with-cdk 리포지토리를 복제합니다.

    git clone https://github.com/aws-samples/s3-presignedurl-staticips-endpoint-with-cdk.git

AWS 관리자, 클라우드 관리자

config/index.ts 파일에서 도메인 설정을 구성합니다.

상수 변수의 옵션을 편집하려면 다음 명령을 사용합니다.

export const options = { certificateArn: '{arn of the acm which created before}', dnsAttr: { zoneName: '{public hosted zone name}', hostedZoneId: 'hosted zone Id', }, domainNamePrefix: '{Prefix for the domain}', presignPath: 'presign', objectsPath: 'objects', };

명령에서 각 자리 표시자를 자신의 정보로 바꿉니다.

  • 를 ACM 인증서 Amazon 리소스 이름(ARN)'{arn of the acm which created before}'으로 바꿉니다.

  • '{public hosted zone name}'를 도메인 이름으로 바꿉니다.

  • 를 Route 53 호스팅 영역 ID'hosted zone Id'로 바꿉니다.

  • 를 사용하려는 도메인 접두사'{Prefix for the domain}'로 바꿉니다.

  • 선택적으로 특정 사용 사례에 필요한 경우 'presign''objects' 경로를 수정합니다.

AWS 관리자, 클라우드 관리자

스택을 배포합니다.

Virtual Private Cloud(VPC)용 스택과 애플리케이션용 스택의 두 스택을 배포하려면 다음 명령을 사용합니다.

$ npm install $ cdk synth $ cdk deploy --all
AWS 관리자, 클라우드 관리자
작업설명필요한 기술

엔드포인트의 IP 주소를 확인합니다.

이 패턴의 도메인에 고정 IP 주소가 있는지 확인하려면 다음 명령을 사용합니다.

nslookup ${s3-bucket-prefix}.${domain}
네트워크 관리자

나중에 다운로드할 수 있는 테스트 파일을 업로드합니다.

Amazon S3 버킷의 '/objects' 폴더에 테스트 파일을 업로드합니다.

AWS 관리자, 클라우드 관리자

API를 호출하여 미리 서명된 URL을 생성합니다.

미리 서명된 URL을 생성하려면 다음 형식을 사용하여 브라우저 또는 API 클라이언트(예: Postman)에서 URL을 호출합니다.

https://${s3-bucket-prefix}.${domain}/presign/objects/${uploaded-filename}

${s3-bucket-prefix} 및의 자리 표시자 값을 이전 단계에서 설정한 ${domain} 값으로 바꿉니다.

앱 소유자

결과를 확인합니다.

예상되는 결과는 301(영구적으로 이동됨) 리디렉션 상태 코드를 받아야 한다는 것입니다. 이 응답에는 테스트 파일 다운로드를 자동으로 시작하는 미리 서명된 URL이 포함됩니다.

테스트 엔지니어
작업설명필요한 기술

API Gateway, Amazon S3 및 Lambda 리소스를 폐기합니다.

리소스를 삭제하려면 다음 명령을 사용합니다.

cd ./2.apigw_s3_lambda terraform init terraform plan --destroy --var-file=apg.tfvars terraform destroy --var-file=apg.tfvars
AWS 관리자, 클라우드 관리자

네트워크 리소스를 폐기합니다.

네트워크 리소스를 삭제하려면 다음 명령을 사용합니다.

cd ./1.vpc_alb_ga terraform init terraform plan --destroy --var-file=apg.tfvars terraform destroy --var-file=apg.tfvars
AWS 관리자, 클라우드 관리자
작업설명필요한 기술

스택을 폐기합니다.

VPC 스택과 애플리케이션 스택을 모두 삭제하려면 다음 명령을 사용합니다.

$ cdk destroy --all
AWS 관리자, 클라우드 관리자

Amazon S3 버킷을 비우고 삭제합니다.

기본적으로 삭제되지 않은 객체 Amazon S3 버킷과 로그 Amazon S3 버킷을 비우고 삭제합니다.

Amazon S3 버킷 이름은 ${s3-bucket-prefix}.${domain} 및 입니다${s3-bucket-prefix}.${domain}-logs.

AWS Command Line Interface (AWS CLI)를 사용하여 버킷을 삭제하려면 다음 명령을 사용합니다.

$ aws s3 rm s3://${s3-bucket-prefix}.${domain} --recursive $ aws s3 rb s3://${s3-bucket-prefix}.${domain} --force $ aws s3 rm s3://${s3-bucket-prefix}.${domain}-logs --recursive $ aws s3 rb s3://${s3-bucket-prefix}.${domain}-logs --force

${s3-bucket-prefix}${domain}를 이전 단계에서 설정한 값으로 바꿉니다.,/p>

AWS 관리자, 클라우드 관리자

관련 리소스

AWS 블로그