AWS CloudFront + multi S3 架構實驗

2024/04/28閱讀時間約 7 分鐘

實驗目的:Lambda@Edge (L@E) 讓 CLoudFront (CF) 回源時,自動選擇較近的 S3 region 回源

讓我們接續此文,來實作看看~

AWS CloudFront + multi S3 架構需求

這裡準備 4 組 S3 buckets 分別為

美國東部 (維吉尼亞北部) us-east-1,接近美洲用戶
歐洲 (愛爾蘭) eu-west-1,接近歐洲用戶
亞太區域 (東京) ap-northeast-1,接近亞洲用戶
美國西部 (奧勒岡) us-west-2,其他區域所預設的


buckets 會使用 index.html 檔案, 來區分不同區域
如virginia用戶會看到virginia-us畫面


CloudFront 設置

Origins 加入這些 S3 buckets

raw-image


注意到這裡使用的Origin access 是 origin-access-identity 而不是採用 Origin Access Control (OAC) 的 S3 驗證方式


當前使用 L@E 做多 region S3 動態回源時,必須使用舊的 OAI (Origin Accwess Identity) 來做驗證,才支援切換不同 region。

這部分在 L@E 文件中有隱晦的提到 [1],指定不同 region S3 時,在 origin request 的 object 中,需指定 authMethod 為 origin-access-identity,並指定 region 參數



如何建立OAI
到Security > Origin access 選擇 Identities (legacy) 並建立

raw-image
raw-image


套用在 Origin access - Legacy access identities 選項

raw-image


其他Origin重複此步驟即可

behavior 中 Origin and origin groups 將設置為 我們預設的檔案區域


接者我們要建置 Origin request Lambda function,注意該Lambda function 需要在us-east-1 建立

raw-image
raw-image


這裡以 Python 3.8 示範[2]

import json

us_bucket = "mybucket-us.amazonaws.com"
eu_bucket = "mybucket-eu.amazonaws.com"
ap_bucket = "mybucket-ap.amazonaws.com"
default_bucket = "mydefaultbucket-us.amazonaws.com"


regions_mapping = {
"us-east-1": us_bucket,
"us-east-2": us_bucket,
"us-west-1": us_bucket,
"eu-central-1": eu_bucket,
"eu-west-1": eu_bucket,
"eu-west-2": eu_bucket,
"ap-southeast-1": ap_bucket,
"ap-northeast-1": ap_bucket
}


def lambda_handler(event, context):
request = event['Records'][0]['cf']['request']

origin_key = list(request['origin'].keys())[0]
custom_headers = request['origin'][origin_key].get('customHeaders', {})


if origin_key != 's3' in custom_headers:

return request

# Identify edge region
lambda_region = context.invoked_function_arn.split(':')[3]

# Get S3 bucket based on regions mapping
domain_name = regions_mapping.get(lambda_region, default_bucket)
#add
bucket_region = domain_name.split('.')[2]


# Update origin request object
request['origin']['s3']['authMethod'] = "origin-access-identity"
request['origin']['s3']['domainName'] = domain_name
request['origin']['s3']['region'] = bucket_region
request['headers']['host'] = [{'key': 'host', 'value': domain_name}]

return request


Deploy 後,接者要來部署 Lambda@Edge

raw-image


選擇 Distribution 與 behavior

event 為 Origin request,就可以部署

raw-image


稍等CloudFront部署,在對應的 behavior 可以看到設置完成

raw-image


現在來檢視成果


raw-image
raw-image
raw-image
raw-image
raw-image


未來 OAI 將來廢除後如何達成這個需求。 雖然 OAI 被歸類於舊的功能,但是目前尚未有公開將 OAI 廢除的計畫,同時 OAI 仍被許多客戶使用中,此類重要功能如果預計廢除,一般官方會在 2~3 年前開始公告,並提供相關文件描述配套措施及轉移方式,同時也會提供移轉的緩沖期。 因此目前仍可以放心使用 OAI 來達成這項功能,且這是目前唯一可行的方式。謝謝Support Oscar 説明


參考:
[1] Lambda@Edge event structure - Request event fieldshttps://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-event-structure.html#request-event-fields

[2] Lambda Function Demo Python Code

https://aws.amazon.com/tw/blogs/networking-and-content-delivery/using-amazon-cloudfront-and-amazon-s3-to-build-multi-region-active-active-geo-proximity-applications/





    13會員
    57內容數
    留言0
    查看全部
    發表第一個留言支持創作者!