如何创建在 Python CDK 中引用自身的 API Gateway 资源策略?
Posted
技术标签:
【中文标题】如何创建在 Python CDK 中引用自身的 API Gateway 资源策略?【英文标题】:How to create API Gateway Resource Policy that references itself in the Python CDK? 【发布时间】:2020-04-07 00:31:46 【问题描述】:我正在创建一个 API,它将仅通过使用具有 GitHub IP 的资源策略来接受来自 GitHub Webhook 服务器的请求。我已使用控制台成功完成此操作并手动创建了资源策略,但在使用 CDK 时遇到了问题。
这是我的代码:
delete_trigger_integration = aws_apigateway.LambdaIntegration(
trigger_step_lambda, proxy=False, integration_responses=[])
api_policy_document = aws_iam.PolicyDocument()
api = aws_apigateway.RestApi(
self,
"GithubWebhookApi",
rest_api_name=PROJECT_NAME + "-apigateway-trigger-delete",
default_integration=delete_trigger_integration,
policy=api_policy_document)
delete_execution_resource = api.root.add_resource("execution")
delete_execution_method = delete_execution_resource.add_method(
"POST", delete_trigger_integration)
delete_execution_resource.add_cors_preflight(allow_origins=["*"])
create_repo_lambda.add_environment("API_URL",
delete_execution_resource.url)
api_policy_document.add_statements(
aws_iam.PolicyStatement(
effect=aws_iam.Effect.ALLOW,
principals=[aws_iam.AnyPrincipal()],
actions=["execute-api:Invoke"],
resources=[api.arn_for_execute_api()]))
api_policy_document.add_statements(
aws_iam.PolicyStatement(
effect=aws_iam.Effect.DENY,
actions=["execute-api:Invoke"],
conditions=
"NotIpAddress":
"aws:SourceIp": [
"192.30.252.0/22", "185.199.108.0/22",
"140.82.112.0/20"
]
,
principals=[aws_iam.AnyPrincipal()],
resources=[api.arn_for_execute_api()]))
我觉得我非常接近找到解决方案,但我不知道它是什么。上面代码的问题是我在尝试部署它时收到ValidationError: Circular dependency between resources
错误 - 我可以理解,资源策略正在解决它内部的资源。但我在 CDK 中找不到解决方法。
对于其他资源,在创建后使用 aws_iam.add_to_role_policy
广告 IAM 策略非常容易,但我在 CDK 中找不到 RestApi
类的等效项。当您声明 RestApi
时,您似乎必须添加 PolicyDocument
。
另外,这是我试图在 CDK 中重新创建的资源策略(导致问题的正是那些资源 ARN):
"Version": "2012-10-17",
"Statement": [
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:eu-west-1:000000000000:aaaaaaaaaa/*/*/*"
,
"Effect": "Deny",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:eu-west-1:000000000000:aaaaaaaaaa/*/*/*",
"Condition":
"NotIpAddress":
"aws:SourceIp": [
"192.30.252.0/22",
"185.199.108.0/22",
"140.82.112.0/20"
]
]
有人知道我的问题的解决方案吗?提前致谢!
此外,您可以忽略空的集成响应 - 我仍在努力。
【问题讨论】:
似乎该策略也必须在CF的AWS::ApiGateway::RestApi
资源中定义,文档建议使用!Join
见docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…,你试过吗? resources=[core.Fn.Join('', ['execute-api:/', '*'])]
@jogold 不,我没有尝试过,但看起来确实有可能。让我试一试,谢谢!
@jogold 嘿,它成功了,谢谢!随意在这里发布解决方案 - 否则我会在几天后在这里写出来:)
非常感谢!
【参考方案1】:
这与底层 CloudFormation 资源的工作方式有关。
由于Policy
必须在AWS::ApiGateway::RestApi
资源中定义,它不能引用自身。
来自documentation:
要为策略设置 ARN,请使用
!Join
内部函数,将""
作为分隔符,并使用"execute-api:/"
和"*"
的值。
在您的 CDK 代码中转换为以下内容:
resources=[core.Fn.join('', ['execute-api:/', '*'])]
【讨论】:
如果你想限制对特定资源和方法的访问,你可以使用字符串(跳过加入的东西)execute-api:/stage-name/GET/pets
,per docs.aws.amazon.com/apigateway/latest/developerguide/…
python 连接中的小写 j以上是关于如何创建在 Python CDK 中引用自身的 API Gateway 资源策略?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 AWS CDK 创建的 Python Lambda 函数中安装外部模块?
在 Amazon CDK 中引用 TableStreamArn