Как удалить поток boto3, прежде чем пытаться открыть поток с таким же именем? - PullRequest
0 голосов
/ 01 января 2019

Я использую boto3 для извлечения данных с помощью TwitterAPI.Он правильно открывает поток при первом запуске программы, но если я выполняю KeyboardInterupt в консоли и затем пытаюсь запустить программу, я получаю сообщение об ошибке:

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

Если я вручную захожу и изменяюимя потока, я могу создать другой поток, но это своего рода хлопот.

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')

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 02 января 2019

Имена потоков уникальны для каждой учетной записи и региона.Таким образом, вы не можете воссоздать поток, который уже существует.Согласно документам create_stream :

Имя потока идентифицирует поток.Имя относится к учетной записи AWS, используемой приложением.Это также ограничено областью AWS.То есть два потока в двух разных учетных записях могут иметь одно и то же имя, а два потока в одной и той же учетной записи, но в двух разных регионах, могут иметь одинаковое имя.

Вам необходимо проверить,вам нужно создать поток или управлять ошибкой.Что-то вроде:

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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...