AWS API Gateway REST API 是不是没有设置来禁用 CloudFormation 模板中的 execute-api 端点?

Posted

技术标签:

【中文标题】AWS API Gateway REST API 是不是没有设置来禁用 CloudFormation 模板中的 execute-api 端点?【英文标题】:Is there no setting for AWS API Gateway REST API to disable execute-api endpoint in CloudFormation template?AWS API Gateway REST API 是否没有设置来禁用 CloudFormation 模板中的 execute-api 端点? 【发布时间】:2021-04-14 03:17:43 【问题描述】:

我已经使用 CloudFormation 模板设置了 API Gateway(v1,而不是 v2)REST API 资源。最近我注意到还创建了默认的execute-api端点,我可以在设置中禁用它。

这个 API 的类型是AWS::ApiGateway::RestApi

当然,我希望通过模板来完成,所以问题是:是否可以在 CloudFormation 模板中定义此设置,而不是在 AWS 控制台中手动单击?此选项可用适用于 APIGateway V2 API 资源 (AWS::ApiGatewayV2::Api),但不适用于 CloudFormation 模板中的 APIGateway V1 REST API 资源 (AWS::ApiGateway::RestApi),即使它可以手动更改为 APIGateway控制台中的 V1 REST API。

对于AWS::ApiGateway::RestApi,还有一个CLI way of doing this。

以下是我用来搜索此设置的一些链接:AWS::ApiGatewayV2::APIAWS::ApiGateway::RestApiDisabling default api-execute endpoint via CLI

【问题讨论】:

根据documentation,Cloudformation 定义不支持它。但是RestAPI Create Call 中有一个选项。如果您真的想在 CFN 中执行此操作,可以利用 Running bash commands in AWS CloudFormation templates 【参考方案1】:

AWS::ApiGateway::RestApi cloudformation:DisableExecuteApiEndpoint最近添加了对禁用默认 execute-api 端点的支持

MyRestApi:
  Type: 'AWS::ApiGateway::RestApi'
  Properties:
    DisableExecuteApiEndpoint: true

【讨论】:

【参考方案2】:

您可以通过简单的custom resource 禁用它。下面是一个这样的完全工作模板的例子:


Resources:

  MyRestApi:
    Type: 'AWS::ApiGateway::RestApi'
    Properties:
      Description: A test API
      Name: MyRestAPI


  LambdaBasicExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Statement:
        - Effect: Allow
          Principal:
            Service: lambda.amazonaws.com
          Action: sts:AssumeRole
      Path: /
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonAPIGatewayAdministrator
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

  MyCustomResource:
    Type: Custom::DisableDefaultApiEndpoint
    Properties:
      ServiceToken: !GetAtt 'MyCustomFunction.Arn'
      APIId: !Ref 'MyRestApi'

  MyCustomFunction:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.lambda_handler
      Description: "Disable default API endpoint"
      Timeout: 30
      Role: !GetAtt 'LambdaBasicExecutionRole.Arn'
      Runtime: python3.7
      Code:
        ZipFile: |
          import json
          import logging
          import cfnresponse
          import boto3
          
          logger = logging.getLogger()
          logger.setLevel(logging.INFO)

          client = boto3.client('apigateway')

          def lambda_handler(event, context):
            logger.info('got event '.format(event))  
            try:

              responseData = 

              if event['RequestType'] in ["Create"]:                      
                
                APIId = event['ResourceProperties']['APIId']                
                
                response = client.update_rest_api(
                    restApiId=APIId,
                    patchOperations=[
                        
                            'op': 'replace',
                            'path': '/disableExecuteApiEndpoint',
                            'value': 'True'
                        
                    ]
                )

                logger.info(str(response))

                cfnresponse.send(event, context, 
                                 cfnresponse.SUCCESS, responseData)

              else:
                logger.info('Unexpected RequestType!') 
                cfnresponse.send(event, context, 
                                  cfnresponse.SUCCESS, responseData)

            except Exception as err:

              logger.error(err)
              responseData = "Data": str(err)
              cfnresponse.send(event,context, 
                               cfnresponse.FAILED,responseData)
            return              

【讨论】:

@MarceliWac 没问题。很高兴它成功了:-)【参考方案3】:

如果有人偶然发现这个使用 CDK 的答案,可以使用 AwsCustomResource 构造简洁地完成(无需定义 Lambda 函数):

const restApi = new apigw.RestApi(...);
const executeApiResource = new cr.AwsCustomResource(this, "execute-api-resource", 
  functionName: "disable-execute-api-endpoint",
  onCreate: 
    service: "APIGateway",
    action: "updateRestApi",
    parameters: 
      restApiId: restApi.restApiId,
      patchOperations: [
        op: "replace",
        path: "/disableExecuteApiEndpoint",
        value: "True"
      ]
    ,
    physicalResourceId: cr.PhysicalResourceId.of("execute-api-resource")
  ,
  policy: cr.AwsCustomResourcePolicy.fromStatements([new iam.PolicyStatement(
    effect: iam.Effect.ALLOW,
    actions: ["apigateway:PATCH"],
    resources: ["arn:aws:apigateway:*::/*"],
  )])
);
executeApiResource.node.addDependency(restApi);

【讨论】:

【参考方案4】:

您可以在 AWS CDK 中禁用它。这是通过找到 CloudFormation 资源并将其设置为 true 来完成的。

   const api = new apigateway.RestApi(this, 'api', );
   (api.node.children[0] as apigateway.CfnRestApi).addPropertyOverride('DisableExecuteApiEndpoint','true')

【讨论】:

以上是关于AWS API Gateway REST API 是不是没有设置来禁用 CloudFormation 模板中的 execute-api 端点?的主要内容,如果未能解决你的问题,请参考以下文章

AWS API Gateway REST API 是不是没有设置来禁用 CloudFormation 模板中的 execute-api 端点?

无服务器框架 AWS REST API Gateway - 403 CORS 错误

如何保护 AWS Gateway REST API 可通过可公开访问的网页进行访问 (React)

如何将接收到的(承载)访问令牌传递给生成的 REST 客户端,以调用安全的 API-Gateway 端点

在 AWS 中运行 spring boot 应用程序并且只允许通过 AWS API Gateway 访问

terraform - 从文件中定义 aws api 网关请求参数?