aws ресурсный лимит api - как разделить стеки на RestApi - PullRequest
0 голосов
/ 16 января 2020

, так как я использую aws -cdk для определения aws стеков, я сталкиваюсь здесь с некоторыми ограничениями и не знаю, как это решить.

Прежде всего, есть не -изменяемый лимит на ресурсы 200 на стек. это означает, что каждый стек, который используется в облачной информации, ограничен 200.

В течение длительного времени это не было проблемой, так как было легко создать стек, содержащий несколько разных стеков разного использования (S3, ApiGateway, IoT и т. Д. c.)

Теперь я сталкиваюсь с проблемой, что APIGatewayStack (для RestApi) превышает ограничение в 200 ресурсов и я больше не могу развертываться.

Я уже отделил лямбды от конечных точек, поэтому у меня нет никакого потенциала получить здесь некоторые ресурсы.

Моя идея заключалась в создании CfnOutput для RestApi или его root Resourse, поэтому я может создать любой объект Restapi с

подход № 1 - создать RestApi из RestApiId

Stack # 1

const outputGm = new CfnOutput(this, 'RestApiGatewayId', {
         description: 'RestApiGatewayId',
         value: api.restApiId,
         // This Name must be unique
         exportName: 'RestApiGatewayId',
      });

Stack # 2

const api = RestApi.fromRestApiId(this, 'rest-api-extension', 'RestApiGatewayId');

проблема здесь в том, что API теперь относится к типу IRestApi, который не может использоваться для дальнейших необходимых модификаций, таких как

const models = new ModelDefinitions.ModelDefinitions(api);
// Argument of type 'IRestApi' is not assignable to parameter of type 'RestApi'.

ИЛИ

const notifications = api.root.addResource('notifications');
// Property 'root' does not exist on type 'IRestApi'.

Подход № 2 - создать вывод root Ресурс

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

const api = RestApi.fromRestApiId(this, 'rest-api-extension', 'RestApiGatewayId');
const resourceProps: ResourceProps = {
         parent: api,
         /* 
          * Type 'IRestApi' is missing the following properties from type 'IResource': restApi, resourceId, path, resourceForPath, and 5 more.
          */
         pathPart: 'root',
      };
const root = new Resource(apiGWStack, 'root-node', resourceProps);
// apiGWStack is the original stack which i am passing to the extension via:

const apiGatewayExtensionStack = new ApiGatewayExtensionStack(app, 'ApiGatewayExtensionStack', apiGWStack, { env: environment });

Чего мне здесь не хватает ? Я не хочу использовать второй (или третий в будущем) отдельный Rest-Api, потому что он имеет много конечных точек.

Видите ли вы здесь какое-либо решение по этому поводу? Как вы справляетесь с Big Api Structures на AWS?

Спасибо за помощь!

1 Ответ

1 голос
/ 17 января 2020

Хорошо, поэтому aws не увеличивает этот лимит ресурсов Cloudformation. Также вы не можете сделать вложенный стек Rest-Api, так как нет способа подключения.

Но я не мог принять тот факт, что нет никакого решения. Я вспомнил, что вы можете использовать ngx_http_proxy_module в nginx для обслуживания контента с другого сервера. Поэтому я проверил, работает ли это также с aws -шлюзом.

И даже лучше, его можно использовать для нескольких вариантов использования:

(Обратите внимание, что я удалил все ссылки на ssl-сертификат в этом файле)

/ etc / nginx / sites-available / yourdomain.tld.conf


# server configuration
#
server {

    root /var/www/html;

    index index.html index.htm index.nginx-debian.html;

    server_name yourdomain.tld;

    add_header "Allow" "GET, POST, HEAD, PUT, DELETE" always;
    add_header "Access-Control-Allow-Methods" "GET, POST, PUT, DELETE, OPTIONS" always;

    #
    # Default Location will be mapped to proxy_set_header HOST  
    # API #1 - simple forwarding on aws-gateway

    location / {
        proxy_next_upstream     error timeout invalid_header http_500;                  
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass https://abcdefghij.execute-api.eu-central-1.amazonaws.com/prod/;
        proxy_set_header Host "abcdefghij.execute-api.eu-central-1.amazonaws.com";
        proxy_ssl_server_name on;

    }

    #
    # Location /admin and nested below will be mapped to proxy_set_header HOST  
    # API #2 - speficic slug forwarding on on aws-gateway

    location /admin {
        proxy_next_upstream     error timeout invalid_header http_500;          
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass https://zyxwvutsrq.execute-api.eu-central-1.amazonaws.com/prod/;
        proxy_set_header Host "zyxwvutsrq.execute-api.eu-central-1.amazonaws.com";
        proxy_ssl_server_name on;
    }

    #
    # Location /users and nested below will be mapped to proxy_set_header HOST  
    # API #3 - specific slug mapping to specific slug on aws-gateway

    location /users {
        proxy_next_upstream     error timeout invalid_header http_500;          
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass https://ababababab.execute-api.eu-central-1.amazonaws.com/prod/users;
        proxy_set_header Host "ababababab.execute-api.eu-central-1.amazonaws.com";
        proxy_ssl_server_name on;
    }
}

server {

    if ($host = yourdomain.tld) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    server_name yourdomain.tld;
    listen 80;
    return 404; # managed by Certbot
}

До:

Сейчас:

Немного больше работы по сопровождению, если у вас есть

  • разработка
  • подготовка
  • рабочий сервер

, так как вам может потребоваться обновить все conf-файлы при появлении новых конечных точек, но таким образом вы также выиграете от обслуживания REST-Api с хорошим URL-адресом

https://yourdomain.tld вместо этих https://ababababab.execute-api.eu-central-1.amazonaws.com/prod/

...