2016-10-09 15 views
1

Amazon Kinesis Streamにレコードを入れるためのHTTP Post Requestを送信しようとしています。いくつかの方法があります(Kinesis Client、KPL、AWS GatewayをKinesis Proxyとして設定する)。APIゲートウェイを設定してAmazon KinesisのREST APIを呼び出す

私はキネシスPutRecordのAPIについては、この文書は http://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecord.html

POST/HTTP/1.1 
Host: kinesis.<region>.<domain> 
Content-Length: <PayloadSizeBytes> 
User-Agent: <UserAgentString> 
Content-Type: application/x-amz-json-1.1 
Authorization: <AuthParams> 
Connection: Keep-Alive 
X-Amz-Date: <Date> 
X-Amz-Target: Kinesis_20131202.PutRecord 
{ 
    "StreamName": "exampleStreamName", 
    "Data": "XzxkYXRhPl8x", 
    "PartitionKey": "partitionKey" 
} 

は、このリンクで説明したようにアマゾンAPIゲートウェイを設定しなくてもPutRecordに上記のHTTP POSTリクエストを送信することが可能です見

http://docs.aws.amazon.com/apigateway/latest/developerguide/use-custom-authorizer.html#call-api-with-api-gateway-custom-authorization

KPLとKinesis Clientは何とか内部的にHTTP POSTからPutRecordを使用する必要があります。そのため、そうする方法が必要です。残念ながら、私はオンラインでリソースを見つけることができませんでした。

+1

好きな言語に関連するAWS SDKを使用してみませんか? – Guy

+0

既存のコードとのいくつかの依存関係の競合があります。 – needhelp

答えて

0

キネシスのRESTful APIコールをフックアップするには、setup API Gatewayが必要です。キネシスAPIのIAMロールとポリシーを設定し、それをKinesisのAWSサービスプロキシに関連付ける必要があります。

あなたが投稿したリンクは、承認者をカスタマイズする方法です.APIゲートウェイはまだその背後で実行されています。

APIゲートウェイを設定したら、https://docs.aws.amazon.com/kinesis/latest/APIReference/API_CreateStream.htmlを参照してキネシスストリーム/レコードを管理できます。

0
import sys, os, base64, datetime, hashlib, hmac 
import requests # pip install requests 
# ************* REQUEST VALUES ************* 
method = 'POST' 
service = 'kinesis' 
host = 'kinesis.us-east-1.amazonaws.com' 
region = 'us-east-1' 
endpoint = 'https://kinesis.us-east-1.amazonaws.com' 
content_type = 'application/x-amz-json-1.1' 

amz_target = 'Kinesis_20131202.PutRecord' 
request_parameters = '{' 
request_parameters += '"StreamName": "<StreamName>",' 
request_parameters += '"Data": "<DATA>",' 
request_parameters += '"PartitionKey": "<PartitionKey>"' 
request_parameters += '}' 

# http://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html#signature-v4-examples-python 
def sign(key, msg): 
    return hmac.new(key, msg.encode("utf-8"), hashlib.sha256).digest() 
def getSignatureKey(key, date_stamp, regionName, serviceName): 
    kDate = sign(('AWS4' + key).encode('utf-8'), date_stamp) 
    kRegion = sign(kDate, regionName) 
    kService = sign(kRegion, serviceName) 
    kSigning = sign(kService, 'aws4_request') 
    return kSigning 

access_key = '<ACCESS KEY>' 
secret_key = '<SECRET KEY>' 
if access_key is None or secret_key is None: 
    print 'No access key is available.' 
    sys.exit() 
# Create a date for headers and the credential string 
t = datetime.datetime.utcnow() 
amz_date = t.strftime('%Y%m%dT%H%M%SZ') 
date_stamp = t.strftime('%Y%m%d') # Date w/o time, used in credential scope 


canonical_uri = '/' 

canonical_querystring = '' 

canonical_headers = 'content-type:' + content_type + '\n' + 'host:' + host + '\n' + 'x-amz-date:' + amz_date + '\n' + 'x-amz-target:' + amz_target + '\n' 

signed_headers = 'content-type;host;x-amz-date;x-amz-target' 

payload_hash = hashlib.sha256(request_parameters).hexdigest() 

canonical_request = method + '\n' + canonical_uri + '\n' + canonical_querystring + '\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash 

algorithm = 'AWS4-HMAC-SHA256' 
credential_scope = date_stamp + '/' + region + '/' + service + '/' + 'aws4_request' 
string_to_sign = algorithm + '\n' + amz_date + '\n' + credential_scope + '\n' + hashlib.sha256(canonical_request).hexdigest() 

signing_key = getSignatureKey(secret_key, date_stamp, region, service) 

signature = hmac.new(signing_key, (string_to_sign).encode('utf-8'), hashlib.sha256).hexdigest() 

authorization_header = algorithm + ' ' + 'Credential=' + access_key + '/' + credential_scope + ', ' + 'SignedHeaders=' + signed_headers + ', ' + 'Signature=' + signature 
print authorization_header; 


headers = {'Content-Type':content_type, 
      'X-Amz-Date':amz_date, 
      'X-Amz-Target':amz_target, 
      'Authorization':authorization_header} 
# ************* SEND THE REQUEST ************* 
print '\nBEGIN REQUEST++++++++++++++++++++++++++++++++++++' 
print 'Request URL = ' + endpoint 
r = requests.post(endpoint, data=request_parameters, headers=headers) 
print '\nRESPONSE++++++++++++++++++++++++++++++++++++' 
print 'Response code: %d\n' % r.status_code 
print r.text 

だけ<でマークされたコードで必要なパラメータを変更する>とは、HTTP経由でエンドポイントを打つことができるでしょう。何らかの理由でaws-sdkまたはaws-cliを使用できない場合にのみ適用されます。

上記のコードはPythonで書かれています。

次のリンクを確認してください。 https://github.com/danharper/hmac-examples

関連する問題