如何使用 cloudformation 创建私有 AWS Api 网关?

Posted

技术标签:

【中文标题】如何使用 cloudformation 创建私有 AWS Api 网关?【英文标题】:How to create a private AWS Api Gateway using cloudformation? 【发布时间】:2020-01-07 04:35:58 【问题描述】:

我正在尝试创建 PRIVATE 类型的 AWS API 网关, 这需要一个资源策略,因为我能够从 AWS 控制台创建网关,所以我拥有该策略, 我想知道如何通过 CF 模板添加资源策略 -

以下是资源策略的swagger定义-

x-amazon-apigateway-policy:
  Version: "2012-10-17"
  Statement:
  - Effect: "Deny"
    Principal: "*"
    Action: "execute-api:Invoke"
    Resource: "arn:aws:execute-api:us-east-1:awsAccountId:xxxx/*/*/*"
    Condition:
      StringNotEquals:
        aws:sourceVpc: "vpc-xxxxx"
  - Effect: "Allow"
    Principal: "*"
    Action: "execute-api:Invoke"
    Resource: "arn:aws:execute-api:us-east-1:xxxx:xxxx/*/*/*"

如何在CF模板中配置-

AWSTemplateFormatVersion: 2010-09-09
Transform: 'AWS::Serverless-2016-10-31'
Description: G2G Api Template Stack

Resources:
   g2gPrivate:
    Type: 'AWS::ApiGateway::RestApi'
    Properties:
      Name: 'private-gw'
      EndpointConfiguration:
        Types:
          - PRIVATE

参考 -https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html

https://medium.com/@cathmgarcia/conditional-resource-policy-on-aws-sam-with-inline-swagger-816ce946dbb

【问题讨论】:

【参考方案1】:

您需要在密钥下提供策略(称为Policy,与Name 处于同一级别。

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-apigateway-restapi.html#cfn-apigateway-restapi-policy

这需要以 JSON 格式提供。

类似...

AWSTemplateFormatVersion: 2010-09-09
Transform: 'AWS::Serverless-2016-10-31'
Description: G2G Api Template Stack

Resources:
   g2gPrivate:
    Type: 'AWS::ApiGateway::RestApi'
    Properties:
      Name: 'private-gw'
      EndpointConfiguration:
        Types:
          - PRIVATE
      Policy: !Sub |
        
          "Version": "2012-10-17",
          "Statement": [
            
              "Effect": "Deny",
              "Principal": "*",
              "Action": "execute-api:Invoke",
              "Resource": "arn:aws:execute-api:us-east-1:$AWS::AccountId:*/*/*/*",
              "Condition": 
                "StringNotEquals": 
                  "aws:sourceVpc": "vpc-xxxxx"
                
              
            ,
            
              "Effect": "Allow",
              "Principal": "*",
              "Action": "execute-api:Invoke",
              "Resource": "arn:aws:execute-api:us-east-1:$AWS::AccountId:*/*/*/*"
            
          ]
        

【讨论】:

如何在策略 JSON 中引用 AWS AccountId 和 APIGateway?有没有办法使用 Sub!获取 AWSAccountId 以及如何在 JSON 中引用相同的网关 ID? 是的,您可以使用 !Sub。我已将示例更新为可以正常工作。 这里有个小问题,在策略里面Resource属性需要ApiId,xxxx部分是API ID,所以在这种情况下我需要先创建网关,然后修改与您共享的策略示例相同的资源? 您可以使用通配符“*”而不是在 Arn 中提供 ApiID,例如 arn:aws:execute-api:us-east-1:$AWS::AccountId:*/*/*/* 这将是安全的,因为该策略与此 API 网关明确关联。 不用担心。是的,一段时间以来,我一直在使用 CloudFormation 和 API Gateway 做很多事情。它大多非常好,但有时,相当令人沮丧!

以上是关于如何使用 cloudformation 创建私有 AWS Api 网关?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Cloudformation 将弹性 IP 附加到 Nat 网关

VPC 内部的 CloudFormation?

如何使用单个 cloudformation 模板创建多个 Elasticbeanstalk 环境

如何使用cloudformation创建ecs集群?

如何使用 CloudFormation 创建 OpsWorks 用户?

如何修复与 AWS::CloudFormation::Init 一起创建 EC2 的 cloudformation 模板