У меня есть шаблон стека CloudFormation , который создает ресурс шлюза API, в котором используется метод Type: LAMBDA_PROXY
. Первоначально он отлично работает для доступа к домену root, например https://28af295f439b5f0aef7c7805864ba3981f282e1e.guacchain.com/, но когда я пытаюсь получить доступ к https://28af295f439b5f0aef7c7805864ba3981f282e1e.guacchain.com/about, сетевой запрос возвращает код состояния 500 и ответ {"message": "Internal server error"}
Сгенерированная лямбда-функция имеет следующую политику на основе ресурсов:
{
"Version": "2012-10-17",
"Id": "default",
"Statement": [
{
"Sid": "stack-28af295f439b5f0aef7c7805864ba3981f282e1e-lambdaApiGatewayInvoke-128TRSSUE8WDQ",
"Effect": "Allow",
"Principal": {
"Service": "apigateway.amazonaws.com"
},
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:us-east-1:378688096774:function:lambda-28af295f439b5f0aef7c7805864ba3981f282e1e",
"Condition": {
"ArnLike": {
"AWS:SourceArn": "arn:aws:execute-api:us-east-1:378688096774:bccwb0kvvd/*/*/*"
}
}
}
]
}
При переходе на страницу запроса интеграции шлюза API и простом редактировании поля «Лямбда-функция» (вырезание существующего значения затем вставив его обратно, затем нажав галочку), я получаю это всплывающее окно «Добавить разрешение»:
После нажатия ОК и последующего обновления страницы консоли Lambda, ее базы ресурсов Обновления политики для включения двух, казалось бы, повторяющихся операторов (разница только в поле Sid
):
{
"Version": "2012-10-17",
"Id": "default",
"Statement": [
{
"Sid": "stack-28af295f439b5f0aef7c7805864ba3981f282e1e-lambdaApiGatewayInvoke-128TRSSUE8WDQ",
"Effect": "Allow",
"Principal": {
"Service": "apigateway.amazonaws.com"
},
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:us-east-1:378688096774:function:lambda-28af295f439b5f0aef7c7805864ba3981f282e1e",
"Condition": {
"ArnLike": {
"AWS:SourceArn": "arn:aws:execute-api:us-east-1:378688096774:bccwb0kvvd/*/*/*"
}
}
},
{
"Sid": "d6d795d4-8461-4774-bd6e-ae8d8ea3bcee",
"Effect": "Allow",
"Principal": {
"Service": "apigateway.amazonaws.com"
},
"Action": "lambda:InvokeFunction",
"Resource": "arn:aws:lambda:us-east-1:378688096774:function:lambda-28af295f439b5f0aef7c7805864ba3981f282e1e",
"Condition": {
"ArnLike": {
"AWS:SourceArn": "arn:aws:execute-api:us-east-1:378688096774:bccwb0kvvd/*/*/*"
}
}
}
]
}
После развертывания API Gateway и ожидания около минуты https://28af295f439b5f0aef7c7805864ba3981f282e1e.guacchain.com/about наконец становится доступный. Итак, мой вопрос: что неадекватно исходной политике на основе лямбда-ресурсов, которая запрещает доступ ко всем запросам, кроме /
, в домене? вырезая имя лямбда-функции и вставив его на страницу запроса интеграции, оно не отображается как параметр автозаполнения, в то время как другие отображаются.
Это lambdaIAMRole, который я определил в стеке CloudFormation:
lambdaIAMRole:
Type: 'AWS::IAM::Role'
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Action:
- 'sts:AssumeRole'
Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
Policies:
- PolicyDocument:
Version: 2012-10-17
Statement:
- Action:
- 'logs:CreateLogGroup'
- 'logs:CreateLogStream'
- 'logs:PutLogEvents'
Effect: Allow
Resource:
- !Sub >-
arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/${lambdaFunctionName}:*
PolicyName: lambda
И ресурс лямбда-функции имеет Role: !GetAtt lambdaIAMRole.Arn
как часть своего поля Properties
.