Закрытый шлюз API AWS через конечную точку VPC - PullRequest
3 голосов
/ 28 марта 2019

Прежде всего, я новичок в AWS. Вот что я пытаюсь достичь:

  • 1 VPC
    • 2 Подсеть
      • 1 общедоступный, содержащий некоторый экземпляр EC2
      • 1 приват, который содержит шлюз API, доступный только экземпляру EC2

Публичная подсеть работает отлично, я могу получить доступ к SSH и HTTP. Частная подсеть доставляет мне небольшие неприятности. В целях отладки я запустил в нем экземпляр EC2. С одного из «публичного экземпляра» я могу пропинговать частный IP «частного экземпляра» (ну, очевидно, нет публичного IP)

Следуя документации, я создал конечную точку VPC в своей частной подсети, которая создала сетевой интерфейс, к которому я подключил группу безопасности, которая разрешает HTTP (S) (80 и 443) из всего CIDR VPC. Тип конечной точки: Интерфейс

Итак, теперь у меня есть частная подсеть с конечной точкой, которая разрешает трафик HTTP (S). Эта конечная точка имеет некоторое (частное) имя DNS и (возможно) также частный IP-адрес (не удалось его найти)

Теперь я хочу добавить API-шлюз на переднюю часть лямбды AWS. Я создаю указанный API и в качестве Типа конечной точки -> Частный

После этого: Официальная документация «Единственный» способ «связать» шлюз API с конечной точкой VPC - это добавить политику ресурсов. Поэтому я ввожу следующее

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Deny",
        "Principal": "*",
        "Action": "execute-api:Invoke",
        "Resource": "arn:aws:execute-api:<REGION>:<MY ID>:<API GATEWAY ID>/*/*/<MY RESOURCE>",
        "Condition": {
            "StringNotEquals": {
                "aws:sourceVpce": "<VPC ENDPOINT ID>"
            }
        }
    },
    {
        "Effect": "Allow",
        "Principal": "*",
        "Action": "execute-api:Invoke",
        "Resource": "arn:aws:execute-api:<REGION>:<MY ID>:<API GATEWAY ID>/*/*/<MY RESOURCE>"
    }
]

}

А для полноты вот моя лямбда (python3.6):

from __future__ import division
def lambda_handler(event, context):
  return {
      "statusCode":200,
      "headers": {"Content-Type": "application/json" },
      "body" : "It work!"
  }

Наконец проблема:

Каким будет URL для вызова этого REST Api! API Gateway (в консоли lamdba) Скажите мне это:

https://<API GATEWAY ID>.<REGION>.amazonaws.com/<MY STAGE>/<MY RESOURCE>

Ok! Давайте назовем этот URL: APIURL Я подключаюсь к экземпляру EC2 в публичной подсети и запускаю следующее:

curl https://$APIURL

И это работает: вывод: "Это работает!" но этот APIURL, похоже, не приходит от конечной точки VPC, поэтому я пробую следующее (все еще из общедоступной подсети EC2):

curl https://vpce-XXXXXXX-XXXX.execute-api.REGION.vpce.amazonaws.com/<MY STAGE>/<MY RESOURCE>

И я получаю: {"message": "Запрещено"}

Это не кажется правильным. В процессе тестирования я изменяю политику ресурсов шлюза API для следующего:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Deny",
        "Principal": "*",
        "Action": "execute-api:Invoke",
        "Resource": "arn:aws:execute-api:<REGION>:<MY ID>:<API ID>/*/*/<MY RESOURCE>"
    }
]

} * * тысяча пятьдесят-один

И НИЧЕГО не изменилось. APIURL все еще работает, а URL VPCE по-прежнему запрещен.

Что я делаю не так? Мои извинения за длинный пост.

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Обновление роли политики не вступает в силу до тех пор, пока API-интерфейс не будет развернут на этапе.

https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-resource-policies-create-attach.html

Если вы обновите политику ресурсов после создания APIвам потребуется развернуть API для распространения изменений после того, как вы прикрепите обновленную политику.

0 голосов
/ 29 марта 2019

Поскольку ваш URL-адрес API работает нормально, похоже, проблема в политике.
В политике IAM Запретить разрешение переопределит разрешение Разрешить .Попробуйте изменить свою политику следующим образом:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "arn:aws:execute-api:region:account-id:api-id/*",
            "Condition": {
              "StringEquals":{
                             "aws:SourceVpce": "<VPC Endpoint ID>"
                         }
                       }
                    ]
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "arn:aws:execute-api:region:account-id:api-id/*"
            ],
            "Condition" : {
                "StringNotEquals": {
                    "aws:SourceVpce": "<VPC Endpoint ID>"
                }
            }
        }
    ]
}

Для получения дополнительной ссылки перейдите по этой ссылке:
https://aws.amazon.com/blogs/compute/introducing-amazon-api-gateway-private-endpoints/

...