endpoint 설정 없이 사설 ip로 S3 접근하기 (feat. hosts 파일)

endpoint 설정 없이 사설 ip로 S3 접근하기 (feat. hosts 파일)

S3 interface endpoint 출시

S3 endpoint service 에 드디어 interface endpoint가 나왔다.

AWS S3 public 서비스라던데… 혹시 VPC에서는 사설통신이 되나요?

네 됩니다.

AWS에는 Private Link 혹은 VPC Endpoint 라고 불리는 서비스가 있다. 이름에서 알 수 있듯이 AWS의 서비스를 뭔가 Private 하게 쓸수 있게 해주는 기능이다. 여기에는 Interface Endpoint, Gateway Endpoint 두가지 타입이 있는데 S3는 그 동안엔
gateway endpoint 만 제공했다. 사실 모든 서비스가 둘중 하나의 타입으로만 제공했다. 예를들어 SQS 나 DynamoDB 같은 경우엔 Gateway 타입으로만 제공이 됐고 나머지는 Interface 타입으로만 제공이 됐다. gateway endpoint는 VPC 내에서는 어플리케이션에서 엔드포인트 변경등이 필요없이 바로 적용이 되는 장점이 있지만 ip가 제공되지 않는다는 단점이 있다.

이게 왜 단점이 되냐면, 어디 AWS를 쓰는 사용자가 AWS만 쓰는가? 클라우드로 시작한 회사가 아니라면 IDC에서 운영되고 있는 서버가 있고 IDC의 네트워크와 AWS가 연동되어 있는 경우가 많다. 꼭 물리적인 네트워크가 아니더라도 클라우드 끼리 연동되어 있는 경우도 많다. 그런데 그런 경우 저렇게 Gateway 타입으로 제공되는 endpoint에 사설통신을 하려면 Squid 등을 이용해 프록시를 구성해서 접근해야 했다.

그런데 이제 interface gateway가 나와서 프록시를 안써도 된다. 그냥 vpc에 s3 interface gateway를 만들면 나만의 s3 엔드포인트가 생성이 되고 내 어플리케이션에 엔드포인트를 생성된 엔드포인트로 바꿔주기만 하면 그게 VPC에 있든, 온프레미스에 있든 상관없이 그 ENI에 해당하는 사설 ip로 트래픽이 가게 된다.

게이트웨이 엔드포인트 VS 인터페이스 엔드포인트

Amazon S3용 게이트웨이 엔드포인트 Amazon S3용 인터페이스 엔드포인트
두 경우 모두, 네트워크 트래픽은 Amazon 네트워크에 남아 있습니다.
Amazon S3 퍼블릭 IP 주소 사용 VPC의 프라이빗 IP 주소를 사용하여 Amazon S3에 액세스
온프레미스에서의 액세스 허용하지 않음 온프레미스에서의 액세스 허용
다른 AWS 리전에서의 액세스 허용하지 않음 다른 AWS 리전에서의 액세스 허용

(출처: https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/privatelink-interface-endpoints.html )

endpoint를 명시해서 interface endpoint로 가는 방법.

간단하다. aws s3 cli, sdk 등에는 옵션으로 endpoint를 명시할수 있는데 해당 endpoint에 interface endpoint 에서 제공하는 endpoint를 입력하면 된다.

예를들어 AWS CLI를 이용할 경우

AWS CLI
1
aws s3 --endpoint-url https://bucket.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com ls s3://my-bucket/

python sdk 이용하는경우

python sdk(boto3)
1
2
3
4
s3_client = session.client(
service_name='s3',
endpoint_url='https://bucket.vpce-1a2b3c4d-5e6f.s3.us-east-1.vpce.amazonaws.com'
)

이런식으로 해주면 끝.

그런데…

endpoint 옵션이 없는데 어떡해요?

endpoint 옵션 없이 interface endpoint 접근하기.

가끔 s3 connector라고 나온 애들 중에 endpoint를 특정해줄 수 없는 것들이 있다.
그러면 강제로 호스트파일을 수정해 해결할 수 있다.

우선 내 s3 endpoint의 ip를 알아내자. nslookup 해도 되고, 아래처럼 콘솔에서 바로 보여주기도 한다.

여기에서 얻은 ip를 들고

/etc/hosts 를 다음과 같이 수정

/etc/hosts
1
2
3
4
...
10.0.0.23 s3.ap-northeast-2.amazonaws.com
10.0.0.23 s3-r-w.ap-northeast-2.amazonaws.com
10.0.0.23 mybucket.s3.ap-northeast-2.amazonaws.com

s3-r-w로 시작하는 엔드포인트는 read, write를 위한 엔드포인트
mybucket.s3 는 각 버킷의 엔드포인트이다. 내 버킷의 이름으로 바꿔주자.

끝.

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×