У меня есть lambda function
, который отправляет следующий запрос для получения идентификаторов всех экземпляров внутри региона:
ec2_client = boto3.client('ec2', os.environ['region'])
response = ec2_client.describe_instances(Filters=[{'Name':'instance-state-name', 'Values': ['pending', 'running','shutting-down','stopping','stopped'],}])
Лямбда также отправляет запрос get API REST, установленному внутри VPC, и этот API не открыт для Интернета:
resp = requests.get(os.environ['apidsi']+'/persons/emails')
Я помещаю свою лямбда-функцию в VPC, чтобы я мог запрашивать API, но когда я это делаю, лямбда-тайм-аут истекает, и она не получает доступа к экземплярам EC2 внутри других VPC. Роль IAM имеет все необходимые разрешения:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Effect": "Allow",
"Action": [
"ecs:*",
"ec2:*",
"s3:*",
"autoscaling:*",
"cloudwatch:*",
"dynamodb:*"
],
"Resource": "*"
}
]
}
Группа безопасности в порядке, я думаю. Итак, подведем итог:
- Когда я помещаю лямбда-функцию в VPC: я могу получить доступ к
API REST
, но не к ресурсам VPC, лямбда-тайм-аут
- Когда я не помещаю лямбда-функцию в VPC, функция получает всю информацию о ресурсах VPC, но не может получить доступ к API REST: также время ожидания.
Как решить эту проблему ??
Для информации: я назначил общедоступную подсеть для своей функции Lambda. К этой общедоступной подсети подключен Internet Gateway
, и он находится в том же VPC, что и экземпляр, на котором размещен API REST.