티스토리 뷰

Private Subnet에 배포된 EC2 인스턴스가 S3에 Gateway Endpoint를 통해 연결해야 하는 요구 사항을 처리해야 했다.

당연히 인터넷 망을 타면 안되는 상황이었다. 그리고 당연히 S3의 기본 정책은 Block Public Access On 인 상태.

AWS SDK에서 제공하는 s3의 GetObject API를 사용하는건 전혀 문제가 되지 않았다. AWS SDK에서 접근 하는 것은 EC2의 InstanceRole Credential 정보를 담고 나가기 때문이다.

문제는, AWS SDK 없이 curl, wget, ffmpeg 등이 standalone application을 통해 S3의 주소로 접근 하려 할 때 문제가 발생했다.

일단, S3 주소는 크게 아래의 두가지가 존재한다.

s3.amazonaws.com/~~~ 그리고 s3.ap-northeast-2.amazonaws.com/~~~

전자로 접근하면 dns lookup시 인터넷 망을 타게 되고, 후자로 접근하면 알아서 internal ip를 리턴하여 내부망으로 접근하게 된다.

따라서 Private Subnet 안의 인스턴스가 S3를 내부망으로 이용하기 위해선 후자의 주소를 사용하면 된다.

그리고 S3FullAccess 권한이 있는 Credential 정보를 담고 접근하면 큰 문제가 없다.

 

하지만 curl, wget, ffmpeg 등을 통해 s3의 주소로 접근하고자 할 때는, 아무런 Credential 정보가 없다.

따라서 우리는 AWS Signature V4를 통해 생성한 값을 https의 Header로 넣어야 했다.

docs.aws.amazon.com/code-samples/latest/catalog/python-signv4-v4-signing-get-authheader.py.html

 

v4-signing-get-authheader.py - AWS Code Sample

v4-signing-get-authheader.py shows how to make a request using the Amazon DynamoDB query API. The request makes a POST request and passes values to AWS in the body of the request. Authentication information is passed using the Authorization request header.

docs.aws.amazon.com

위의 코드를 참조하는 것이 정신건강에 이롭다.

근데.. 아무리 시도해도.. 안된다.. 계속 403 forbidden이 뜨거나 400 bad request가 뜬다.

 

알고보니 S3용 Signature 문서가 따로 있더라..

docs.aws.amazon.com/ko_kr/AmazonS3/latest/API/bucket-policy-s3-sigv4-conditions.html

 

Amazon S3 Signature Version 4 Authentication Specific Policy Keys - Amazon Simple Storage Service

Amazon S3 Signature Version 4 Authentication Specific Policy Keys The following table shows the policy keys related Amazon S3 Signature Version 4 authentication that can be in Amazon S3 policies. In a bucket policy, you can add these conditions to enforce

docs.aws.amazon.com

이렇게 sigv4용 bucket policy도 설정해 줘야 한다.

파일 다운로드 받을땐 아래의 메뉴얼이 좋다.

docs.aws.amazon.com/ko_kr/AmazonS3/latest/API/sigv4-query-string-auth.html

 

Authenticating Requests: Using Query Parameters (AWS Signature Version 4) - Amazon Simple Storage Service

Authenticating Requests: Using Query Parameters (AWS Signature Version 4) As described in the authentication overview (see Authentication Methods), you can provide authentication information using query string parameters. Using query parameters to authenti

docs.aws.amazon.com

가능하면 다운로드는 queryString을 써서 GET으로 접근하고, 업로드는 header를 써서 POST로 접근하는게 좋은 듯 하다.

 

하지만 이 방법을 해보기에는 마감 시간이 얼마 남지 않아서..

Presigned URL을 쓰기로 결정했다.

테스트 해 본 결과 Presigned URL을 싸이닝 했더라도, 인터넷 망을 타지 않기 때문에 Private이 아니라 Isolated Subnet 에서도 Private Link(VPC S3 Gateway Endpoint)를 통해 데이터 전송이 가능한 것으로 파악됐다.

따라서, 이미 EC2 Instance는 S3FullAccess가 있었기 때문에, 인스턴스 스스로 boto3 등의 SDK 사용을 통해 S3 Key를 Presigned 하였고, 해당 Presinged URL을 wget에 넘겼더니 무사히 파일다운로드가 가능했다.

이 과정에서 presigned url이 외부로 노출되는 일도 없었기 때문에 가장 쉽고 안전한 방법이라 판단되었다.

AWS Signature V4를 만드는 과정이 생각보다 빡세기 때문에, URL이 노출될 위험이 없다면, Presigned URL을 쓰는 것도 좋은 Practice인 것 같다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함