当我尝试使用该Fn::FindInMap函数为某个Fn::Transform部分中的代码段提供位置时,我收到此错误
无法消化转换参数中的函数,转换块中的内在函数只能包含参数值或堆栈元数据。
在文档中它说我可以这样做。 这是文档
这是我的模板的两个相关部分
Fn::Transform:
Name: 'AWS::Include'
Parameters: {Location: {'Fn::FindInMap': [PipelineStackMap, dev, Location]}}
Mappings:
PipelineStackMap:
prod:
Location: "s3://my-prod-cicd-bucket/pipeline.yml"
dev:
Location: "s3://my-cicd-bucket/pipeline.yml"
qa:
Location: "s3://my-cicd-bucket/pipeline.yml"
Run Code Online (Sandbox Code Playgroud)
当我使用Ref和 变量或对存储桶字符串进行硬编码时,它工作正常,而在使用FindInMap.
我的 AWS 凭证~/.aws/credentials正确且有效。证明?
$ aws s3api put-object --bucket <my bucket name> --key videos/uploads/yoda.jpeg --body /Users/r<my_name>/Desktop/Archive/yoda.jpeg
Run Code Online (Sandbox Code Playgroud)
取回:
{
"ETag": "\"66bee0b7caf3d127900e0a70f2da4b5f\""
}
Run Code Online (Sandbox Code Playgroud)
上传是通过命令行进行的。当我在 AWS 管理控制台中看到我的 S3 存储桶时,我就可以看到我的文件。
现在-我从 S3 中删除了成功上传的文件,并尝试再次上传它,这次是通过预先签名的 URL
$ aws s3 presign s3://<my-bucket>/videos/uploads/yoda.jpeg
Run Code Online (Sandbox Code Playgroud)
为此我得到:
https://<my-bucket>.s3.amazonaws.com/videos/uploads/yoda.jpeg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=3600&X-Amz-Credential=<MY-AWS-KEY-ID>%2F20210207%2Fus-east-2%2Fs3%2Faws4_request&X-Amz-SignedHeaders=host&X-Amz-Date=20210207T222859Z&X-Amz-Signature=3a3624b9e264c119ebdf93c989efb73337f7ab8793e89554c7b000e1fc93c85c
Run Code Online (Sandbox Code Playgroud)
从这一刻起,使用此 URL 或任何其他工具进行的任何尝试PUT都 无法上传文件,最终都会以(是的,它不会过期,它会立即失败)告终,并且这是 AWS 提供的借口。CURLPOSTMAN403The request signature we calculated does not match the signature you provided
/.aws/credentialsS3 存储桶有一项策略,允许其凭据位于该存储桶中的用户Put*。
到底是怎么回事?为什么预签名 URL 不起作用?
卷曲尝试
$ curl --location --request PUT 'https://<my-bucket-name>.s3.amazonaws.com/videos/uploads/yoda.jpeg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=3600&X-Amz-Credential=<MY-AWS-KEY-ID>%2F20210207%2Fus-east-2%2Fs3%2Faws4_request&X-Amz-SignedHeaders=host&X-Amz-Date=20210207T224403Z&X-Amz-Signature=8a8625591e6c4e0871f97bf5e15c2f93b3e373cfc1c2daddb2cf34edb10a5670%0A' \
--header 'Content-Type: image/jpeg' …Run Code Online (Sandbox Code Playgroud)