Создание приложений Kinesis Analytics с использованием aws cli - PullRequest
1 голос
/ 03 февраля 2020

Я хочу создать приложение для анализа кинезиса, используя aws cli. Я использую эту команду для создания приложения

aws kinesisanalytics create-application --application-name smartfactorytest1 --application-code "CREATE OR REPLACE STREAM DESTINATION_SQL_STREAM ( "device_serial" VARCHAR(16), "uploadRate"  INTEGER, "downloadRate" INTEGER);
CREATE OR REPLACE PUMP "STREAM_PUMP" 
    AS INSERT INTO DESTINATION_SQL_STREAM
SELECT STREAM  "device_serial",  "uploadRate", "downloadRate"
    FROM SOURCE_SQL_STREAM_001
-- LIKE compares a string to a string pattern (_ matches all char, % matches substring)
-- SIMILAR TO compares string to a regex, may use ESCAPE
    WHERE "uploadRate" >20000" --inputs NamePrefix="SOURCE_SQL_STREAM",KinesisStreamsInput={ResourceARN="sourcearn",RoleARN="rolearn"}

Но я получаю эту ошибку

invalid type for parameter Inputs[0].KinesisStreamsInput, value: ResourceARN=string, type: <class 'str'>, valid types: <class 'dict'>

Может кто-нибудь сказать мне, что я делаю неправильно? Любая помощь будет оценена.

1 Ответ

0 голосов
/ 06 февраля 2020

Я считаю, что проблема заключается либо в том, что вам нужно убрать кавычки в разделе KinesisStreamsInput, либо вам нужно добавить кавычки и экранировать их. В документации неясно, какой вариант является правильным.

  1. Согласно справочнику CLI AWS Kinesis Analytics, https://docs.aws.amazon.com/cli/latest/reference/kinesisanalytics/create-application.html, синтаксис для --inputs с KinesisStreamsInput должен выглядеть как пример для KinesisStreamsOutput:

    Name=string,KinesisStreamsOutput={ResourceARN=string,RoleARN=string},...
    

    Это будет означать удаление кавычек вокруг ваших sourcearn и rolearn. Тем не менее, в документации не ясно, что это относится к синтаксису CLI во всех случаях.

  2. Если это не сработает, согласно этой AWS странице руководства по использованию CLI, https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-parameters-quoting-strings.html, он определяет добавление кавычек и экранирование соответствующих, в зависимости от вашей ОС ...

    "Linux или macOS

    Используйте одинарные кавычки (' '), чтобы заключить структуру данных JSON, как в следующем примере. Вам не нужно делать ничего особенного со встроенными двойными кавычками, встроенными в строку JSON.

    aws ec2 run-instances --image-id ami-12345678 --block-device-mappings '[{"DeviceName":"/dev/sdb","Ebs":{"VolumeSize":20,"DeleteOnTermination":false,"VolumeType":"standard"}}]'
    

    PowerShell

    Для PowerShell требуются одинарные кавычки (''), чтобы заключить структуру данных JSON. Кроме того, поскольку двойные кавычки имеют особое значение для PowerShell, вы должны использовать обратную косую черту sh () для экранирования каждого из них. двойная кавычка (") в структуре JSON, как в следующем примере.

    PS C:\> aws ec2 run-instances --image-id ami-12345678 --block-device-mappings '[{\"DeviceName\":\"/dev/sdb\",\"Ebs\":{\"VolumeSize\":20,\"DeleteOnTermination\":false,\"VolumeType\":\"standard\"}}]'
    

    Windows Командная строка

    Для командной строки Windows требуются двойные кавычки ( «») e JSON структура данных. Кроме того, чтобы не допустить неправильного толкования процессором команд двойных кавычек, встроенных в JSON, необходимо также экранировать (перед символом обратного слэса sh [\]) каждую двойную кавычку (") в данных JSON сама структура, как в следующем примере.

    C:\> aws ec2 run-instances --image-id ami-12345678 --block-device-mappings "[{\"DeviceName\":\"/dev/sdb\",\"Ebs\":{\"VolumeSize\":20,\"DeleteOnTermination\":false,\"VolumeType\":\"standard\"}}]"
    

    Только крайние двойные кавычки не экранированы. "

  3. Эта ссылка также указывает на необходимость экранирования кавычек в Windows и использует команду kinesisanalytics: https://github.com/aws/aws-cli/issues/3103

    "Rishi74744 прокомментировал 6 февраля 2018

    Я заставил его работать как -

    aws kinesisanalytics add-application-reference-data-source --endpoint https://kinesisanalytics.us-east-1.amazonaws.com --region us-east-1 --application-name alerts --reference-data-source "{\"TableName\":\"DeviceData\",\"S3ReferenceDataSource\":{\"BucketARN\":\"arn: aws: s3: : : bucket-name\",\"FileKey\":\"device.csv\",\"ReferenceRoleARN\":\"arn: aws: iam: : account-id: role/role-name\"},\"ReferenceSchema\":{\"RecordFormat\":{\"RecordFormatType\":\"CSV\",\"MappingParameters\":{\"CSVMappingParameters\":{\"RecordRowDelimiter\":\"\n\",\"RecordColumnDelimiter\":\", \"}}},\"RecordEncoding\":\"UTF-8\",\"RecordColumns\":[{\"Name\":\"key1\",\"SqlType\":\"VARCHAR(64)\"},{\"Name\":\"key2\",\"SqlType\":\"VARCHAR(64)\"}]}}" --current-application-version-id 2
    

    Но об этом следует упомянуть в документации. "

  4. Одно примечание: может быть предпочтительнее использовать JSON файлы в качестве входных данных и использовать вместо этого этот синтаксис : --cli-input-json file://input.json. Об этом говорится в справочнике команд CLI AWS Kinesis (первая ссылка, ниже 1.), а также в ссылке выше на GitHub. Это также метод, используемый большинством AWS документации Kinesis. Например, JSON файлы, используемые для различных целей в Kinesis Analytics: https://docs.aws.amazon.com/kinesisanalytics/latest/dev/how-it-works-input.html

Пожалуйста, дайте мне знать, что работает, и я буду работать с моими AWS репутация для улучшения документации.

...