Прежде всего, я новичок в 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 по-прежнему запрещен.
Что я делаю не так? Мои извинения за длинный пост.