现在这个问题困住了一个星期。 老实说,我认为这是我们在东方1区的一个错误,目前还有Kinesis Firehose。
至少他们会自动创建错误的信任关系角色。 以下是默认创建的内容: (我在任何地方都将userID更改为123456)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "firehose.amazonaws.com"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "123456"
}
}
}
]
}
当我尝试从我的帐户调用assume_role时,我总是得到:
botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::123456:user/fh is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::123456:role/firehose_delivery_role2
用户fh具有AdministratorAccess策略。
相反,您需要使用以下实际有效的信任关系:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456:root"
},
"Action": "sts:AssumeRole"
}
]
}
但是,无论我做什么都没关系,我总是在尝试放任何东西时得到以下信息:
botocore.errorfactory.ResourceNotFoundException: An error occurred (ResourceNotFoundException) when calling the PutRecord operation: Stream test3 under account 123456 not found.
尝试使用管理员帐户访问它而不使用assume_role会得到相同的结果。
我的test3流将数据传送到我的弹性搜索。
有人可以创建新的弹性搜索,kinesis firehose流和测试数据传递吗?理想情况下来自python / boto3。
以下是代码示例。不要看变量名;)
import boto3
import json
from datetime import datetime
import calendar
import random
import time
my_stream_name = 'python-stream'
kinesis_client = boto3.client('sts', aws_access_key_id='key', aws_secret_access_key='secret', region_name='us-east-1')
assumedRoleObject = kinesis_client.assume_role(
RoleArn="arn:aws:iam::123456:role/firehose_delivery_role3",
RoleSessionName="AssumeRoleSession1"
)
kinesis_session = boto3.Session(
aws_access_key_id=assumedRoleObject,
aws_secret_access_key=assumedRoleObject,
aws_session_token=assumedRoleObject)
client = kinesis_session.client('kinesis', region_name='us-east-1')
def put_to_stream(thing_id, property_value, property_timestamp):
payload = {
'prop': str(property_value),
'timestamp': str(property_timestamp),
'thing_id': thing_id
}
print payload
put_response = client.put_record(
StreamName='test3',
Data=json.dumps(payload),
PartitionKey=thing_id)
while True:
property_value = random.randint(40, 120)
property_timestamp = calendar.timegm(datetime.utcnow().timetuple())
thing_id = 'aa-bb'
put_to_stream(thing_id, property_value, property_timestamp)
# wait for 5 second
time.sleep(5)
答案 0 :(得分:0)
未找到帐户123456下的流测试3
基本AWS功能中的一个错误总是可能没有被其他用户注意到,但它不太可能。
kinesis_session.client(' kinesis',region_name =' us-east-1')
这为Kinesis 数据流创建了一个客户端,但您的帖子是关于Kinesis Firehose 。他们是不同的东西,Boto使用不同的客户。来自the docs:
client = boto3.client('firehose')