2012-11-16 27 views
5

मैं अपने एपीआई के माध्यम से ईसी 2 सेवाओं तक पहुंचने के लिए आर पैकेज httr का उपयोग करना चाहता हूं। लेकिन मैं थोड़ा सा अनिश्चित हूं कि कैसे शुरू किया जाए क्योंकि यह "Oauth2.0" के सामान्य प्रमाणीकरण प्रारूप में नहीं आता है जिसमें आपके पास सामान्य है: कुंजी, गुप्त, टोकन और हस्ताक्षर प्रणाली। मुझे लगता है कि ईसी 2 "हस्ताक्षर संस्करण 2" विधि का उपयोग करता है, लेकिन मैं अस्पष्ट हूं कि यह कैसे काम करता है।आर + प्रेजेंटर और ईसी 2 एपीआई प्रमाणीकरण मुद्दे

प्रलेखन कि EC2 http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/using-query-api.html

पर बनाने क्वेरी अनुरोध के संबंध में मुझे लगता है कि मैं हस्ताक्षर के लिए मूल्य की जरूरत के साथ प्रदान करता है को देखते हुए .... लेकिन यह कैसे

मैं पाने के लिए पता नहीं है नीचे दिखाए गए अनुसार httr का उपयोग करके दिए गए कुछ आदेशों का उपयोग करने का प्रयास किया। मैं यूआरएल स्ट्रिंग में अधिकांश पैरामीटर को अनुकूलित करने के लिए और उन चीजों को अनुकूलित कर सकता हूं जो मैं करना चाहता हूं जैसे 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") 

जो मैं प्रतिक्रिया प्राप्त करने के लिए:

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

है किसी को भी EC2 एपीआई और इसके प्रमाणीकरण प्रक्रिया के साथ किसी भी अनुभव था और यह ख होगा ई मेरे द्वारा चुने गए एएमआई के साथ लिनक्स उदाहरणों को स्थापित करने और चलाने में सक्षम होने के लिए आर का उपयोग करने में काफी आसान है (जिसमें आर और अन्य प्रासंगिक संकुल उस पर लोड किए गए हैं), फिर उन उदाहरणों में कुछ आर कमांड चलाने के लिए, और आउटपुट वापस लाएं?

मत सोचो इसके वास्तव में मेरे 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 

संपादित करें:

तो दस्तावेज़ का पालन करने में एक और प्रयास में के रूप में @ ने सुझाव दिया हेडली इस मैं क्या करने की कोशिश की और मिल गया ... जहां im गलत हो रहा बहुत सराहना की जाएगी पर किसी भी अधिक सहायक संकेत है ...:

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) 

जो मैं प्रतिक्रिया प्राप्त करने के लिए:

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

हस्ताक्षर पैदा करने के लिए बुनियादी एल्गोरिथ्म http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/using-query-api.html#query-authentication में खर्च की गई थी - 'httr' है चरण 3 के लिए 'hmac' फ़ंक्शन। – hadley

+0

धन्यवाद ... मैंने देखा कि वास्तव में यह सुनिश्चित नहीं था कि मुझे क्या समझ आया ... क्या कोई संभावना है कि आप एक उदाहरण प्रदान कर सकें? –

+0

या संभावित रूप से देखें कि मैं अपने संपादन के बाद गलत कहां जा रहा हूं? मुझे लगता है कि मैं करीब हूं ... –

उत्तर

6

यहाँ आर कोड के लिए एल्गोरिथ्म के कदम रूपांतरण द्वारा एक कदम पर मेरा प्रयास है। मेरे अनुभव में आप वास्तव में प्रत्येक चरण को अलग से करना चाहते हैं ताकि आप प्रत्येक चरण में जांच सकें कि परिणाम सही हैं।

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

क्षमा करें शायद मुझे कुछ याद आ रहा है लेकिन पैराम ऑब्जेक्ट के साथ मैं क्या करूँ?'प्रमोटर' –

+0

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

+0

hmm से GET फ़ंक्शन का उपयोग करने में सक्षम होने के लिए ... अभी भी' GET ("https: //ec2.amazonaws की प्रतिक्रिया से त्रुटि कोड प्राप्त होता है .com ", क्वेरी = पैराम्स) ', हो रही है:' SignatureDoesNotMatch आपके द्वारा गणना किए गए अनुरोध हस्ताक्षर आपके द्वारा प्रदान किए गए हस्ताक्षर से मेल नहीं खाते हैं। अपनी एडब्ल्यूएस गुप्त पहुंच कुंजी और हस्ताक्षर विधि की जांच करें। विवरण के लिए सेवा प्रलेखन से परामर्श लें। 'गुप्त और पहुंच के मूल्य ठीक दिखते हैं ... –