簡體   English   中英

要部署到 us-east-1 的 Lambda@Edge 限制阻止我將 S3 存儲桶部署到歐洲

[英]Lambda@Edge limitation to be deployed to us-east-1 prevents me from deploying S3 bucket to Europe

更新:

我想交叉引用不同地區不同堆棧中的一些值的問題的簡短版本,但文檔非常混亂,讓我認為不可能這樣做,但這是可能的,只是我不得不 output 導出這些值該堆棧中的值,然后在另一個堆棧中使用: ${cf.us-east-1:another-stack.theNeededArn}


有興趣的長版:

我正在使用無服務器框架維護基礎架構代碼。 我有連接到在歐洲托管的 S3 存儲桶的 CloudFront。 我收到了一個客戶端請求,要求通過 CloudFront 限制對該存儲桶的訪問,僅限於經過身份驗證的用戶(自定義身份驗證)。 Lambda@Edge 是最好的解決方案,我已經以這種方式實現了它,但是由於必須將 Lambda@Edge 部署到 us-east-1,我最終將 S3 和 Cloudfront 移動到同一區域 us-east-1(即因為 Cloufront 依賴於 lambda 邊緣,而 S3 依賴於 CloudFront,所以我必須將它們保持在同一個堆棧或至少同一個區域中)。 但是我不想將我的存儲桶移到美國以獲得合法的東西,並且我想將數據保留在歐洲,而且我的 S3 有一個 lambda 觸發器 function 監聽它並將一些數據寫入歐洲托管的 DynamoDb。

所以問題:我在歐洲有 S3,我想把它留在歐洲,但由於使用 lambda 邊緣,並且因為雲形成或無服務器不支持跨區域堆棧引用,我最終將此 S3 移動到美國,但這不是要求!

  • 我認為即使我們使用雲前端,但將所有客戶都放在歐洲並將 S3 存儲桶放在美國會增加延遲。
  • 對於合法的東西,我想將歐洲用戶的數據保留在歐洲內部,而不是將其移出。

在這個問題的答案中,我指定了我的方法和完整的代碼示例,以防您感興趣: How to access AWS CloudFront that connected with S3 Bucket via Bearer token of a specific user (JWT Custom Auth)

有什么建議么?


更新(顯示確切問題的步驟):

  1. 在我的 serverless.yml 中,我創建了這個堆棧,其中包含這個 lambda 邊緣:

無服務器.yml

我不想使用無服務器框架配置 lambda 邊緣,而是使用雲形成來配置雲前端和所有內容。

  1. 在雲形成資源文件中,我添加了雲前端源並通過其行為配置私有源以使用 lambda 邊緣(請查看圖中的亮點):

Cloudfront 配置 請注意,現在我在 Cloudfront 中使用 lambda 邊緣 ARN,因此它們需要位於同一區域,並且因為 lambda@edge 應該在 us-east-1 中,所以我決定將 CloudFront 移動到同一區域並且確實如此無關緊要,因為它具有設計的邊緣行為。

  1. 另外,如果您對此處感興趣,我在步驟 1 中為預定義的 lambda 邊緣定義了所有需要的角色(這包括發布正確的策略以及 lambda 邊緣版本,如 Z945F3FC449518A73B9F5F3286 function 和所有設置在這一步我只是把它放在這里是為了完整。):

Lambda 邊緣配置

  1. 現在我有了雲前端配置,lambda 邊緣配置,在雲前端,我們引用了 lambda 邊緣 ARN,這導致我將它們放在同一區域,但現在我將定義我的 S3 存儲桶並將其設為私有,所以沒有可以訪問它,只是雲端 CloudFrontOriginAccessIdentity 可以做到這一點:

存儲桶配置

正如您在角色中看到的那樣,我剛剛授予對 CloudFront 的訪問權限以獲取並授予對(獲取和放置的 lambda 邊緣但不確定這是否正確)的訪問權限,但無論如何,即使我們只需要 CloudFrontOriginAccessIdentity 連接到我的存儲桶,所以現在與我的 CloudFront 鏈接的存儲桶也鏈接到 lambda 邊緣,所以我不能將它們分開以僅將 S3 放在歐洲?

And by that even if I have an S3 trigger lambda function so I should put this function in the US even if this function is doing some stuff related to DynamoDb in Europe? 那么有什么意義呢? 此外,即使 Cloudfront 是邊緣的,但存儲桶是區域性的,所以如果我真的需要處理一些與之相關的數據,這意味着通過將它放入我們我會增加延遲? 這就是我完整的詳細問題。


Update2:我想將代碼作為屏幕截圖發布,以便突出顯示一些行並使其更容易,但對於有興趣檢查代碼本身的人,我已經在此處對這個問題的回答中發布了它的完整版本: 如何訪問 AWS CloudFront 通過特定用戶的 Bearer 令牌與 S3 Bucket 連接(JWT 自定義身份驗證)

解決方案不是將所有內容都移至us-east-1 ,而是維護兩個堆棧,即主堆棧和 lambda 邊緣堆棧。 主堆棧位於 EU 中,lambda 邊緣堆棧位於us-east-1中。 您可以使用${cf.us-east-1:another-stack.lambdaEdgeArn}引用us-east-1中的 lambda 邊緣函數。

無法通過Fn:ImportValue從其他區域部署到us-east-1的 Lambda@Edge。 在 CloudFormation 模板中,通過動態查找特定於版本的 ARN 並將其作為 CloudFront 模板的模板參數在任務文件中傳遞,有一種解決方法。

- name: Get Lambda Version-ARN
  shell:
    cmd: "
      aws lambda list-versions-by-function \
        --function-name '{{ lambda_func_name }}' \
        --region '{{ lambda_region }}' \
        --query \"max_by(Versions, &to_number(to_number(Version) || '0'))\" \
      | jq -r '.FunctionArn'
    "
  register: lambda_output

- set_fact:
    lambda_arn: "{{ lambda_output.stdout }}"

- name: CloudFront
  cloudformation:
    stack_name: "{{ stack_name }}"
    state: "{{ state }}"
    region: "{{ region }}"
    template: "roles/{{ role_name }}/templates/cloudfront-template.yml"
    template_parameters:
      LambdaARN: "{{ lambda_arn }}"
      ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM