amazon-web-services - 如何使用 Curl 执行简单的 AWS/EC2 REST API 调用
问题描述
有没有人使用 cUrl 来管理 AWS (EC2) REST API?在这里,我选择了最简单的调用,列出了正在运行的实例。我是否遗漏了什么,或者我是否清楚地表现出对正确 cUrl 使用的无知?除了没有显示实际完整示例的分散的 AWS 文档之外,我唯一真正的领先优势是 2014 年的这篇文章。(我确实意识到有 SDK)。这是我需要的 curl 专家……我想还有人可以帮助我克服 AWS 技术作家过度使用“规范”一词的问题。
Rest API DescribeImages 操作 创建规范请求
重击:
amz_access_key_ID="????"
amz_ec2_secret="????"
amz_host=ec2.amazonaws.com
amz_date8=`date -u "+%Y%m%d"`
amz_date_http=`date -uR`
amz_date_rfc8601=`date -u "+%Y%m%dT%H%M%SZ"`
amz_content_type="application/json"
amz_credential="${amz_access_key_ID}/${amz_date8}/us-west-2/ec2/aws4_request"
amz_signed_headers="${amz_host};${amz_date_rfc8601};${amz_content_type}"
amz_signature=`echo -en ${amz_signed_headers} | openssl sha256 -hmac ${amz_ec2_secret} -binary | base64`
params="Action:DescribeInstances;Version:2016-11-15;X-Amz-Algorithm:AWS4-HMAC-SHA256;X-Amz-Credential:${amz_credential};X-Amz-Date:${amz_date_rfc8601};X-Amz-SignedHeaders:${amz_signed_headers};X-Amz-Signature:${amz_signature}"
curl -X POST -H "Content-Type:${amz_content_type}" -H "Date:${amz_date_http}" -H "Host:${amz_host}" -F "${params}" http://ec2.amazonaws.com/
来自亚马逊的结果:
<!doctype html><html...HTTP Status 500 – Internal Server Error</h1><hr class="line" /><p><b>Type</b> Status Report</p><p><b>Message</b> Encountered an Internal Error</p><p><b>Description</b> The server encountered an unexpected condition that prevented it from fulfilling the request.</p><hr class="line" /></body>
解决方案
不幸的是,AWS API 请求不能直接在curl
. 您至少错过了看起来像这样的规范请求(来自docs的示例):
GET
/
Action=ListUsers&Version=2010-05-08
content-type:application/x-www-form-urlencoded; charset=utf-8
host:iam.amazonaws.com
x-amz-date:20150830T123600Z
content-type;host;x-amz-date
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
我最近在https://github.com/sengaya/aws-micro-cli启动了一个小项目,它实现了一些基本的 API 调用s3
和sts
. 虽然它目前不支持ec2
,但您可以查看代码或运行类似的内容以获得最终curl
输出以及制作请求的步骤:
AWS_ACCESS_KEY_ID=foo AWS_SECRET_ACCESS_KEY=bar aws-micro s3 ls
完整的调试输出:
s3://some-bucket --debug --dryrun
DEBUG - get_bucket_from_s3url: some-bucket
DEBUG - get_key_from_s3url:
DEBUG - create_request_url: https://some-bucket.s3.amazonaws.com/
DEBUG - get_host_from_request_url: some-bucket.s3.amazonaws.com
DEBUG - array_sort: host:some-bucket.s3.amazonaws.com
x-amz-content-sha256:123456789123456789123456789
x-amz-date:20201007T155300Z
DEBUG - array_sort: host
x-amz-content-sha256
x-amz-date
DEBUG - create_canonical_and_signed_headers: host:some-bucket.s3.amazonaws.com
x-amz-content-sha256:123456789123456789123456789
x-amz-date:20201007T155300Z
host;x-amz-content-sha256;x-amz-date
DEBUG - get_canonical_uri: /
DEBUG - create_canonical_request: GET
/
host:some-bucket.s3.amazonaws.com
x-amz-content-sha256:123456789123456789123456789
x-amz-date:20201007T155300Z
host;x-amz-content-sha256;x-amz-date
123456789123456789123456789
DEBUG - sha256: 123456789123456789123456789
DEBUG - create_string_to_sign: AWS4-HMAC-SHA256
20201007T155300Z
20201007//s3/aws4_request
123456789123456789123456789
DEBUG - create_authorization_header: AWS4-HMAC-SHA256 Credential=foo/20201007//s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=123456789123456789123456789
curl -v --fail https://some-bucket.s3.amazonaws.com/ -H Authorization: AWS4-HMAC-SHA256 Credential=foo/20201007//s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=123456789123456789123456789 -H x-amz-content-sha256:123456789123456789123456789 -H x-amz-date:20201007T155300Z
推荐阅读
- android - 如何将 HC-05 蓝牙模块从 COMMAND 模式切换到 DATA 模式
- entity-framework - 具有 List 类型属性的 EF-Entity 配置,其中包含抽象类的项目而不考虑鉴别器 - EF
- macos - 终端命令采取间歇性屏幕截图不起作用
- database - 为什么 Postgres 所谓的查询执行时间与客户端得到它的时间相差十倍?
- laravel - Laravel 7 使用 Laravel 存储从 AWS S3 下载文件并在之后删除它
- java - 为什么我的 while 循环无法识别整数的条件并进行无限循环?(Java while 循环“验证银行密码”)
- html - Angular Typescript中的Html [object Object]
- c# - 结合 GetType 和 Cast 来转换 List
列出 - java - 为什么非级联实体的级联实体在保存操作中持久化?
- c++ - 不使用向量的没有指定大小的数组