Создать базу данных-сервис в AWS Лямбда - PullRequest
0 голосов
/ 21 марта 2020

Я занимаюсь разработкой веб-приложения с использованием java и Spring-boot на AWS Lambda Service. Я проектирую это, чтобы иметь один сервис базы данных. Это будут коллекции классов Entity (таблица) и JPARepositories. Поэтому, если мне нужно внести какие-либо изменения в схему базы данных, мне просто нужно внести изменения только в эту службу.

Другие службы, которые будут доступны через API-шлюз, будут использовать эту службу базы данных в качестве лямбды Уровень.

parent-project 
|
|---database-service
|
|---API-service1
|
|---API-service2
...

Проблема в том, что мне нужно создать таблицы до того, как будет развернута любая служба Lambda. Чтобы эти API-сервисы могли их использовать. Один из способов решения этой проблемы - развернуть службу базы данных как функцию Lambda и вызвать функцию, которая вызовет метод, подобный приведенному ниже, для создания всех таблиц.

@SpringBootApplication
public class DatabaseServiceApplication implements CommandLineRunner {

    private DynamoDBMapper dynamoDBMapper;

    private final AmazonDynamoDB amazonDynamoDB;

    public DatabaseServiceApplication(AmazonDynamoDB amazonDynamoDB) {
        this.amazonDynamoDB = amazonDynamoDB;
    }

    public static void main(String[] args) {
        SpringApplication.run(DatabaseServiceApplication.class, args);
    }

    @Override
        public void run(String... strings) {
            dynamoDBMapper = new DynamoDBMapper(amazonDynamoDB);
            CreateTableRequest tableRequest = dynamoDBMapper
                    .generateCreateTableRequest(Association.class);
            tableRequest.setProvisionedThroughput(
                    new ProvisionedThroughput(1L, 1L));
            TableUtils.createTableIfNotExists(amazonDynamoDB, tableRequest);
        }
}

Или используйте сценарий для создания таблиц , Я не уверен, что лучше или есть лучший вариант.

Может кто-нибудь подсказать мне, сталкивался ли кто-нибудь с этой проблемой ранее и исправил ли она?

Ответы [ 3 ]

2 голосов
/ 21 марта 2020

Для меня лучший способ сделать это на холодном старте Lambda. Ваш код должен быть достаточно умным, чтобы не заботиться о том, что БД уже правильная. Исходя из кода, который вы показываете, я бы сделал что-то в следующем порядке:

public class LambdaExample implements RequestStreamHandler {

    // only called on cold start
    public LambdaExample() {
        dynamoDBMapper = new DynamoDBMapper(amazonDynamoDB);
        CreateTableRequest tableRequest = dynamoDBMapper
                .generateCreateTableRequest(Association.class);
        tableRequest.setProvisionedThroughput(
                new ProvisionedThroughput(1L, 1L));
        TableUtils.createTableIfNotExists(amazonDynamoDB, tableRequest);
    }

    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) {
        // handle request.  this lambda type requires reading the inputStream
        // yourself but use whatever you normally have here.
    }

Если вы используете традиционную реляционную базу данных, вы можете использовать Flyway . Он также знает, обновлена ​​ли БД.

Обратите внимание, что если у вас есть тысячи лямбд, они все будут вызывать это, замедляя холодный запуск каждого из них. Вот почему @MarkB предлагает процесс для экстернализации создания БД, поскольку только самая первая Lambda, которая была запущена, делает что-то полезное. После этого вы тратите немного времени / денег на каждую новую лямбду.

1 голос
/ 21 марта 2020

Поскольку вы развертываете через Terraform, правильный способ сделать это - сделать так, чтобы Terraform также создал таблицы DynamoDB . Вы должны сконфигурировать свои ресурсы aws_lambda_function в Terraform со свойством depends_on, ссылающимся на ресурс aws_dynamodb_table, чтобы Terraform обеспечил создание таблицы перед функциями Lambda.

0 голосов
/ 22 марта 2020

Можете ли вы ответить на следующие вопросы? 1) Развертываете ли вы свое приложение Springboot в Lambda? Если да, это не похоже на хорошее использование Springboot, приложение Springboot должно быть размещено в экземпляре EC2 / ECS, чтобы быть запущенным (24/7). Думайте о лямбде как о функции, которая выполняется для решения простой задачи. Для этого вы можете написать простое приложение Java и развернуть функцию jar to lambda.

2) CloudFormation, TerraForm и другие языки используются для создания инфраструктуры, обычно вы сначала запускаете задание инфраструктуры, а затем развертывание.

Вот ссылка на построенную мной структуру terraform для личного проекта. https://github.com/saifmasadeh/terraform-project-structure

...