[英]How to access S3 bucket created in us-west-2 region from us-east-1 account?
[英]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 移動到美國,但這不是要求!
在這個問題的答案中,我指定了我的方法和完整的代碼示例,以防您感興趣: How to access AWS CloudFront that connected with S3 Bucket via Bearer token of a specific user (JWT Custom Auth)
有什么建議么?
更新(顯示確切問題的步驟):
我不想使用無服務器框架配置 lambda 邊緣,而是使用雲形成來配置雲前端和所有內容。
請注意,現在我在 Cloudfront 中使用 lambda 邊緣 ARN,因此它們需要位於同一區域,並且因為 lambda@edge 應該在 us-east-1 中,所以我決定將 CloudFront 移動到同一區域並且確實如此無關緊要,因為它具有設計的邊緣行為。
正如您在角色中看到的那樣,我剛剛授予對 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.