通过设置API网关调用Amazon Kinesis的REST API

需要帮忙

我正在尝试发送HTTP张贴请求以将记录放入Amazon Kinesis Stream。有几种方法(Kinesis Client,KPL,将AWS Gateway设置为Kinesis Proxy)。

我看到了有关Kinesis 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"
}

是否可以将上述HTTP POST请求发送到PutRecord,而不必按照此链接中的说明设置Amazon API Gateway: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,因此必须有一种方法。不幸的是,我在网上找不到任何资源。

鲁德雷什·阿杰冈卡
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": "' + base64.b64encode(<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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过域名调用API网关

来自分类Dev

调用基于 API 网关的 REST API 时的内部错误消息

来自分类Java

如何对Amazon Alexa进行REST API调用

来自分类Dev

如何通过Facebook验证API网关调用?

来自分类Dev

通过Apache Knox网关访问Apache NIFI REST API(jwt)

来自分类Dev

如何设置要通过HTTP / API网关异步调用的AWS Lambda?

来自分类Dev

apigee 网关、authn 和 authz:REST API 调用另一个 REST API

来自分类Dev

如何通过REST API调用保存PDF

来自分类Dev

通过 Rest 调用获取租户特定的 API

来自分类Dev

通过 REST API 在 Artifactory 中设置 baseURL

来自分类Dev

Keycloak 通过 Rest API 设置密码策略

来自分类Dev

将 api 网关连接到 Kinesis 流

来自分类Dev

使用REST Client POSTMAN使用api密钥对AWS api网关终端节点进行调用

来自分类Dev

api网关CORS设置

来自分类Dev

制定REST API调用

来自分类Dev

从REST API调用木偶

来自分类Dev

调用-ResMethod Rest API

来自分类Dev

设置camunda rest api

来自分类Dev

尽管设置了标头,但调用 API 网关仍返回 CORS 错误

来自分类Dev

通过API网关调用AWS Step函数并等待执行结果

来自分类Dev

如何授予API网关通过CloudFormation调用lambda函数的权限?

来自分类Dev

使用 Amazon 的 API 网关尊重 API 密钥

来自分类Dev

Wso2 API管理器,网关不从后端调用rest

来自分类Java

如何通过GET REST API调用传递SSL证书

来自分类Dev

通过调用REST API声明ADFS 3.0中的转换

来自分类Dev

通过 REST api 调用时 mavg 波前查询超时

来自分类Dev

如何通过 Hippo CMS 中的 REST API 调用更新内容?

来自分类Dev

如何通过Vue JS调用REST API服务

来自分类Dev

如何通过 postman 调用 REST API 在 Azure 中创建索引?

Related 相关文章

热门标签

归档