Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Переход в облако. Практическое руководство по организации облачных вычислений для ученых и IT-специалистов

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
739 Кб
Скачать

ГЛАВА 7

Экземпляр EC2

 

 

=

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Данные

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

NASA Earth (API)

 

 

 

Облачное

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

хранилище

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3: Хранение

 

 

 

 

 

 

 

 

 

 

результатов

 

 

4: Ответ пользователю

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2: Получение

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(...)

данных

 

Конечная точка

 

 

 

по месяцам

 

HTTP (триггер)

 

1: Запускаю-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

щий код

Облачные

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

функции

 

 

 

Рис. 7.1. Высокоуровневая архитектура бессерверных вычислений и рабочего

процесса эксперимента по классификации месяцев по критерию облачности

Обратите внимание: данный код упрощен и не предназначен для практического применения. Кроме того, это так называемый синхронный запрос, используемый в качестве примера (а длительные синхронные HTTP-запросы обычно не рекомендуется применять). Данный код является вариацией представленного в разделе 6.3.1 кода, адаптированного для облачных функций Google. Вот в чем состоят его основные отличия:

Все требования обрабатываются на стороне сервера, и о разрешении заботится Google (согласно файлу requirements.txt).

Выходные данные и журналы, полученные облачной платформой, отображаются в пользовательском интерфейсе (в данном случае это Google Cloud Logs / Stackdriver).

Аутентификация и память, характерные для AWS, заменены аналогами GCS.

Несмотря на эти различия, логика моделирования остается неизменной:

В данном случае код запускается конечной точкой HTTP, созданной Google Cloud Functions для этого эксперимента.

91

ПЕРЕХОД В ОБЛАКО

Далее следует получение оценки облачности за месяц (ежедневные значения) из API NASA.

С учетом этих данных производится расчет: определяется средний показатель облачности за месяц и наиболее типичный день для этого месяца (ближайший к среднему значению).

Результаты загружаются в объект облачного хранилища Google.

Пользователю отправляется сообщение об успешном завершении задачи.

Для запуска этой программы требуются два файла: содержащий требования (requirements.txt, используемый для разрешения зависимостей) и собственно код моделирования (main.py).

Содержимое файла requirements.txt выглядит так:

numpy

google–cloud–storage

Содержимое файла main.py выглядит следующим образом:

import json import numpy import os import requests

from calendar import monthrange from datetime import datetime from google.cloud import storage

# Константы: ключи API и секретные ключи доступа

NASA_API_KEY = “NASA_API_KEY”

AWS_ACCESS_KEY_ID = ’XXX’

AWS_SECRET_ACCESS_KEY = ’YYY’

GCS_BUCKET = ’MY EXPERIMENT BUCKET’

# Константы: дата в формате ГГГГ–ММ

DATE = «2016–07»

# Константы: долгота и широта

LON = «–7.8987052»

92

ГЛАВА 7

LAT = “42.3384207”

class Month(object):

def __init__ (self, longitude, latitude, date, api_key): self. _longitude = longitude

self. _latitude = latitude self. _date = date

self ._api_key = api_key

self. _baseurl = “https://api. nasa.gov/ planetary / earth /imagery/” self ._req = requests

# Данные за месяц self ._monthdata = {}

def _getData(self):

year, month = self. _date. split (’–’)

mrange = monthrange(int(year), int (month))

print(“> Receiving data from API … “)

for day in range(1, mrange[1] + 1):

day_date = “{}–{}”.format(self. _date, day)

day_url = “{base}?lon={lon}&lat={lat}&date={date}& cloud_score=True&api_key={api_key}”

. format(base=self. _baseurl, lon=self. _longitude, lat =self. _latitude,

date=day_date, api_key=self ._api_key)

#Оптимизация может заключаться в том, чтобы делать меньше запросов к API (ближайший день от API).

#а также с целью использования многопроцессорного пула для

#параллельных запросов

day_data = self ._req. get (day_url)

day_data_json = day_data. json ()

93

ПЕРЕХОД В ОБЛАКО

response_date = datetime. strptime (

day_data_json[’ date ’], ’%Y–%m–%dT%H:%M:%S’) response_simple_date = “{}–{}–{}”.format(

response_date. year, response_date.month, response_date. day)

# Добавляем данные только если их еще нет if response_simple_date not in self ._monthdata:

self ._monthdata[response_simple_date] = day_data_json

def _getAverageDay(self):

self ._getAverageCloudScore() closest_average_day = ’ ’ average_distance = 1

for day in self ._monthdata: day_avg_distance = numpy.absolute(

self ._monthdata[day][’ cloud_score ’] — self. _average_cloud_score)

if (day_avg_distance < average_distance):

# Отмечаем текущий день как наиболее близкий к среднему average_distance = day_avg_distance

closest_average_day = day

self. _closest_average_day = closest_average_day

