2012-11-16 8 views
5

R 패키지 httr을 사용하여 해당 API를 통해 EC2 서비스에 액세스하고 싶습니다. 하지만 키, 비밀, 토큰 및 서명 시스템과 같은 평범한 "Oauth2.0"의 일반적인 인증 형식에 속하지 않으므로 시작하는 방법을 조금 확신 할 수 없습니다. 나는 EC2가 "signature version 2"방법을 사용한다고 생각하지만 그것이 어떻게 작동하는지에 대해서는 분명하지 않다.R + httr 및 EC2 API 인증 문제

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

에서 만드는 쿼리 요청에 관해서는 내가 서명에 대한 값을 필요가 있다고 생각과 함께 제공되는 설명서를 보면

....하지만

내가 가진 얻는 방법을 모른다 아래 표시된대로 httr을 사용하여 주어진 명령 중 일부를 사용하여 시도했습니다. URL 문자열의 대부분의 매개 변수를 나와 나를 대표하는 것으로 나타낼 수 있습니다. 예를 들어 AWSAccessKeyId, ImageId, endpointAction 등 ....하지만 서명 값을 얻는 방법에 대해 잘 모릅니다. 주어진 예제의 일부에서 또한

, 그들은 저를 나타내는 값의 일부를 변경하지만 다음을 가지고 한 다음

은 그래서 시도 명령은 ... 하나 비밀 액세스 키를 제공하는 것 해달라고 :

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 API와의 인증 절차와 어떤 경험하고 B 것 가지고 e를 사용하기에 R을 사용하여 Linux 인스턴스를 RMI 및 다른 관련 패키지가로드 된 AMI와 함께 설정 및 실행 한 다음 해당 인스턴스에서 몇 가지 R 명령을 실행하고 출력을 다시 가져올 수 있습니까?

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 

편집 :

그래서 설명서를 따르지 더 시도 @ 의해 제안

는 정말 내 sessionInfo 관련이 있지만 여기 경우는 생각하지 마십시오 해들리이 ... 내가 노력하고있어 ... 잘못되어 가고 메신저 주시면 감사하겠습니다 위치에 더 이상 도움이되는 힌트를 것입니다 :

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에 배치된다 'hmac'은 3 단계에서 작동합니다. – hadley

+0

감사합니다 ... 나는 그것을 보았지만 그것이 의미하는 바를 잘 모른다는 확신이 들지 않았습니다. 예제를 제공 할 가능성이 있습니까? –

+0

또는 내 수정 사항이 적용될 때 내가 잘못 가고있는 곳을 잠재적으로 볼 수 있습니까? 나는 가까운 것 같아. –

답변

6

알고리즘을 R 코드로 단계적으로 변환하려고했습니다. 내 경험상 당신은 실제로 각 단계를 개별적으로 수행하여 각 단계에서 결과가 올바른지 확인할 수 있기를 원합니다. `httr`가있다 -

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

미안하지만 뭔가 빠졌어.하지만 params 객체로 무엇을 할까? –

+0

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

+0

흠 ... 아직도 GET ("https : //ec2.amazonaws"의 응답에서 오류 코드를 얻는 것처럼 보입니다. .com ", query = params)', getting :'SignatureDoesNotMatch 우리가 계산 한 요청 서명이 당신이 제공 한 서명과 일치하지 않습니다. AWS Secret Access Key 및 서명 방법을 확인하십시오. 자세한 내용은 서비스 설명서를 참조하십시오.'비밀과 접근의 가치는 멋져 보인다 ... –