Kiểm chứng kết nối đến S3 thông qua AWS Site-to-Site VPN (Part 2)

Kiểm chứng kết nối đến S3 thông qua AWS Site-to-Site VPN (Part 2)

avatar

Phong Nguyen

2025.07.04

Bài viết này giúp bạn biết các tạo một trường kiểm chứng kết nối Site-to-Site VPN. Có được môi trường này, chúng ta tiến hành kiểm chứng kết nối S3 từ On-premise thông qua Site-to site VPN

Giới thiệu

Chào mọi người, mình là Phong - Mentor các lớp AWS tại Cloud Mentor Pro.

Hôm nay mình tiếp tục chia sẻ 1 bài lab về use-case thực tế.

Có một dự án mình tham gia khi khách hàng đã có đường kết nối Direct Connect từ On-premise đến AWS Account. Một trong số các công việc của mình là:

  1. Thiết lập các setting để application phía On-premise có thể upload data hằng ngày lên S3.
  2. Đồng thời thì setting để cho phép bên thứ 3 khác (Có application trên môi trường AWS) truy cập đến S3 của Khách mình

Cái 2 thì không khó, mình có thể tạo 2 account để kiếm chứng setting trước khi setting và hướng dẫn cho bên thứ 3. Nhưng cái 1 thì đâu ra môi trường Direct Connect để kiểm chứng đây (Nếu không có môi trường kiểm chứng để setting 1 phát ăn ngay, mà sử dụng môi trường Khách để setting thực tế khá nguy hiểm nếu sai, hoặc mất nhiều thời gian liên lạc)

Để tạo môi trường kiểm chứng kết nối S3 từ On-premise thì có thể sử dụng Site-to site VPN.

Sau đó thì đi tiến hành các config cần thiết.

Mục tiêu bài này là: Kiểm chứng kết nối S3 từ On-premise thông qua Site-to site VPN

Lab Introduction

  • AWS experience: Intermediate
  • Time to complete: 50 minutes
  • AWS Region: US East (N. Virginia) us-east-1
  • Services used: VPC resource, EC2, IAM, Customer Gateway, Vitual Private Gateway, Site-To-Site VPN, S3

Prerequisites

  • Tiền đề là bạn đã chuẩn bị xong được môi trường kiểm chứng ở phần 1
  • AWS Account với quyền Admin
  • Kiến thức về Site-To-Site VPN
  • SSH để connect vào EC2 sử dụng Session Manager

Môi trường bạn cần chuẩn bị

Chúng ta cần xây dựng lại môi trường kiểm chứng: on-premise và AWS sẽ được kết nối thông qua AWS Site-to-Site VPN. Xem lại Phần 1

Architecture Diagram

Kiến trúc chúng ta xây dựng trong bài Lab hôm nay như sau:

Mục tiêu chúng ta là đứng từ Client (On-premise) có thể thực hiện upload object lên S3 (AWS)

Task Details

Chuẩn bị: Đảm bào rằng Site-to-Site VPN Tunnel 1 đã UP

  1. Tạo S3 Bucket
  2. Tạo Policy
  3. Tạo Access key
  4. Tạo Role Access đến S3
  5. Create SG for Endpoint
  6. Create endpoint
  7. Setting S3 bucket policy (Optional)
  8. Kiểm tra kết nối

Các bước từ 1 đến 6 như hình bên dưới

Chuẩn bị

Đảm bào rằng Site-to-Site VPN Tunnel 1 đã UP

1. Tạo S3 Bucket

  • AWS Region: US East (N. Virginia) us-east-1
  • Bucket name: soa-s3-vpn-demo-{Random ID}

2. Tạo Policy

