python - 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.
解决方案
每个账户和地区的流名称都是唯一的。所以你不能重新创建一个已经存在的流。根据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')
推荐阅读
- android - 如何加密资产文件夹android studio上的现有数据库
- nginx - 静态文件看不到烧瓶服务器
- ios - 使用 SMIL 进行动画处理时,iOS 13.3/XS 上的 SVG 图像闪烁。在 Safari 或 Chrome 中。没有不同
- python - 为什么在 Udacity 中没有显示输出,尽管代码在 Jupiter 笔记本中有效?
- python - Doctest 在 python3 中失败,但如果手动测试可以工作
- javascript - 如何转换此箭头函数?
- python - 如何更改 Keras 密集层的输出维度?
- python - numpy:切掉 2 列
- c# - 在 C# Windows 窗体中更改按钮字体 - “中”字体样式不可用
- rust - 如何向笔记本的选项卡和页面部分添加“标题”?