def _getAverageCloudScore(self): cloud_scores = []

for day in self ._monthdata:

cloud_scores.append(self ._monthdata[day][’ cloud_score ’]) self. _average_cloud_score = numpy.mean(cloud_scores)

def _writeResultFile (self, filename, file_content):

# Записываем файл результатов в бакет GCS client = storage. Client ()

bucket = client. get_bucket (GCS_BUCKET) blob = bucket.blob(filename)

94

ГЛАВА 7

blob. upload_from_string (str (file_content))

def _writeOutput(self):

# Эти данные будут записаны в журнал выполнения функции print(“ “)

print(“> Month Average Cloud Score for%s:%s”% (DATE, self. _average_cloud_score))

print(“> Average Day Date (YYYY–MM–DD):%s (avg.:%s)”% ( self._closest_average_day, self._monthdata[self. _closest_average_day][’ cloud_score ’]))

def process (self): self ._getData ()

self ._getAverageDay() self. _writeOutput ()

# Запись среднемесячного значения в хранилище

self. _writeResultFile (“%s_%s”% (DATE, “month_average”), self. _average_cloud_score)

# Запись наиболее типичных данных для дня (усредненных) в хранилище self. _writeResultFile (“%s_%s”% (DATE, “day_average”), self.

_closest_average_day)

def classifier (request):

month = Month(LON, LAT, DATE, NASA_API_KEY)

# Обработка данных за месяц month.process ()

return f”Computation completed! Results available on the GCS Bucket.”

Как только код будет готов, его можно развернуть в облачную функцию с помощью простой команды:

$gcloud functions deploy start_simulation ––runtime python37 ––trigger

http

95

ПЕРЕХОД В ОБЛАКО

Эта команда вернет информацию о нашей функции, например о ее конечной точке (httpsTrigger url), которая будет использоваться для запуска облачной функции. В нашем примере функция выглядит так: https://us- central1-OUR-EXPERIMENT.cloudfunctions.net/simulation. Команда для запуска моделирования выглядит следующим образом:

Рамка открывается

$ curl «https://us–central1–OUR–EXPERIMENT.cloudfunctions.net/

simulation»

Как только моделирование будет завершено, его можно удалить с помощью команды gcloud:

$ gcloud functions delete simulation

7.4. Пример: Бессерверный сбор данных с датчиков

После успешного запуска классификатора в облаке Google Сашина команда рассматривала возможность использовать новые знания для решения другой проблемы, которая беспокоит их уже продолжительное время: данные API NASA — это прекрасно, но все же не совсем то, что им требуется. Сашина команда больше заинтересована в данных по конкретному региону: для этого они развернули сеть высокочувствительных датчиков, с которых можно получать данные в режиме реального времени. И теперь исследователям нужен легкий способ сбора этих данных.

Поскольку команда уже знает, как запустить бессерверный код, Саша предлагает простую функцию, которая будет заносить данные с датчика в файл; а команда в свою очередь сможет считывать результаты непосредственно из своего бакета GCS. Вероятнее всего, Саша начнет с использования программы вроде Datastore. Рабочий процесс схематично показан на рис. 7.2.

Вот как это будет реализовано94:

94Обратите внимание: в данной разработке не затрагиваются вопросы безопасности или аутентификации; она служит лишь доказательством концепции: любой, у кого есть URL-а- дрес, может сделать GET-запрос и внести данные в GCS-бакет.

96

ГЛАВА 7

=

Облачное

хранилище

3: Сохранение данных датчика

 

 

 

 

 

 

4: Ответ пользователю

 

 

 

 

 

1: Отправка ID

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

и наблюдаемого

 

 

 

 

 

(...)

Сенсор

значения

 

Конечная точка

 

 

 

 

 

HTTP (триггер)

 

2: Запуска-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ющий код

Облачные

 

 

 

 

 

 

 

 

 

 

 

5: Ответ датчику

 

 

 

 

 

 

 

 

 

 

функции

Рис. 7.2. Высокоуровневая бессерверная архитектура и рабочий процесс для

сбора данных с датчиков

Содержимое файла requirements.txt:

google–cloud–storage

Содержимое файла main.py:

import time import json

from google.cloud import storage

# Константы

GCS_BUCKET = ’MY_EXPERIMENT_BUCKET’

def writeSensorData(sensor_id, sensor_value):

# Запись файла результата в бакет GCS timestamp = int (time. time ())

filename = “sensor_%s_%s”%(sensor_id, timestamp) client = storage. Client ()

bucket = client. get_bucket (GCS_BUCKET)

97

ПЕРЕХОД В ОБЛАКО

blob = bucket.blob(filename)

blob. upload_from_string (str (sensor_value))

def sensor (request):

# sensor_id и sensor_value являются обязательными аргументами request_json = request. get_json ()

if request. args and ’ sensor_id ’ in request. args and ’ sensor_value ’ in request. args:

