AWS Networking: 淺談VPC Endpoint Services and VPC Endpoints

Yenlin Chen
Yenlin Chen
10 min readMar 28, 2021

--

利用VPC Endpoint Services和VPC Endpoints,將跨AWS帳號的network traffic只透過AWS內部網路骨幹上傳遞,而不要經由public internet。

因緣際會

即便已經在亞馬遜工作了幾年,但也不是每個工程師都有機會摸到backend的networking規劃及設定,我就是其中沒碰過的一員!我想,主要原因是這種相對low-level的系統架構,大多都在一個backend service的草創階段就已經規畫建構完成,所以除非你在非常早期就已經是該團隊的一員,否則加入後大概會比較著重於實際service功能的建構,如:APIs、system components設計等等。

最近因為工作上的需要,剛好有機會學習了一下如何讓一個AWS帳號中的運算資源,如:AWS Lambda、EC2 instances等等,在不透過public internet傳輸的情況下,存取另一個AWS帳號中的private web service所提供的APIs。其中最主要使用的功能,就是VPC Endpoint Services和VPC Endpoints。

使用時機

一般來說,一個web service存在的目的就是提供某些功能讓使用者們遠端存取,而不用讓顧客們自己在local架設伺服器。例如:Netflix提供我們遠端觀看影片的服務;而Gmail提供遠端讀寫emails的服務。使用者們不需要把emails或者影片存在自己的電腦上,只需要透過公開的網際網路就可以存取。而所有使用者跟這個web service之間的資料傳輸,都是在加密過後 (常見的HTTPs等),經由公開的網際網路傳輸。

上述這些public web services,基於安全性及伺服器使用效率的原因,絕大多數都要求使用者提供某種身份證明,如帳號密碼等,來保護每個使用者的資料 (i.e. Authentication,簡稱AuthN),以及限制不同使用者間,不會不小心存取到別人的資料 (i.e. Authorization,簡稱AuthZ)。

值得注意的是,能否拜訪web services (“is it reachable?”) 跟能否登入 (“is an user authenticated & authorized?”),是兩個不同層面的東西。很多web services即使沒有登入,你還是可以拜訪他們的某些功能,因為他們的endpoints是直接暴露在公開網路上的。例如:任何人都可以直接使用Google的搜尋引擎,但要在登入後,才能讀取某個人的emails。

有時候,一個web service可能只想開放讓特定的人看到。或許,它提供的功能或者資料是非常機密的,所以只希望跟公司有簽訂保密協定的partners才能夠拜訪,並想阻絕任何外部不相干的人員。這就是使用VPC Endpoint Service的好時機!

source: AWS Official Documentation

首先,簡單介紹一下AWS Virtual Private Cloud (VPC)。VPC讓一個開發者在AWS帳戶內建構虛擬的私有網路,就像一個公司傳統上私有的資料中心。所有在這個私有網路上的運算資源,如:AWS Lamdba、ECS containers等等,彼此之間可以互相溝通,但預設跟public internet是分開的。換句話說,沒有任何外部的人可以reach到你的VPC裡面,進而連接到內部的伺服器等等。

但如此一來,當你的顧客使用的是另一個AWS帳號,他/她想存取你的私人web service所提供的功能,但你又不想讓全世界的人都可以看到並嘗試登入你的web service,要怎麼辦呢?答案是:在你的backend前,設定一個VPC Endpoint Service來接收所有的requests (這邊假設你的backend已經有使用network load balancer)。以下我們用AWS console來示範一下!

建立一個VPC Endpoint Service

基本上follow官方說明文件的步驟:

先到VPC console:https://console.aws.amazon.com/vpc/

點選左方的”Endpoint Services”後,再點選”Create Endpoint Service”

第一步,先選取你的私有web service前端的network load balancer。通常,為了簡化deployment以及更有效率地利用運算資源,都會在backend前放置一個load balancer而不會讓使用者直接連接到backend裡的伺服器。

