본문 바로가기
AWS/AWS Cloud School

[AWS] Amazon S3 VPC 엔드포인트 생성

by parkkingcar 2023. 11. 30.

 

 

Amazon S3 VPC 엔드포인트 통신 보안을 위한 실습을 진행합니다. 실습을 통해 아래 내용을 확인 할 수 있습니다.

 

- 프라이빗 서브넷과 퍼블릭 서브넷 및 각 서브넷의 Amazon S3와 통신할 수 있거나 없는 이유

- AWS 관리 콘솔 및 AWS Command Line Interface(AWS CLI)를 사용하여 VPC 엔드포인트 구성 

- 프라이빗 서브넷의 VPC 엔드포인트를 통해 Amazon S3와 상호 작용 

- 리소스 액세스를 제한하는 VPC 엔드포인트 정책 생성

 

 

 

아래 다이어그램은 이 실습을 위해 프로비저닝된 리소스 환경입니다.

 

 

 

 

먼저 콘솔 상단 검색창에서 EC2를 검색하고 선택합니다. 

 

 

왼쪽 탐색 창에서 Security Groups를 선택한 후, HTTPS-SSM-ENDPOINT 보안 그룹이 미리 생성되어 있음을 확인합니다. 이 그룹에는 포트 443에 대한 모든 VPC 트래픽(10.0.0.0/16) 액세스를 허용하는 인바운드 HTTPS 규칙이 있습니다. VPC 엔드포인트에 연결된 보안 그룹은 포트 443에서 들어오는 연결을 허용해야 합니다. 따라서 세션 관리자를 사용하여 인스턴스에 직접 연결할 수 있습니다.

 

 

왼쪽 탐색 창에서 Instances를 선택합니다. PublicCommandHost 인스턴스를 선택합니다. 우측 상단에 연결을 클릭합니다.

 

 

Session Manager 탭을 선택하고 연결을 클릭합니다.

 

 

그러면 아래 화면과 같이 터미널 연결이 있는 브라우저 탭이 실행됩니다. 

 

 

탭을 닫고, 이번에는 PrivateCommandHost 인스턴스를 선택한 후 연결을 클릭합니다.

 

 

Session Manager 탭을 선택하면 아래와 같이 오류 메시지가 표시됩니다. 세션 관리자를 사용하여 인스턴스에 연결하기 위해 인터페이스 엔드포인트를 생성할 수 있습니다.

 

 

이제 AMAZON VPC 엔드포인트 생성합니다. 콘솔 상단 검색창에서 VPC를 검색하고 선택합니다. 왼쪽 탐색 창에서 엔드포인트를 선택하고 엔드포인트 생성을 클릭합니다.

 

 

이름태그에 'SSM Endpoint'를 입력하고 서비스 필터에 ssm을 입력합니다. 이후 com.amazonaws.REGION.ssm를 선택합니다. REGION에는 실습에 사용한 리전이 표시됩니다.

 

 

VPC의 드롭다운 메뉴에서 labVPC를 선택합니다. 서브넷 섹션에서 해당 가용영역을 선택하고 서브넷 ID에서 PrivateSubnetA를 선택합니다. 보안그룹 섹션에서 443포트를 허용하기위해 생성한 보안그룹을 선택합니다. 이후 우측 하단의 엔드포인트 생성을 클릭합니다.

 

 

다시 EC2 대시보드에서 인스턴스 탭의 PrivateCommandHost 인스턴스를 선택한 후 연결을 클릭합니다.

 

 

최초 화면과는 다르게 아래와 같이 오류가 발생하지 않습니다.

 

 

 

퍼블릭 EC2 인스턴스에 위 Session Manager를 통해 CLI환경에서 AWS S3 리소스와  상호 작용이 가능합니다. 하지만 프라이빗 EC2 인스턴스에서는 불가능합니다. 프라이빗 서브넷에서 S3리소스에 접근하기 위해 Amazon S3용 VPC 엔드포인트를 생성해야 합니다.

 

 

