2012-11-16 23 views
5

API aracılığıyla EC2 hizmetlerine erişmek için R paketini httr kullanmak istiyorum. Ancak, her zamanki gibi "Oauth2.0" 'ın normal kimlik doğrulama biçimine girmediğinden nasıl başlayacağınızdan biraz emin değilim: anahtar, sır, jeton ve imza sistemi. EC2'nin "imzalı sürüm 2" yöntemini kullandığını düşünüyorum, ancak bunun nasıl çalıştığına dair açık değilim.R + httr ve EC2 api kimlik doğrulama sorunları

EC2 http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/using-query-api.html

at yapma sorgu taleplerin ben imza için değer gerektiğini düşünüyorum ile sağlamaktadır belgelere baktığımızda

.... ama

Ben nasıl bilmiyorum Verilen komutların bazılarını aşağıda gösterildiği gibi httr kullanarak kullanmayı denedim. URL dizisindeki parametrelerin çoğunu bana ve örneğin AWSAccessKeyId, ImageId, endpoint ve Action vb. Yapmak istediğim şeyleri temsil edebilirim, ancak sadece imza değerini almak için nereye gideceğinizi bilmiyorum. Verilen örneklerden bazıları da

, beni temsil etmek değerlerinden bazılarını değişmiş ancak aşağıdaki var olan şöyle

Yani çalıştı komutlar vardır ... Ya gizli erişim tuşu sağlamak görünmemektedir:

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

hangi i yanıt almak için:

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

herkes EC2 API ve kimlik doğrulama prosedürü ile herhangi bir deneyimi vardı ve b olur Has E tarafından seçilen AMI'lerle (R ve buna yüklenen diğer ilgili paketler var) linux örneklerini kurmak ve çalıştırmak için R'yi kullanacak kadar kolay, daha sonra bu örneklerde birkaç R komutunu çalıştırmak ve çıkışı geri getirmek için?

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 

DÜZENLEME:

Yani belgelerine takip etmek bir başka girişim @ önerdiği gibi

onun gerçekten benim sessionInfo ilgili ama sadece burada durumda olduğunu sanmıyorum Hadley bu ... denedim ve got ... ters gidiyor im büyük takdir nerede bir daha yararlı ipuçları nedir:

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) 

ki ben yanıt almak için:

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> 
+0

imza üretmek için temel algoritma http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/using-query-api.html#query-authentication ortaya koydu 3. adım için 'hmac' işlevi – hadley

+0

teşekkürler ... bunu gördüm ama ne anlama geldiğini anladığımdan emin değildim ... bir örnek verebileceğin bir olasılık var mı? –

+0

veya düzenlemelerim sırasında nereye yanlış gittiğimi görebilir miyim? Sanırım imkansız ... –

cevap

6

İşte R koduna algoritmanın adım dönüşümü ile bir adımda benim denemesi. Deneyimlerime göre her adımı ayrı ayrı yapmak istiyorsunuz, böylece her aşamada sonuçların doğru olduğunu kontrol edebilirsiniz. `Httr` sahiptir -

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) 
+0

üzgünüm belki bir şey eksik ama params nesnesinde ne yapmalıyım?GET işlevini kullanabilmek için ' –

+0

'GET (url, query = params)' – hadley

+0

hmm ... hala GET ("https: //ec2.amazonaws" yanıtından bir hata kodu alıyor gibi görünüyor .com ", query = params)", alma: 'SignatureDoesNotMatch Hesapladığımız imza imzası, verdiğiniz imzayla eşleşmiyor. AWS Gizli Erişim Anahtarınızı ve imzalama yönteminizi kontrol edin. Ayrıntılar için servis belgelerine danışın. 'Gizli ve erişim değerleri iyi görünüyor ... –

İlgili konular