AWS CloudFront + multi S3 架構實驗

閱讀時間約 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/





    avatar-img
    16會員
    80內容數
    留言0
    查看全部
    avatar-img
    發表第一個留言支持創作者!
    西尼亞ming的沙龍 的其他內容
    如何計算 CloudFront 在使用中,回到Origins的數量,以及命中總數量
    客戶提出以下需求: 當用戶在日本,會導到離用戶最近的CloudFront節點(亞洲),當CF要回原站時,需要導到新加坡的S3 當用戶為美國,會導到離用戶最近的CloudFront節點(美國東岸),當CF要回原站時,需要導到美國的S3
    依據 CloudFront 預設的配額限制 [1],有以下項目會影響流量:
    AWS Nitro Enclaves 是一項新的 EC2 功能,使客戶能夠創建隔離的計算環境 (Enclaves) 來進一步保護和安全地處理高度敏感的數據,例如其 Amazon EC2 實例中的個人身份信息 (PII)、醫療保健
    使用 AWS CLI 的方式,設定 CloudWatch 偵測到 StatusCheckFailed 時的 Auto recover action
    如何計算 CloudFront 在使用中,回到Origins的數量,以及命中總數量
    客戶提出以下需求: 當用戶在日本,會導到離用戶最近的CloudFront節點(亞洲),當CF要回原站時,需要導到新加坡的S3 當用戶為美國,會導到離用戶最近的CloudFront節點(美國東岸),當CF要回原站時,需要導到美國的S3
    依據 CloudFront 預設的配額限制 [1],有以下項目會影響流量:
    AWS Nitro Enclaves 是一項新的 EC2 功能,使客戶能夠創建隔離的計算環境 (Enclaves) 來進一步保護和安全地處理高度敏感的數據,例如其 Amazon EC2 實例中的個人身份信息 (PII)、醫療保健
    使用 AWS CLI 的方式,設定 CloudWatch 偵測到 StatusCheckFailed 時的 Auto recover action
    你可能也想看
    Google News 追蹤
    Thumbnail
    疫情世代後,企業在思考的已經不是要不要上雲,而是哪些服務或內容可以上雲,透過混合雲的形式,搭配公司的策略達到靈活且彈性的最佳效益。 而既然要能達到最佳效益,選擇適合公司環境的雲端環境,對於現代企業來說非常重要,這篇文章將與大家分享AWS、GCP、Azure三大公有雲的特點與優勢。
    Thumbnail
    雲端已經成為App開發的核心,而Amazon的AWS(Amazon Web Services是開發者常用的平台,可以幫助開發者建立、整合和擴展App。
    Thumbnail
    對 AWS Certified Cloud Practitioner 證照考試難度的看法、學習方法和考試內容的介紹。
    Thumbnail
    實踐AWS中使用Lambda來負責登入簽核及與OpenAI API溝通,並利用S3容器託管一個靜態網頁做為前端
    Thumbnail
    Simple Storage Service (S3) 是 AWS 最常應用到的服務,只要是需要將檔案上傳到雲端的狀況都可以使用S3,本篇文章將介紹如何設定與使用AWS S3。
    Thumbnail
    在沒有分環境之前,每一隻lambda只有一個code console給所有人一起編輯,開發好了就deploy,根據設定的trigger觸發執行。 現在我們希望能夠在code console開發,然後deploy到不同的stage,目標是不同stage的api gateway能夠調用該lambda的
    Thumbnail
    疫情世代後,企業在思考的已經不是要不要上雲,而是哪些服務或內容可以上雲,透過混合雲的形式,搭配公司的策略達到靈活且彈性的最佳效益。 而既然要能達到最佳效益,選擇適合公司環境的雲端環境,對於現代企業來說非常重要,這篇文章將與大家分享AWS、GCP、Azure三大公有雲的特點與優勢。
    Thumbnail
    雲端已經成為App開發的核心,而Amazon的AWS(Amazon Web Services是開發者常用的平台,可以幫助開發者建立、整合和擴展App。
    Thumbnail
    對 AWS Certified Cloud Practitioner 證照考試難度的看法、學習方法和考試內容的介紹。
    Thumbnail
    實踐AWS中使用Lambda來負責登入簽核及與OpenAI API溝通,並利用S3容器託管一個靜態網頁做為前端
    Thumbnail
    Simple Storage Service (S3) 是 AWS 最常應用到的服務,只要是需要將檔案上傳到雲端的狀況都可以使用S3,本篇文章將介紹如何設定與使用AWS S3。
    Thumbnail
    在沒有分環境之前,每一隻lambda只有一個code console給所有人一起編輯,開發好了就deploy,根據設定的trigger觸發執行。 現在我們希望能夠在code console開發,然後deploy到不同的stage,目標是不同stage的api gateway能夠調用該lambda的