Command Host 터미널에서 PrivateCommandHost와 PublicCommandHost 서버에서 둘 다 $aws configure 명령을 실행합니다. 메시지가 표시되면 아래와 같이 구성합니다.

AWS Access Key ID [None]: Enter 키를 누릅니다. 

AWS Secret Access Key [None]: Enter 키를 누릅니다. 

Default region name [None]: 리전명을 입력합니다.

Default output format [None]: json

 

 

이제 Amazon S3용 VPC 엔드포인트 생성합니다. 퍼블릭 인스턴스에 연결하는 데 사용했던 탭으로 다시 전환합니다.

 

 

생성된 VPC 엔드포인트가 있는 서비스를 나열하려면 다음 명령을 실행합니다.

aws ec2 describe-vpc-endpoints --query 'VpcEndpoints[*].ServiceName'

 

 

labVPC의 VPC ID를 찾으려면 다음 명령을 실행합니다.

VPC=$(aws ec2 describe-vpcs --query 'Vpcs[*].VpcId' --filters 'Name=tag:Name, Values=labVPC' | jq -r '.[0]')
echo $VPC

 

 

프라이빗 라우팅 테이블의 라우팅 테이블 ID를 찾으려면 다음 명령을 실행합니다.

RTB=$(aws ec2 describe-route-tables --query 'RouteTables[*].RouteTableId' --filters 'Name=tag:Name, Values=PrivateRouteTable' | jq -r '.[0]')
echo $RTB

 

 

Amazon S3 엔드포인트를 생성하기 위해 다음 명령을 실행합니다.

TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
export AWS_REGION=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.region')
echo $AWS_REGION
aws ec2 create-vpc-endpoint \
    --vpc-id $VPC \
    --service-name com.amazonaws.$AWS_REGION.s3 \
    --route-table-ids $RTB

 

 

이제 Amazon S3 VPC 엔드포인트가 생성되었습니다. Amazon S3 VPC 엔드포인트가 생성되었는지 확인하려면 다음 명령을 실행합니다.

aws ec2 describe-vpc-endpoints --query 'VpcEndpoints[*].ServiceName'

 

 

 

이제 프라이빗 인스턴스를 통해 Amazon S3와 상호작용을 할 수 있습니다. 아래와 같이 퍼블릭 리소스를 사용하지 않고 S3에 직접 엑세스할 수 있습니다.

 

 

프라이빗 인스턴스에 연결하는 데 사용했던 탭으로 전환합니다. 계정에서 액세스할 수 있는 모든 S3 버킷을 나열하려면 다음 명령을 실행합니다.

aws s3 ls

 

 

S3버킷에 있는 모든 파일을 나열하려면 다음 명령을 실행합니다. < LabBucket>에 버킷 주소를 입력합니다.

aws s3 ls s3://<LabBucket>

 

 

Amazon S3에서 인스턴스 로컬 홈 디렉터리로 파일을 복사하려면 다음 명령을 실행합니다. <LabBucket>에 버킷 주소를 입력합니다.

aws s3 cp s3://<LabBucket>/demo.txt ~/

 

Amazon S3 VPC 엔드포인트가 생겼으므로 이제 Amazon S3에서 프라이빗 인스턴스의 파일을 다운로드할 수 있습니다.

 

 

 

추가적으로 아래 다이어그램과 같이 콘솔 또는 AWS CLI를 사용하여 labbucket에 대한 액세스는 허용하지만 labloggingbucket에 대한 액세스는 거부하는 정책을 Amazon S3 VPC 게이트웨이 엔드포인트에 추가할 수 있습니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:List*",
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::<LabBucket>",
                "arn:aws:s3:::<LabBucket>/*"
            ]
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::<LabLoggingBucket>",
                "arn:aws:s3:::<LabLoggingBucket>/*"
            ]
        }
    ]
}

댓글