第二步,AWS console已經選好建議的設定了,就是讓你所在的AWS Region中所有的Availability zones都能夠連接到你的Endpoint Service。AWS Region可以把它想像成類似美國東岸、西岸、東歐、西歐等大型區域。一個AWS Region內會有多個Availability zones (i.e. AZs)。一個AZ內,則可能有一或多個彼此以高速網路骨幹相連的資料中心。所有的AZ彼此都至少距離數公里到100公里間,所以當一個AZ受到天然災害導致跳電等等問題時,其他的AZ通常不會受到影響。

第三步,決定是否需要手動接受每個顧客連接到你的私有web service的請求。因為之後還可以更細地設定到底哪些AWS帳號、或其中的IAM users、roles等可以連接,所以這邊可以不要打勾(i.e. 設定成「自動接受」)。要十分注意的是,如果在這不將checkbox打勾,然後之後細部設定又選擇所有人都可以連接( i.e. “anyone can access”),那你基本上就讓任何AWS帳號都能夠在建立VPC Endpoint後,就連接到你的網路服務,即使它本身並沒有公開的IP。

第四步,選擇是否要給你的Endpoint Service一個private DNS name (Domain Name Server name),如:<company name>.com/<product name>等,讓你的使用者容易記住及使用。記得在註冊DNS name之前,必須先對AWS證明你是該domain的擁有者。這可以透過新增一個TXT record並利用VPC的console或者API來驗證。

不管你溝選這個選項與否,AWS都會自動產生一個隨機的名字,類似於:vpce-1234-abcdev-us-east-1.vpce-svc-123345.us-east-1.vpce.amazonaws.com。所以如果你的web service尚處於開發階段,還未申請一個domain/subdomain的話,可以暫時先用這個名字。

最後,點選”Create Service”,你的VPC Endpoint Service就成功建立了!

在你成功建立VPC Endpoint Service後,需要將你在上述第四步所使用的名稱交給你的使用者,並要求他們提供將要連接到你的service的AWS帳號,或者如果要更精確一點的話,該帳號內的某個IAM user/role的完整ARN (Amazon Resource Name),格式看起來會長得像:arn:aws:iam::aws-account-id:user/user-name or arn:aws:iam::aws-account-id:role/role-name 。請把他們提供的ARNs加到允許連接的名單

顧客如何使用你的VPC Endpoint Service?

使用者必須在他們的AWS帳戶內,利用你所提供的Endpoint Service名稱,來在他們的VPC內建立一個VPC Endpoint。具體步驟如下:

先到VPC console:https://console.aws.amazon.com/vpc/

點選左方的”Endpoints”後,再點選”Create Endpoint”

第一步,選擇第二個radio button,並直接輸入VPC Endpoint Service名稱,不管是好記得的或者是AWS自動產生的都可以。再來點verify,成功之後,再點選”Create endopint”就可以了哦!恭喜你!現在所有使用者跟你的Endpoint Service間所有的資料傳遞,都會在AWS的網路骨幹上完成,完全不會透過公開的網際網路。

費用

使用VPC Endpoint有兩個計費的準則,第一個是這個VPC Endpoint每個月啟用的時間長短,不管它是否有連到一個Endpoint Service;第二個是根據每月傳遞的資料量。詳細計價標準根據AWS Region有所不同,所以請參考官方文件

參考資料

  1. VPC Endpoint Services and VPC Endpoints:
    * https://docs.aws.amazon.com/vpc/latest/privatelink/endpoint-service-overview.html
    * https://docs.aws.amazon.com/vpc/latest/privatelink/create-endpoint-service.html
    * https://docs.aws.amazon.com/vpc/latest/privatelink/add-endpoint-service-permissions.html
    * https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints.html
    * https://docs.aws.amazon.com/vpc/latest/privatelink/endpoint-services-dns-validation.html
  2. 費用: https://aws.amazon.com/privatelink/pricing/
  3. AWS全球資料中心架構: https://aws.amazon.com/about-aws/global-infrastructure/regions_az/

--

--

Yenlin Chen
Yenlin Chen

Software Engineer/Aspiring Videographer & Photographer