Probleme mit der R + httr- und EC2-API-Authentifizierung

Ich möchte das R-Paket verwendenhttr Zugriff auf die EC2-Dienste über deren API. Ich bin mir jedoch ein wenig unsicher, wie ich anfangen soll, da es nicht in das übliche Authentifizierungsformat von "Oauth2.0" fällt, in dem Sie das übliche haben: Schlüssel-, Geheim-, Token- und Signatursystem. Ich denke, EC2 verwendet die "Signaturversion 2" -Methode, aber ich bin nicht sicher, wie das funktioniert.

Ein Blick auf die Dokumentation, die EC2 zur Erstellung von Abfrageanforderungen unter bietethttp://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/using-query-api.html

Ich glaube, ich brauche den Wert für die Signatur ... aber ich weiß nicht, wie ich ihn bekommen soll

Ich habe versucht, einige der angegebenen Befehle mithttr Wie nachfolgend dargestellt. Ich kann die meisten Parameter in der URL-Zeichenfolge anpassen, um mich und die Dinge darzustellen, die ich tun möchte, zAWSAccessKeyId, ImageId, endpoint und dasAction etc .... aber ich weiß nicht, wohin ich gehen soll, um den Signaturwert zu erhalten.

In einigen Beispielen scheint der geheime Zugangsschlüssel auch nicht zur Verfügung zu stehen ...

Die ausprobierten Befehle lauten also wie folgt und haben einige der Werte geändert, um mich darzustellen.

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")

auf die ich die antwort bekomme:

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="" /> ...

Hat jemand Erfahrung mit der EC2-API und deren Authentifizierungsverfahren und wäre es einfach genug, R zu verwenden, um Linux-Instanzen mit von mir ausgewählten AMIs (auf denen R und andere relevante Pakete geladen sind) einzurichten und auszuführen? in diesen Fällen ein paar R-Befehle ausführen und die Ausgabe zurückbringen?

Denken Sie nicht, dass es wirklich mit meiner sessionInfo zusammenhängt, aber nur für den Fall, hier ist es:

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  

BEARBEITEN:

Bei einem weiteren Versuch, der von @hadley vorgeschlagenen Dokumentation zu folgen, habe ich dies versucht und bekam ... weitere hilfreiche Hinweise, wo ich falsch liege, wären sehr dankbar ...:

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)

auf die ich die antwort bekomme:

 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> 

Antworten auf die Frage(1)

Ihre Antwort auf die Frage