Преимущества наличия или переноса наборов данных в облачные решения разнообразны, и одним из них является безсерверное вычисление. Когда у нас есть готовые API и инструменты в облаке, нет никаких причин ограничивать вычисления в вашем приложении или решении. В этой статье мы рассмотрим API, готовый к работе в облаке, от Refinitiv и объединим его со службами AWS, чтобы создать готовое к использованию безсерверное приложение.
Мы будем использовать EDP Research API, который представляет собой совокупную систему доставки Refinitiv, которая предоставляет покупателям их соответствующие исследовательские отчеты о продажах в режиме реального времени. Эта система доставляет асинхронные обновления (оповещения) через сервис простой очереди Amazon (SQS). Мы создадим безсерверное приложение на основе сервисов AWS для приема и обработки сообщений из очереди без подготовки или управления серверами. Amazon предоставляет набор услуг, которые можно использовать для создания безсерверного приложения.
Вам также может понравиться: выход на сервер с Amazon Web Services (AWS) — традиционный подход
Об исследовательском API
Исследовательский API Refinitiv построен на платформе Elektron Data Platform (EDP), которая позволяет легко находить, интегрировать, анализировать, обогащать и потреблять контент, который вам нужен, через единый, согласованный интерфейс.
EDP API обеспечивает упрощенный доступ к исследованиям в реальном времени, а также к индивидуальным историческим выпискам.
Ключевая особенность
- Одна точка доступа API ко всему контенту, имеющему право на участие, для программного доступа.
- EDP API поддерживает распространение исследований Linkback и предоставляет URL-адреса для исследований вместо документов для участников, поддерживающих Linkback.
- Для запросов на доступ к API доступен набор участников, предварительно одобривших их, с течением времени добавляются новые участники.
- Стандартизированные форматы схемы и метаданных для> 1000 участников.
- Обогащенные метаданными, предоставленными участниками, с метаданными NLP (Natural Language Processing).
- Research Alerts — для нового входящего и обновленного контента участника.
- Запрос-ответ доступен для программных опросов и загрузок доступного контента.
- Вы и участник контролируете права на исследования.
Обзор API EDP Research
API исследований EDP использует механизм оповещений для доставки обновлений. Сначала приложение должно войти в Elektron Data Platform и получить токен доступа, используемый при любых запросах к Research API. Приложение может использовать API для подписки на исследовательские документы. После этого новые обновления (оповещения) будут помещены в очередь AWS SQS. Приложение отвечает за опрос очереди для получения новых сообщений.
Обзор веб-сервисов Amazon
Приложение в этой статье использует различные веб-сервисы Amazon. Ниже приведены некоторые описания и ресурсы.
Лямбда-функция AWS
AWS Lambda позволяет запускать код без подготовки или управления сервером. AWS Lambda поддерживает несколько языков за счет использования сред выполнения. Мы используем среду выполнения Python для выполнения кода нашего приложения на Python в этой статье. Вы также можете использовать AWS Lambda для запуска своего кода в ответ на события, такие как изменения данных в корзине Amazon S3 или таблице Amazon DynamoDB.
Согласно разделу Использование лямбды с Amazon SQS , Amazon SQS также может быть источником событий лямбда-функции AWS, которая вызывает лямбда-функцию с событием, содержащим сообщение очереди, однако SQS, созданный Research API, в настоящее время не поддерживает эту функцию. В этой статье мы реализуем функцию Lambda для опроса очереди SQS вручную.
Хранилище параметров менеджера системы AWS (хранилище параметров SSM)
Хранилище параметров AWS Systems Manager обеспечивает безопасное иерархическое хранилище для управления данными конфигурации и управления секретами. В качестве значений параметров вы можете хранить такие данные, как пароли, строки базы данных и коды лицензий. Значение может быть сохранено в виде простого текста или зашифрованных данных.
В этой статье мы используем хранилище параметров SSM для хранения имени пользователя, пароля, UUID и токена доступа, используемого приложением. Хранилище параметров SSM также хранит дату последнего изменения параметра, поэтому мы можем использовать эту информацию о временной отметке, чтобы проверить, истек ли срок действия маркера доступа EDP.
Amazon Simple Storage Service (Amazon S3)
Amazon S3 — это сервис хранения объектов. Он имеет концепцию «корзины», которая является контейнером для объектов, хранящихся в Amazon S3. Каждый объект содержится в ведре.
Шаговые функции AWS
Шаговые функции AWS — это сервис, который позволяет пользователям координировать несколько сервисов AWS в безсерверном рабочем процессе. Рабочие процессы состоят из последовательности шагов, причем выход одного шага действует как вход в следующий. Он переводит рабочий процесс приложения в диаграмму состояний, которую легко понять и отслеживать.
В этой статье мы используем шаговые функции AWS для интеграции каждого шага лямбда-функций в соответствии с рабочим процессом API исследования, таким как получение токена доступа, подписка на исследование и опрос SQS. Ниже приведена диаграмма состояний, созданная пошаговыми функциями для приложения. Во время выполнения отображаются текущие шаги выполнения, а также регистрируется состояние и результаты каждого шага.
Рабочий процесс приложения
Приложение реализовано для многократного опроса SQS на предмет новых обновлений. Поскольку Lambda была предназначена для небольших простых функций, мне нужно разделить каждый шаг реализации на несколько функций Lambda и интегрировать их с функциями шага AWS.
1. Step Function вызывает лямбда-функцию; « GetEDPToken », чтобы получить имя пользователя EDP, пароль из хранилища параметров AWS Systems Manager ( хранилище параметров SSM), а затем использовать эту информацию для получения токена доступа EDP из службы Elektron Data API. Токен доступа будет сохранен обратно в хранилище параметров. Ниже приведен фрагмент кода лямбда-функции «getEDPToken» для получения значения параметров из хранилища параметров SSM.
питон
xxxxxxxxxx
1
# Get parameters' values from SSM Parameter Store
2
client = boto3.client('ssm')
3
response = client.get_parameters(
4
Names=['EDPUsername','EDPPassword','EDPClientId'],
5
WithDecryption=False
6
)
7
params = response['Parameters']
8
username = list(filter(lambda x : x['Name'] == 'EDPUsername', params))[0]['Value']
9
password = list(filter(lambda x : x['Name'] == 'EDPPassword', params))[0]['Value']
10
clientId = list(filter(lambda x : x['Name'] == 'EDPClientId', params))[0]['Value']
2. Лямбда-функция; « SubscribeResearch » вызывается, чтобы подписаться на Research Alerts, а затем передать ключ шифрования и конечную точку следующей функции. Функция сначала отменит подписку на оставшуюся подписку, чтобы предотвратить повторяющиеся ошибки подписки.
3. С конечной точкой лямбда-функция; « GetCloudCredential » будет запрашивать Cloud Credential у службы EDP.
4. Приложение несколько раз опрашивает очередь SQS, чтобы узнать, есть ли новое предупреждающее сообщение, а затем получает идентификатор документа Research.
5. Шаговая функция; « GetAlertMessage » проверяет, доступны ли в очереди сообщения, содержащие идентификатор документа. Если доступно, функция передает список идентификаторов документов следующей функции для загрузки документов. Если нет, вызывается состояние «Ожидание Х секунд» для ожидания следующего интервала.
6. Шаг Функции; « RefreshToken » будет вызываться до состояния загрузки документов для обновления токена, если срок хранения сохраненного токена истек, и сохраните файл в Amazon S3, если он доступен. Функция; « DownloadDocuments » будет вызываться для каждого идентификатора документа, чтобы загрузить данные из EDP, а затем сохранить файл в AWS S3.
7. Research API поддерживает два типа результатов; текст или pdf . Приложение в этой статье реализовано для получения исследовательских документов в текстовом формате. Вы можете изменить тип на pdf в лямбда-функции « downloadDocuments ». Ниже приведен пример кода для формата PDF .
питон
xxxxxxxxxx
1
#===================================================================
2
def downloadDocument(id,docUrl,outputBucket):
3
s3 = boto3.client('s3')
4
response = requests.get(docUrl, stream=True)
5
print(response.raw)
6
s3.upload_fileobj(response.raw, outputBucket, id+".pdf")
7
#===================================================================
8
def getDocumentUrl(token,docID,uId):
9
document_type = "/pdf"
10
p = {'uuid': uId}
11
RESOURCE_ENDPOINT = document_URL + docID + document_type
Ниже приведена схема подключения, описывающая, как приложение интегрируется с другими веб-сервисами Amazon и Elektron Data API.
1. Чтобы использовать Lambda и другие сервисы AWS, вам сначала потребуется учетная запись AWS и пользователь IAM. Ниже приведена информация о настройке на странице « Начало работы с Lambda» . Пожалуйста, следуйте инструкциям, если у вас нет учетной записи AWS.
Чтобы использовать Lambda и другие сервисы AWS, вам нужна учетная запись AWS. Если у вас нет учетной записи, посетите веб- сайт aws.amazon.com и выберите « Создать учетную запись AWS» . Подробные инструкции см. В разделе « Создание и активация учетной записи AWS» .
Рекомендуется также создать пользователя AWS Identity and Access Management (IAM) с правами администратора и использовать его для всей работы, не требующей корневых учетных данных. Создайте пароль для доступа к консоли и ключи доступа для использования инструментов командной строки. Инструкции см. В разделе « Создание первого пользователя и группы администратора IAM» в Руководстве пользователя IAM.
2. Загрузите и установите интерфейс командной строки AWS (CLI), который используется для развертывания лямбда-функций в этой статье.
3. Настройте свои учетные данные AWS в интерфейсе командной строки AWS. Во-первых, вам нужно получить идентификатор ключа доступа и секретный ключ доступа. Вы можете следовать инструкциям в этом руководстве, чтобы получить свои учетные данные. Запустите команду configure, чтобы установить регион, идентификатор ключа доступа и секретный ключ доступа.
Что касается региона по умолчанию, все ресурсы создаются в «us-east-1», поскольку этот регион используется Research API для создания очереди SQS. Чтобы избежать затрат на передачу данных, мы используем этот регион для всех веб-служб Amazon.
Простой текст
xxxxxxxxxx
1
>aws configure
2
AWS Access Key ID [None]: accesskey
3
AWS Secret Access Key [None]: secretkey
4
Default region name [None]: us-east-1
5
Default output format [None]:
4. Приложение получает имя пользователя EDP, пароль, токен доступа и токен обновления из хранилища параметров SSM, поэтому необходимо создать следующие параметры в консоли AWS .
- EDPUsername
- EDPPassword
- EDPClientId
- UUID
- EDPAccessToken
- EDPRefreshToken
- BucketStorage
Экран консоли находится ниже, как только вы создадите все параметры.
5. Приложение загрузит информацию исследовательского документа, а затем сохранит информацию в виде файлового объекта в корзине AWS S3. Вам нужно создать корзину на консоли AWS .
Создать лямбда-функции
Далее мы создадим лямбда-функции из пакетов развертывания с использованием интерфейса командной строки AWS (CLI) . Пакеты развертывания и сценарии установки можно загрузить с Github . После распаковки файла вы увидите следующую структуру.
« Install.ps1 » — это сценарий PowerShell, который можно использовать для установки. Вы можете запустить скрипт для настройки всех лямбда-функций. В противном случае, пожалуйста, следуйте инструкциям следующим образом.
Сначала откройте командную строку и измените текущий каталог на расположение извлеченных файлов.
1. Роль IAM для доступа к сервису AWS
Роль IAM можно создать в учетной записи пользователя для определения политик разрешений. Как вы уже знаете, приложение обращается к различным сервисам. Нам нужно создать роль IAM, содержащую политику разрешений для служб.
- Создать роль IAM
Этот шаг вернет созданный Роль ARN. На следующем шаге вам понадобится ARN роли для создания лямбда-функции.
Ниже приведен пример ARN в возвращенном сообщении.
- Прикрепите Ролевую Политику
Простой текст
xxxxxxxxxx
1
aws iam attach-role-policy - policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess - role-name lambda-sqs-ssm
2
aws iam attach-role-policy - policy-arn arn:aws:iam::aws:policy/AmazonSSMFullAccess - role-name lambda-sqs-ssm
3
aws iam attach-role-policy - policy-arn arn:aws:iam::aws:policy/AWSLambdaExecute - role-name lambda-sqs-ssm
2. Создание лямбда-функций
Вам необходимо заменить $ arn_info на ARN роли IAM, созданной на предыдущем шаге.
Простой текст
xxxxxxxxxx
1
aws lambda create-function - function-name getEDPToken - runtime python3.7 - role $arn_info - handler lambda_function.lambda_handler - timeout 20 zip-file fileb://getEDPToken.zip - region us-east-1
2
aws lambda create-function - function-name subscribeResearch - runtime python3.7 - role $arn_info - handler lambda_function.lambda_handler - timeout 20 zip-file fileb://subscribeResearch.zip - region us-east-1
3
aws lambda create-function - function-name getCloudCredential - runtime python3.7 - role $arn_info - handler lambda_function.lambda_handler - timeout 20 zip-file fileb://getCloudCredential.zip - region us-east-1
4
aws lambda create-function - function-name getAlertMessage - runtime python3.7 - role $arn_info - handler lambda_function.lambda_handler - timeout 10 - zip-file fileb://getAlertMessage.zip - region us-east-1
5
aws lambda create-function - function-name refreshToken - runtime python3.7 - role $arn_info - handler lambda_function.lambda_handler - timeout 5 - zip-file fileb://refreshToken.zip - region us-east-1
6
aws lambda create-function - function-name downloadDocuments - runtime python3.7 - role $arn_info - handler lambda_function.lambda_handler - timeout 10 - zip-file fileb://downloadDocuments.zip - region us-east-1
После этого шага вы увидите список лямбда-функций в графическом интерфейсе консоли AWS .
Лямбда-функция обычно выполняется в выделенной среде. Если ваша функция зависит от библиотек, отличных от SDK для Python (Boto 3), вам необходимо создать пакет развертывания, включающий библиотеки. В этой статье лямбда-функции зависят от запросов и библиотек pycryptodome для REST API и дешифрования. Дополнительную информацию см. В разделе « Обновление функции с дополнительными зависимостями » в пакете развертывания Lambda AWS в Python .
На этом этапе вы сможете создавать лямбда-функции, параметры в хранилище параметров SSM и корзину AWS S3, используемую приложением. Далее мы опишем основную информацию о том, как реализовать и создать безсерверное приложение, которое координирует все функции и другие сервисы с пошаговыми функциями.
Обзор реализации пошаговых функций
Шаговые функции основаны на понятиях задач и конечных автоматов . Вы определяете конечные автоматы, используя основанный на JSON язык состояний Amazon . Штаты могут выполнять различные функции в вашем автомате состояний:
- Сделайте некоторую работу на вашем автомате (состояние задачи ).
- Выбор между ветвями исполнения (состояние выбора ).
- Остановить выполнение с ошибкой или успехом (состояние Fail или Succeed ).
- Просто передайте входные данные на свой выход или введите фиксированные данные (состояние Pass ).
- Обеспечить задержку в течение определенного периода времени или до определенного времени / даты (а Подождите состояние).
- Начните параллельные ветви выполнения ( Параллельное состояние).
- Динамически повторять шаги, используя состояние карты .
Приложение в этой статье использует некоторые функции состояний. Следующая диаграмма показывает определенные типы каждого состояния.
- Почти состояния — это состояние задачи, которое выполняет лямбда-функции, чтобы запросить токен доступа EDP (getEDPToken), подписать уведомление об исследовании (подпискаResearch), опросить очередь SQS (getAlertMessage), загрузить документы (downloadDocuments) и т. Д.
- Статус проверки использует состояние выбора, чтобы активировать функцию загрузки документа при получении нового сообщения от SQS.
- Функция «Загрузить документы» определяется как состояние «Карта», которая выполняет итерацию по карте идентификатора документа и вызывает лямбда-функцию для параллельной загрузки / выгрузки документа для каждого идентификатора. Это должно улучшить производительность приложения, когда из очереди получено несколько предупреждающих сообщений.
- Секунд ожидания X определяется как состояние ожидания, которое задерживает конечный автомат от продолжения в течение указанного времени. Это ожидание определенного интервала перед опросом очереди для нового сообщения. Для этого приложения интервал времени составляет 10 секунд.
- Очередь Сбой определена как состояние Сбой, чтобы остановить выполнение, когда приложению не удалось получить сообщение от SQS.
Создать пошаговые функции
Следуйте приведенным ниже инструкциям, чтобы создать пошаговую функцию, координирующую лямбда-функции, созданные на предыдущем шаге.
- Откройте Консоль AWS Step Functions -> нажмите кнопку «Создать конечный автомат».
- На шаге 1: Определите конечный автомат, выберите «Автор с фрагментами кода» и заполните Имя функции шагов.
- Скопируйте следующие коды в определение конечного автомата. Вам необходимо исправить ARN лямбда-функции в полях «Resource» кода.
Простой текст
xxxxxxxxxx
1
{
2
"Comment": "An example of the Amazon States Language that integrates with Refinitiv EDP Research API",
3
"StartAt": "Get EDP Token",
4
"States": {
5
"Get EDP Token": {
6
"Type": "Task",
7
"Resource": "arn:aws:lambda:us-east-1:<user>:function:getEDPToken",
8
"Next": "Subscribe Research"
9
},
10
"Subscribe Research": {
11
"Type": "Task",
12
"Resource": "arn:aws:lambda:us-east-1:<user>:function:subscribeResearch",
13
"ResultPath": "$.subscriptionInfo",
14
"Next": "Get Cloud Credential"
15
},
16
"Get Cloud Credential": {
17
"Type": "Task",
18
"Resource": "arn:aws:lambda:us-east-1:<user>:function:getCloudCredential",
19
"InputPath": "$.subscriptionInfo",
20
"ResultPath": "$.cloudCredentialInfo",
21
"Next": "Wait X Seconds"
22
},
23
"Wait X Seconds": {
24
"Type": "Wait",
25
"Seconds": 10,
26
"Next": "Get Alert Message"
27
},
28
"Get Alert Message": {
29
"Type": "Task",
30
"Resource": "arn:aws:lambda:us-east-1:<user>:function:getAlertMessage",
31
"Next": "Check Status",
32
"Parameters": {
33
"endpoint.$": "$.subscriptionInfo.endpoint",
34
"cryptographyKey.$":"$.subscriptionInfo.cryptographyKey",
35
"accessKeyId.$": "$.cloudCredentialInfo.accessKeyId",
36
"secretKey.$": "$.cloudCredentialInfo.secretKey",
37
"sessionToken.$": "$.cloudCredentialInfo.sessionToken"
38
},
39
"ResultPath": "$.queueStatus"
40
},
41
"Check Status": {
42
"Type": "Choice",
43
"Choices": [
44
{
45
"Variable": "$.queueStatus['status']",
46
"StringEquals": "Doc Available",
47
"Next": "Refresh Token"
48
},
49
{
50
"Variable": "$.queueStatus['status']",
51
"StringEquals": "Queue Failed",
52
"Next": "Queue Failed"
53
},
54
{
55
"Variable": "$.queueStatus['status']",
56
"StringEquals": "ExpiredToken",
57
"Next": "Get Cloud Credential"
58
},
59
{
60
"Variable": "$.queueStatus['status']",
61
"StringEquals": "None",
62
"Next": "Wait X Seconds"
63
}
64
],
65
"Default": "Wait X Seconds"
66
},
67
"Queue Failed": {
68
"Type": "Fail",
69
"Cause": "SQS returned error",
70
"Error": "SQS FAILED"
71
},
72
"Download Documents": {
73
"Type": "Map",
74
"InputPath": "$.queueStatus",
75
"ItemsPath": "$.docIds",
76
"MaxConcurrency": 10,
77
"ResultPath": "$.status",
78
"Iterator": {
79
"StartAt": "Download Document",
80
"States": {
81
"Download Document": {
82
"Type": "Task",
83
"Resource": "arn:aws:lambda:us-east-1:<user>:function:downloadDocuments",
84
"End": true
85
}
86
}
87
},
88
"ResultPath": "$.status",
89
"Next": "Wait X Seconds"
90
},
91
"Refresh Token": {
92
"Type": "Task",
93
"Resource": "arn:aws:lambda:us-east-1:<user>:function:refreshToken",
94
"Next": "Download Documents",
95
"ResultPath": "$.status"
96
}
97
}
98
}
- Нажмите кнопку «Далее», чтобы перейти к следующему шагу,
- На шаге 2: «Настройка параметров» выберите «Создать роль IAM для меня», а затем введите имя роли IAM.
- Наконец, нажмите «Создать конечный автомат».
Шаги для запуска приложения без сервера
1. Настройте информацию в следующих параметрах в хранилище параметров SSM . Если у вас нет имени пользователя EDP, пароля и UUID, обратитесь к местному представителю Refinitiv. Что касается идентификатора клиента, следуйте инструкциям в этом руководстве, чтобы создать идентификатор клиента (ключ приложения). BucketStorage — это имя корзины AWS S3, созданной на этапах настройки.
- EDPUsername
- EDPPassword
- EDPClientId
- UUID
- BucketStorage
2. Откройте консоль пошаговых функций , выберите конечный автомат, созданный вами на этапах настройки.
3. Нажмите кнопку «Начать выполнение», чтобы запустить приложение. Вы увидите новое всплывающее окно для заполнения комментариев. Просто нажмите кнопку «Начать выполнение» еще раз. Вы увидите, что приложение выполняется на каждом этапе функции и статуса лямбды на панели Visual Workflow.
4. Как только новое оповещение станет доступным, информация об исследовании будет сохранена в корзине S3, определенной в параметре BucketStorage.
Наконец, новые исследовательские документы будут загружаться постоянно, пока выполняется приложение. Вы можете вручную загрузить / открыть файл через консоль Amazon S3 или интегрировать Amazon S3 с другими AWS по мере необходимости. Например, вызвать новую лямбда-функцию .
Диагностика и устранение неисправностей
В консоли функция «Шаги» предоставляет историю событий выполнения, которая может помочь вам получить больше информации в случае сбоя.
Например:
1) В типе события TaskStateEntered событие будет отображать входные данные при выполнении функции.
2) Событие также может ссылаться на журналы CloudWatch. Журнал отображает все сообщения журнала для конкретной лямбда-функции. Вы можете добавить любой код отладки или проверить последовательность событий здесь.
Conclusion
In this article, we describe basic information about Refinitiv’s Research API and AWS. We demonstrate how to create a serverless application which continually retrieves EDP Research information and store it in Cloud Storage.