Як працювати з AWS Lambda з Elasticache і DynamoDB

З лютого місяця 2016 року сервіс AWS Lambda отримав можливість доступу до ресурсів усерединіVirtual Private Cloud, але за замовчуванням усі лямбды працюють поза VPC. Оскільки ця можливість з'явилася відносно недавно і статей, як це реалізувати, не так багато, ми хотіли б поділитися з вами своїм досвідом.

Ми розробили мобільний додаток, побудоване на AWS. Сервіс Lambda відмінно підійшов для написання невеликої серверної логіки, до того ж легко масштабується.

Завдання лямбда була поставлена досить тривіальна: виконувати запит до DynamoDB і найпопулярніші запити кешувати, використовуючи Elasticache. Проблема, з якою ми зіткнулися, пов'язана з налаштуванням доступу з VPC до внутрішніх і зовнішніх ресурсів Amazon.

В нашому випадку було необхідно забезпечити доступність сервісу Elasticache (VPC) і DynamoDB (поза VPC). Для досягнення цієї мети в VPC була розгорнута структура, яка представлена на схемі:

Структурна схема VPC

Далі наводиться інструкція, як з AWS Console створити таку схему роботи VPC.

Налаштування VPC
Для початку необхідно створити VPC, якщо ще цього не зробили. Створити дві підмережі (Subnets) публічну і приватну.

Другим кроком буде створення таблиць маршрутизації (Route Tables). За замовчуванням у вас вже створена одна main таблиця, вона буде виконувати роль приватної таблиці. Залишається тільки створити публічну таблицю. При створенні необхідно вказати наш VPC.

Для кожної кожній підмережі (публічної і приватної) виберіть відповідну їй таблицю маршрутизації.

Далі створюємо шлюз (internet gateway), який забезпечить доступ до всіх сервісів поза VPC і до зовнішніх адресами в цілому. Після аттачим створений шлюз до нашого VPC. Також створюємо NAT-шлюз, який прикріплюємо до публічної підмережі.

І після всього залишається тільки налаштувати таблиці маршрутизації:

  • Створюємо маршрут до публічної таблиці для створеного інтернет шлюзу. Приклад:
Публічна таблиця маршрутизації

  • Створюємо маршрут у приватній таблиці NAT. Приклад:
Приватна таблиця маршрутизації

Налаштування Elasticache

В нашому прикладі розглянемо підключення Elasticache до приватної мережі. Для цього в панелі Elasticache створимо групу для приватної мережі (Cache Subnet Group). І далі при створенні кластера вказуємо створену групу.

Після всього залишається тільки в панелі VPC знайти групу у Security Groups для нашої VPC (створюється автоматично) і додати правило для порту нашого кластера (redis за замовчуванням — 6379; memcached — 11211). Приклад:

Правила для security group

Давайте перевіримо як це все у нас полетить. У налаштуваннях лямбды вибираємо VPC і приватну мережу. Запускаємо код:

from __future__ import print_function
import json
import boto3
import decimal
import logging
import elasticache_auto_discovery
from pymemcache.client.hash import HashClient

CACHE_ENDPOINTS = 'exaplecache.wjbxgg.cfg.euw1.cache.amazonaws.com:11211'


def decimal_default(obj):
if isinstance(obj, decimal.Decimal):
return float(obj)
raise TypeError


def lambda_handler(event, context):
nodes_endpoints = elasticache_auto_discovery.discover(CACHE_ENDPOINTS)
nodes = map(lambda x: (x[1], int(x[2])), nodes_endpoints)
memcache_client = HashClient(nodes, timeout=60, connect_timeout=2)

table = boto3.resource('dynamodb').Table('Photo')
response = table.scan(Limit=20)
memcache_client.set('example', json.dumps(response['Items'], default=decimal_default))

cache_elements = memcache_client.get('example')

if json.loads(cache_elements) == response['Items']:
return "It works!"
else:
return "doesn't work"


І після запуску побачимо заповітний результат:
image

Висновок
Робота з сервісами Amazon поза і всередині VPC відкриває багато можливостей використання AWS Lambda. Представлену у цій статті схему налаштувань для VPC можна використовувати як універсальне рішення, для забезпечення доступу до будь-яким іншим сервісам всередині і поза VPC.

Корисні посилання:
Lambda in VPC
Your VPC and Subnets
Getting Started with Amazon ElastiCache
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.