首先,我是AWS的新手。 这是我想要实现的目标:
公共子网运行良好,我可以访问SSH和HTTP。 专用子网给我带来了一些麻烦。为了调试,我在其中启动了一个EC2实例。从一个“公共实例”中,我可以ping通“私有实例”的私有IP(显然没有公共IP)
根据文档,我在专用子网中创建了一个VPC端点,该端点创建了一个网络接口,在该接口中,我附加了一个安全组,该安全组允许整个VPC CIDR中的HTTP(S)(80和443)。端点类型为接口
因此,现在我有一个带有允许HTTP(S)流量的端点的专用子网。该端点具有一些(私有)DNS NAME,并且(可能)还有一个私有IP(找不到)
现在,我想添加一个API网关来添加一些AWS lambda。 我创建了上述API,并将其作为端点类型->私有
此之后:Official Documentation 将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>"
}
]
}
为了完整起见,这里是我的lambda(python3.6):
from __future__ import division
def lambda_handler(event, context):
return {
"statusCode":200,
"headers": {"Content-Type": "application/json" },
"body" : "It work!"
}
最后一个问题:
调用此REST Api的URL是什么! API网关(在lamdba控制台中)告诉我:
https://<API GATEWAY ID>.<REGION>.amazonaws.com/<MY STAGE>/<MY RESOURCE>
好!让我们调用该网址:APIURL 我在公共子网中SSH到EC2实例并运行以下命令:
curl https://$APIURL
工作正常:输出:“工作正常!”但是该APIURL似乎不是来自VPC端点,因此我尝试了以下操作(仍然来自公共子网EC2):
curl https://vpce-XXXXXXX-XXXX.execute-api.REGION.vpce.amazonaws.com/<MY STAGE>/<MY RESOURCE>
我得到:{“ message”:“ Forbidden”}
这似乎不正确。在测试时,我更改了以下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仍然有效,VPCE Url仍然禁止我访问。
我在做什么错?我很长的道歉。
答案 0 :(得分:1)
在将api部署到阶段之前,策略角色更新不会生效。
如果在创建API后更新资源策略,则需要在附加更新的策略后部署API来传播更改。
答案 1 :(得分:0)
由于您的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/