args = request. args. to_dict ()

writeSensorData(args [’ sensor_id ’], args [’ sensor_value ’]) return f ’OK’

return f ’Missing Arguments!’

Код разворачивается с помощью следующей команды:

$ gcloud functions deploy sensor ––runtime python37 ––trigger–http

Рамка закрывается Теперь для начала передачи данных бессерверному микросервису сен-

сорам просто нужно вызвать URL-адрес:

curl «https:///us–central1–OUR–EXPERIMENT.cloudfunctions.net/sensor?

sensor_id=<SENSOR_ID>&sensor_value=<SENSOR_VALUE>”

ГЛАВА 8

Г Л А В А 8

Этические и юридические аспекты облачных технологий

Рассмотрение этических и правовых вопросов в рамках этой книги оказалось более сложным, чем казалось изначально. Во-первых, Саша должен понимать: и научные исследования, и информационные технологии являются обособленными сферами деятельности. При проведении эксперимента Саше в зависимости от конкретного проекта может потребоваться одобрение комитета по этике. Кроме того, он должен следовать научной методике, чтобы позаботиться о воспроизводимости и сделать свою работу полезной для других.

Этика в области ИТ не очень отличается от этики в остальных сферах жизни. Учитывая, что Саша, скорее всего, не разрабатывает большую часть своего программного и аппаратного обеспечения самостоятельно, ему следует учитывать, какое ПО он использует и как оно было разработано. Несколько десятилетий назад на этот факт обратил внимание Ричард Столлман, инициировавший Движение за свободное ПО. Это движение является частью деятельности таких организаций, как Фонд свободного ПО и Фонд электронных границ.

Популяризация интернета превратила вопрос защиты данных в новую острую проблему. В некотором смысле использование облачных вычислений сопряжено с теми же юридическими проблемами, что и работа с многими другими сервисами в интернете. Например, Саше нужно знать, работает ли выбранная им SaaS под лицензией типа Affero GPL (AGPL)95 и разработана ли она специально для облака. Это гарантировало бы, что запущенное в облаке ПО является бесплатным и Саша может получить доступ к исходному коду.

Компании, продающие услуги облачных вычислений, должны первыми обеспечить максимальную прозрачность и соответствие высочайшим

95GNU (2007) GNU Affero General Public License. https://www.gnu.org/licenses/agpl-3.0.html. По состоянию на 10 февраля 2019 г.

99

ПЕРЕХОД В ОБЛАКО

стандартам. Среди пользователей этих сервисов есть национальные ведомства, например военное, что требует предельного уровня безопасности. К счастью, компании, предоставляющие облачные сервисы, должны соблюдать строжайшие стандарты качества ISO, что обеспечивает высокий уровень их ответственности.

Около 10 лет назад была выдвинута инициатива по разработке «Манифеста облачных вычислений»: он должен был вытекать из сотрудничества, основанного на бесплатных инструментах с участием индустрии. Это был следующий шаг после «Билля о правах на облачные вычисления»; однако ключевые игроки в конечном итоге решили его все же не подписывать, и в 2012 г. идея провалилась. Проекты манифеста были сугубо техническими и ориентированными на разработку бизнес-модели облачных вычислений. Однако они также включали идею возможности взаимодействия «облаков». В недавней работе96 этические вопросы облачных вычислений классифицируются по четырем категориям: приватность и безопасность, соответствие требованиям, функциональная этика и воздействие на окружающую среду, что мы уже обсуждали в разделе 3.5. Первая категория касается типичного для нас беспокойства о конфиденциальности данных, вторая — правильного уровня стандартов. Функциональная этика относится к предоставлению услуг, обещанных по контракту. Фактически эти три проблемы связаны с общей «деловой этикой» и применимы независимо от того, используется облако или нет. Последствия использования облачных вычислений в этой области привели к появлению таких относительно недавних проектов, как SafeCloud97, финансируемый Европейским союзом.

На этом этапе Саша может использовать облачные ресурсы для исследований на любом уровне реализации или в любой комбинации, представленной в предыдущих главах. Обеспокоенность в этой связи вызывают лишь данные. Передача собственной информации другим всегда поднимает юридические и этические вопросы, которые нельзя не принимать во внимание. Этические вопросы, связанные с возможным извлечением информации из сохраненных данных, могут и не представлять особой проблемы, если речь идет о личных фото или электронных письмах; но все будет иначе, если

96Faragardi H. (2017) Ethical considerations in cloud computing systems. Proceedings 1:166. https://doi.org/10.3390/IS4SI-2017–04016.

97EASA (2016) SafeClouds.eu Data-driven research addressing aviation safety intelligence. https:// ec.europa.eu/inea/en/horizon-2020/projects/h2020-transport/aviation/safeclouds.eu. По состоянию на 05 апреля 2019 г.

100

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]