Создание WebView приложения на базе AWS ApiGateway и AWS Lambda
За прошедший год существования на просторах сети накопилось большое количество туториалов по созданию serverless API на базе сабжа. В данной статье я хочу рассказать об еще одном варианте использования API Gateway, который в частности можно использовать в качестве backend для WebView приложения.
Осторожно, много скриншотов!
Disclaimer!
Это всего лишь концепт, поэтому не следует его рассматривать как рабочий вариант использования. В конце прилагается ссылка на github, если Вы не захотите проходить по всем этапам вручную, а также на записанный мной видеоролик, поэтому не удивляйтесь, что многие моменты я пропущу.
Подготовка данных
Начнем с того, что у нас есть простейшая модель данных:
User: id = 'string' name = 'string'
В качестве источника данных я решил использовать S3 для наглядности. Создаем JSON файлы с содержимым типа:
{
"id":"1",
"name":"George"
}
В качестве движка рендеринга шаблонов я буду использовать сам Python. Темплейты представляют собой HTML файлы вида
base.tpl
Base view
{body}
user.tpl
{id} {name}
После создания данных заливаю все на бакет с соответствующими префиксами (каталогами):
![image](https://habrastorage.org/files/da1/c21/e1c/da1c21e1c5db47c68cb31d1e333d377e.png)
Создание функции в AWS Lambda
В консоли AWS создаем Lambda функцию, используя blueprint hello-world-python.
![image](https://habrastorage.org/files/e9e/0de/023/e9e0de02363d4cc1970bf874c2391c82.png)
Используемой IAM роли необходимо предварительно добавить policy на доступ к S3.
Создание API
Переходим в консоль API Gateway и создаем API следующего вида:
![85108a45cbc348a48cd582d24caaeeac.png](https://habrastorage.org/files/851/08a/45c/85108a45cbc348a48cd582d24caaeeac.png)
![93316bf9818642c8bf916b58a3e3ae29.png](https://habrastorage.org/files/933/16b/f98/93316bf9818642c8bf916b58a3e3ae29.png)
![c04498773bbe48b0b4c0ced83e3b651c.png](https://habrastorage.org/files/c04/498/773/c04498773bbe48b0b4c0ced83e3b651c.png)
Обратите внимание на mapping template — он описывает event, отдаваемый лямбде.
Далее описываем маппинг и content-type для отдаваемых с API Gateway данных. Деплоим два stage — production и development, прописываем в каждом из них stage variable lamdbdaAlias и пока про API Gateway забываем.
![fc3af60dd6e149c2bba99f0b6d17e451.png](https://habrastorage.org/files/fc3/af6/0dd/fc3af60dd6e149c2bba99f0b6d17e451.png)
Работа с AWS Lambda
Далее возвращаемся к созданной лямбде и добавляем следующий код:
from __future__ import print_function
import json
import boto3
s3_client = boto3.client("s3")
def get_template(filename):
response = s3_client.get_object(
Bucket='config-data-bucket',
Key='template/{}'.format(filename)
)
return response['Body'].read()
def get_objects_list():
return [json.loads(
s3_client.get_object(
Bucket='config-data-bucket', Key=item['Key']
)['Body'].read()
) for item in s3_client.list_objects_v2(
Bucket='config-data-bucket', Prefix='data'
)['Contents'] if item['Key'].endswith('.json')]
def get_object(id):
response = s3_client.get_object(
Bucket='config-data-bucket',
Key='data/{}.json'.format(id)
)
return json.load(response['Body'])
def lambda_handler(event, context):
print "Event received"
resource = event['path_params']['resource']
method = event['http_method']
id = event['path_params'].get('id')
if resource == 'user' and method=="GET":
base_template = get_template('base.tpl')
user_template = get_template('user.tpl')
if id:
user = get_object(id)
return base_template.format(
body=user_template.format(id=user['id'], name=user['name'])
)
else:
users = get_objects_list()
return base_template.format(
body="".join(
user_template.format(id=user['id'], name=user['name']) for user
in users)
)
После этого публикуем лямбду и создаем два алиаса к ней — production и development:
![e739a96093bc44d592076f82acea2035.png](https://habrastorage.org/files/e73/9a9/609/e739a96093bc44d592076f82acea2035.png)
Все, мы получили вполне себе рабочий проект:
![8cd8c5f299bb4c5e889318fa943b739f.png](https://habrastorage.org/files/8cd/8c5/f29/8cd8c5f299bb4c5e889318fa943b739f.png)
Видеоролик:
Github:
aws webview