h.l*_*l.m 5 r amazon-ec2 ec2-ami ec2-api-tools httr
我想使用R包httr通过他们的API访问EC2服务.但我有点不确定如何开始,因为它不属于通常的"Oauth2.0"身份验证格式,其中你有通常的:密钥,秘密,令牌和签名系统.我认为EC2使用"签名版本2"方法,但我不清楚它是如何工作的.
查看EC2提供的有关在http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/using-query-api.html上发出查询请求的文档
我想我需要签名的价值......但不知道如何得到它
我已尝试使用一些给定的命令httr,如下所示.我可以适应大部分的URL字符串参数来表示我,我想做例如事情AWSAccessKeyId,ImageId,endpoint和Action等....但就是不知道哪里去获得签名值.
同样在给出的一些例子中,他们似乎也没有提供秘密访问密钥......
所以尝试过的命令如下所示,改变了一些值来代表我,但得到了以下内容:
require(httr)
GET("https://ec2.amazonaws.com/
?Action=RunInstances
&ImageId=ami-60a54009
&MaxCount=3
&MinCount=1
&Placement.AvailabilityZone=us-east-1b
&Monitoring.Enabled=true
&AWSAccessKeyId=0GS7553JW74RRM612K02EXAMPLE
&Version=2012-10-01
&Expires=2010-10-10T12:00:00Z
&Signature=lBP67vCvGlDMBQ1dofZxg8E8SUEXAMPLE
&SignatureVersion=2
&SignatureMethod=HmacSHA256")
Run Code Online (Sandbox Code Playgroud)
我得到了答复:
Response [http://aws.amazon.com/ec2/]
Status: 200
Content-type: text/html; charset=UTF-8
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="icon" type="image/ico" href="//d36cz9buwru1tt.cloudfront.net/favicon.ico">
<link rel="shortcut icon" type="image/ico" href="//d36cz9buwru1tt.cloudfront.net/favicon.ico">
<meta name="description" content="Amazon Elastic Compute Cloud delivers scalable, pay-as-you-go compute capacity in the cloud. " /><meta name="keywords" content="" /> ...
Run Code Online (Sandbox Code Playgroud)
有没有人对EC2 api及其身份验证过程有任何经验,并且使用R能够使用我选择的AMI设置和运行Linux实例(将R和其他相关软件包加载到其上)就足够了在这些实例中运行几个R命令,并将输出带回来?
不要认为它真的与我的sessionInfo有关,但以防万一在这里是:
sessionInfo()
R version 2.15.1 (2012-06-22)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)
locale:
[1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] httr_0.2
loaded via a namespace (and not attached):
[1] digest_0.5.2 plyr_1.7.1 RCurl_1.95-1.1 stringr_0.6.1 tools_2.15.1
Run Code Online (Sandbox Code Playgroud)
编辑:
因此,为了进一步尝试遵循@hadley所建议的文档,这是我尝试并得到的...更多有用的提示,如果我出错将会非常感激...:
require(httr)
aws.key <- "xxxxxxx"
aws.secret <- "xxxxxxxxxxxx"
verb <- "GET"
zone <- "ec2.amazonaws.com"
func <- "DescribeImages"
ami.number <- "ami-xxxxxxxxx"
params <- list(paste0("ImageId.1=",ami.number),
"Version=2012-10-01",
"Expires=2012-11-20T12%3A00%3A00Z")
# adding in method and key parameters for creation of string to sign
orig.len.params <- length(params)
params.w.method.key <- params
params.w.method.key[[orig.len.params+1]] <- "SignatureVersion=2"
params.w.method.key[[orig.len.params+2]] <- "SignatureMethod=HmacSHA1"
params.w.method.key[[orig.len.params+3]] <- paste0("AWSAccessKeyId=",aws.key)
# String to sign (s2s)
s2s <- paste(c(paste0(verb,"\n",zone,"\n","/\n","AWSAccessKeyId=",aws.key),paste0("Action=",func),paste(sort(unlist(params.w.method.key)),collapse="&")),collapse="&")
# Signature(sig)
sig <- hmac_sha1(aws.secret, s2s)
# adding in signature, method and key parameters for signed request url generation
params.w.sig.method.key <- params
params.w.sig.method.key[[orig.len.params+1]] <- paste0("Signature=",sig)
params.w.sig.method.key[[orig.len.params+2]] <- "SignatureVersion=2"
params.w.sig.method.key[[orig.len.params+3]] <- "SignatureMethod=HmacSHA1"
params.w.sig.method.key[[orig.len.params+4]] <- paste0("AWSAccessKeyId=",aws.key)
# Signed request (sr)
sr <- paste(c(paste0("https://",zone,paste0("?Action=",func)),paste(unlist(params.w.sig.method.key),collapse="&")),collapse="&")
# GET signed request
GET(sr)
Run Code Online (Sandbox Code Playgroud)
我得到了回应:
Response [https://ec2.amazonaws.com?Action=DescribeImages&ImageId.1=[ami.number.from.before]&Version=2012-10-01&Expires=2012-11-20T12%3A00%3A00Z&Signature=[sig.value.from.before]&SignatureVersion=2&SignatureMethod=HmacSHA1&AWSAccessKeyId=[aws.key.from.before]/]
Status: 401
Content-type:
<?xml version="1.0" encoding="UTF-8"?>
<Response><Errors><Error><Code>AuthFailure</Code><Message>AWS was not able to validate the provided access credentials</Message></Error></Errors><RequestID>5e10fb0b-f304-4677-9c64-98b4537c659a</RequestID></Response>
Run Code Online (Sandbox Code Playgroud)
这是我尝试将算法逐步转换为R代码.根据我的经验,您确实希望单独执行每个步骤,以便您可以在每个阶段检查结果是否正确.
require("httr")
require("RCurl")
require("stringr")
# 0: get key and secret from envvars, and set up request parameters
aws.key <- Sys.getenv("AWS_KEY")
aws.secret <- Sys.getenv("AWS_SECRET_KEY")
verb <- "GET"
zone <- "ec2.amazonaws.com"
ami.number <- "ami-xxxxxxxxx"
params <- list(
Action = "DescribeImages",
ImageId.1 = ami.number,
Version = "2012-10-01",
Expires = "2012-11-20T12:00:00Z",
SignatureVersion = 2,
SignatureMethod = "HmacSHA1",
AWSAccessKeyId = aws.key)
# 1a: Sort the UTF-8 query string components by parameter name
params <- params[order(names(params))]
# 1b: URL encode the parameter name and values
params_e <- lapply(params, curlEscape)
names(params_e) <- curlEscape(names(params_e))
params_str <- str_c(names(params_e), "=", unlist(params_e), collapse = "&")
params_str <- gsub("%2E",".",gsub("%2D","-",params_str))
# 2: Create the string to sign
string_to_sign <- str_c(
toupper(verb), "\n",
tolower(zone), "\n",
"/", "\n",
params_str
)
# 3: Calculate an RFC 2104-compliant HMAC
# 4: Convert the resulting value to base64.
hmac <- hmac_sha1(aws.secret, string_to_sign)
params$Signature <- hmac
GET(paste0("https://",zone),query=params)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1076 次 |
| 最近记录: |