首页 > 解决方案 > How do I delete boto3 stream before trying to open one with same name?

问题描述

I am using boto3 to fetch data using TwitterAPI. It opens a stream correctly the first time I run the program, but if I do a KeyboardInterupt in console and then try to run the program, I get the error:

botocore.errorfactory.ResourceInUseException: An error occurred 
(ResourceInUseException) when calling the CreateStream 
operation: Stream TwitterStream under account XXXXXXXXXX already exists.

If I manually go in and change the name of the stream, I am able to create another stream, but this is kind of a hassle.

client = boto3.client('kinesis',region_name="us-east-2")
response = client.create_stream(StreamName='TwitterStream',ShardCount=1)

api = TwitterAPI(consumer_key, consumer_secret, access_token_key, 
access_token_secret)

kinesis = boto3.client('kinesis')

Any help would be appreciated.

标签: pythonamazon-web-servicesboto3

解决方案


每个账户和地区的流名称都是唯一的。所以你不能重新创建一个已经存在的流。根据create_stream 文档

流名称标识流。该名称的范围是应用程序使用的 AWS 账户。它也受 AWS 区域的限制。也就是说,两个不同账户中的两个流可以具有相同的名称,并且同一个账户中的两个流在两个不同的 Region 中可以具有相同的名称。

您需要检查是否需要创建流或管理错误。就像是:

try:
    client = boto3.client('kinesis',region_name="us-east-2")
    response = client.create_stream(StreamName='TwitterStream',ShardCount=1)

    print('stream {} created'.format(stream_name))
except ResourceInUseException:
    print('stream {} already exists'.format(stream_name))

api = TwitterAPI(consumer_key, consumer_secret, access_token_key, access_token_secret)

kinesis = boto3.client('kinesis')

了解创建流时,您需要等待它变为ACTIVE- 它们不能立即使用。

话虽如此,如果你真的想删除它,首先将代码更改为:

try:
    client = boto3.client('kinesis',region_name="us-east-2")
    response = client.create_stream(StreamName='TwitterStream',ShardCount=1)

    print('stream {} created'.format(stream_name))
except ResourceInUseException:
    print('stream {} already exists'.format(stream_name))
    client.delete_stream(StreamName='TwitterStream')

status = 'not set'
while( status != 'ACTIVE' )
    describe_stream_response = client.describe_stream(stream_name)
    description = describe_stream_response.get('StreamDescription')
    status = description.get('StreamStatus')
    time.sleep(1)

api = TwitterAPI(consumer_key, consumer_secret, access_token_key, access_token_secret)

kinesis = boto3.client('kinesis')

推荐阅读