Policy cho Role cần access đến S3

  • Name: SOAS3VpnDemoAccessPolicy
  • Json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "s3:ListAllMyBuckets",
            "Resource": "arn:aws:s3:::*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": "arn:aws:s3:::soa-s3-vpn-demo-*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:AbortMultipartUpload",
                "s3:ListMultipartUploadParts",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::soa-s3-vpn-demo-*/*",
            "Effect": "Allow"
        }
    ]
}

3. Tạo Access key

Tạo IAM User:

  • Name: soa-s3-vpn-demo-assumerole-user
  • KHÔNG cấp quyền access Console
  • KHÔNG Set permissions

Sau khi tạo IAM User xong thì chúng ta tạo Access key, Secret key cho User này. Vì mục tiêu là cần Access S3 từ môi trường on-premise, nên phải cần thông tin này.

Lưu Access key và Secret key để lát nữa chúng ta sử dụng

4. Tạo Role Access đến S3

Role này chỉ cho phép User phía trên có quyền AssumeRole sang

  • Select trusted entity: Custom trust policy
  • Custom trust policy: (thay thế AWS Account ID của bạn)
{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Principal": {
              "AWS": "arn:aws:iam::XXXXXXXX:user/soa-s3-vpn-demo-assumerole-user"
          },
          "Action": "sts:AssumeRole"
      }
  ]
}
  • Permissions policies : SOAS3VpnDemoAccessPolicy
  • Role name: SOAS3VpnDemoAccessRole

5. Create SG for Endpoint

Security group này dùng cho cả S3 Endpoint và STS Endpoint

  • Security group name: soa-sg-vpn-demo-endpoint
  • Description: Allow access from On-premise
  • VPC: Chọn VPC phía AWS (192.168.0.0/22)
  • Inbound, Outbound, Tag như trong hình
    • Inbound: Cho phép https từ On-premise - 10.0.0.0/22
  • Tag:
    • Key: Name
    • Value: soa-sg-vpn-demo-endpoint

6. Create endpoint

6.1 Create endpoint for S3

  • Name tag: soa-endpoint-vpn-demo-s3
  • Type: AWS services
  • Services: com.amazonaws.us-east-1.s3

  • Network settings
    • VPC: Chọn VPC phía AWS (192.168.0.0/22)
  • Subnets:
    • Chỉ có 1 subnet để chọn thôi
  • Security groups: soa-sg-vpn-demo-endpoint
  • Policy: Full access
  • Create Endpoint

6.2 Create endpoint for STS

  • Name tag: soa-endpoint-vpn-demo-sts
  • Type: AWS services
  • Services: com.amazonaws.us-east-1.sts

  • Network settings
    • VPC: Chọn VPC phía AWS (192.168.0.0/22)
  • Subnets:
    • Chỉ có 1 subnet để chọn thôi
  • Security groups: soa-sg-vpn-demo-endpoint
  • Policy: Full access
  • Create Endpoint

Mất chút thời gian thì 2 Endpoint mới Available

7. Setting S3 bucket policy (Optional)

Vì sao setting này là optional?

  • Vì chúng ta đã có Access key có quyền AssumeRole sang Role Access được S3
  • Security group của Endpoint đã cho phép traffic đến từ Onpre CIDR
  • Site to site VPN đã thiết lập kết nối OK
  • Endpoint cho STS và S3 đã có

Vậy nên sẽ không gặp vấn đề kết nối đến S3 tại thời điểm này.

Tại sao chúng ta cần thêm S3 bucket policy? => Để cường hoá Security

Chúng ta sẽ thiết lập bucket policy của S3 để từ DENY tất cả các truy cập ngoại trừ "truy cập thông qua S3 interface VPC endpoint của môi trường AWS HOẶC truy cập từ IAM User/IAM Role cụ thể".

Về việc kiểm soát truy cập từ on-premises đến S3, sẽ tổng hợp như sau:

  • Security group dành cho interface VPC endpoint cho phép truy cập từ private IP của on-premises
    • Phần này đã được thiết lập ở bước 5
  • Bucket policy cho phép truy cập thông qua S3 interface VPC endpoint
    • Nói chính xác hơn, chúng ta sẽ không từ chối truy cập thông qua S3 interface VPC endpoint.

Tuy nhiên, nếu chỉ cho phép truy cập thông qua S3 interface VPC endpoint thì sẽ không thể truy cập từ Management Console. Vậy nên mình cũng sẽ cho phép cả IAM user (User có quyền Admin mình hay sử dụng). Chi tiết xin tham khảo s3 bucket policy dưới đây.

Bạn cần thay đổi các thông tin sau:

  • Bucket name: Tên s3 bucket
  • PrincipalArn: bạn chỉ cần thay thế Account ID và IAM user của bạn (User bạn đang sử dụng)
  • SourceVpce: Tham khảo cách lấy thông tin hình bên dưới

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::soa-s3-vpn-demo-00411737",
                "arn:aws:s3:::soa-s3-vpn-demo-00411737/*"
            ],
            "Condition": {
                "StringNotEquals": {
                    "aws:SourceVpce": "vpce-0be05af2e4db214a4",
                    "aws:PrincipalArn": "arn:aws:iam::XXXXXXXX:user/cloudmentor.pro"
                }
            }
        }
    ]
}

8. Kiểm tra kết nối

8.1 Config aws credential

Sử dụng Session Manager, login vào SOA-S2S-VPN-Onpre-Private-EC2 (Giả lập Client ở On-premise)

Thực hiện config

  • Access key và Secret key là thông tin bạn download về ở bước 3
aws configure
AWS Access Key ID [None]: <YOUR ACCESS KEY>
AWS Secret Access Key [None]: <YOUR SECRET KEY>
Default region name [None]: us-east-1
Default output format [None]: json

Setting profile dùng cho switch role

vi ~/.aws/config

Thêm nội dung như bên dưới (Nhớ thay thế Account ID của bạn)

[profile s3-access]
region = us-east-1
role_arn = arn:aws:iam::XXXXXXXXX:role/SOAS3VpnDemoAccessRole
source_profile = default

8.2 Setting AWS_ENDPOINT_URL_<SERVICE>

Lấy thông tin Endpoint URL và chạy lệnh bên dưới:

export AWS_ENDPOINT_URL_STS=https://{STS EndpointDNS}
export AWS_ENDPOINT_URL_S3=https://bucket.{S3 Interface Endpoint DNS}
  • AWS_ENDPOINT_URL_STS

  • AWS_ENDPOINT_URL_S3 (Copy và nhớ bỏ dấu *)

Dưới đây là ví dụ lệnh của mình

export AWS_ENDPOINT_URL_STS=https://vpce-02ddeb1f9bb8c6cc3-c9szpgxb.sts.us-east-1.vpce.amazonaws.com
export AWS_ENDPOINT_URL_S3=https://bucket.vpce-0be05af2e4db214a4-m0vitinp.s3.us-east-1.vpce.amazonaws.com

Test thử nhé

aws s3 ls --profile s3-access

Ok! nó đã work nhưng để mình giải thích với các bạn tại sao lại dùng 2 cái lệnh export phía trên.

Trước khi chạy 2 lệnh export:

  • Giả sử chúng ta chạy lệnh bên dưới:
aws s3 ls --profile s3-access --endpoint-url https://bucket.{S3 interface endpoint DNS}

Thoạt nhìn thì thấy câu lệnh ok, có switch role, có access đến S3 thông tin endpoint. Nhưng hãy xem hình bên dưới

Để giải quyết vấn đề này chúng ta cần 2 bước

  1. Thực hiện Switch role đi qua STS endpoint
  2. Access đến S3 thông tin S3 endpoint

Sẽ trông như hình bên dưới:

Tuy nhiên thì Guideline có hơi nhiều bước nên để ngắn gọn thì sử dụng 2 lệnh export phía trên

Các bạn có thể them khảo thêm tại đây: Using endpoints in the AWS CLI - Set service-specific endpoints

8.3 Test upload object

Đứng tại SOA-S2S-VPN-Onpre-Private-EC2

Nhớ thay tên bucket của bạn

cd ~
touch test.txt
aws s3 cp ./test.txt s3://{S3 bucket name}/ --profile s3-access

Clean Up

  1. Delete 2 endpoint:
    1. soa-endpoint-vpn-demo-s3
    2. soa-endpoint-vpn-demo-sts
  2. Delete IAM User: soa-s3-vpn-demo-assumerole-user
    1. Deactive Key
    2. Delete user
  3. Delete Role: SOAS3VpnDemoAccessRole
  4. Delete Policy: SOAS3VpnDemoAccessPolicy
  5. Delete Security group: soa-sg-vpn-demo-endpoint
  6. Empty và delete S3 bucket: soa-s3-vpn-demo-{Random ID}
  7. Delete môi trường kiểm chứng Site-to-Site VPN

Mở Cloudshell và chạy lệnh bên dưới

TAGPREFIX=SOA-S2S-VPN
aws cloudformation delete-stack --stack-name "VPNtest-Onpre-${TAGPREFIX}"
aws cloudformation delete-stack --stack-name "VPNtest-AWS-${TAGPREFIX}"

Đợi đến khi CLoudformation stack được xoá hoàn toàn (Hiện tại đang In progress)

Nếu có Delete stack Fail thì Retry delete lại và Force delete

Tài liệu tham khảo: