我如何配置我的AWS定制域以解析为为我的VPC配置的lambda?

问题描述 投票:0回答:1

正在做什么:

使用serverless framework

  • 我已经配置了AWS VPC
  • 我配置了一个Amazon Aurora数据库对于我的VPC
  • 我有一个为我配置的AWS API Gateway lambdaVPC
  • 当我部署lambda时,我可以通过AWS 公开地访问它生成的网址:XXX.execute-api.us-east-1.amazonaws.com/my-path
  • 在我的Lambda中,我运行了一个非常简单的查询,证明我可以连接到我的数据库。

这一切都很好。

什么不起作用:

  • 我已经在AWS / Route 53中注册了一个域并添加了证书(例如* .foo.com)

  • 我使用serverless-domain-manager plugin使我的lambda可通过我的域使用(例如,api.foo.com/my-path解析为XXX.execute-api.us-east-1.amazonaws .com / my-path

如果我的lambda为我的VPC配置了[[NOT,则此方法很好用

但是,当为我的VPC配置lambda

IS

时,自定义域api.foo.com/my-path不会解析为XXX.execute-api.us-east-1.amazonaws。 com / my-path我换句话说:我可以

NOT

公开访问api.foo.com/my-path

我需要的是:

1-

XXX.execute-api.us-east-1.amazonaws.com/my-path可用公开(有效)

2-

我的自定义域api.foo.com/my-path指向SAME lambda,名称为XXX.execute-api.us-east-1.amazonaws.com / my-path(在我的VPC中)并且可以公开使用(不起作用。我得到:{“ message”:“ Forbidden”})]

virtual-private-cloud.yml

service: virtual-private-cloud provider: name: aws region: us-east-1 stage: ${opt:stage, dev} custom: appVersion: 0.0.0 VPC_CIDR: 10 resources: Resources: ServerlessVPC: Type: AWS::EC2::VPC Properties: CidrBlock: ${self:custom.VPC_CIDR}.0.0.0/16 EnableDnsSupport: true EnableDnsHostnames: true InstanceTenancy: default ServerlessSubnetA: DependsOn: ServerlessVPC Type: AWS::EC2::Subnet Properties: VpcId: Ref: ServerlessVPC AvailabilityZone: ${self:provider.region}a CidrBlock: ${self:custom.VPC_CIDR}.0.0.0/24 ServerlessSubnetB: DependsOn: ServerlessVPC Type: AWS::EC2::Subnet Properties: VpcId: Ref: ServerlessVPC AvailabilityZone: ${self:provider.region}b CidrBlock: ${self:custom.VPC_CIDR}.0.1.0/24 ServerlessSubnetC: DependsOn: ServerlessVPC Type: AWS::EC2::Subnet Properties: VpcId: Ref: ServerlessVPC AvailabilityZone: ${self:provider.region}c CidrBlock: ${self:custom.VPC_CIDR}.0.2.0/24 Outputs: VPCDefaultSecurityGroup: Value: Fn::GetAtt: - ServerlessVPC - DefaultSecurityGroup Export: Name: VPCDefaultSecurityGroup-${self:provider.stage} SubnetA: Description: 'Subnet A.' Value: !Ref ServerlessSubnetA Export: Name: vpc-subnet-A-${self:provider.stage} SubnetB: Description: 'Subnet B.' Value: !Ref ServerlessSubnetB Export: Name: vpc-subnet-B-${self:provider.stage} SubnetC: Description: 'Subnet C.' Value: !Ref ServerlessSubnetC Export: Name: vpc-subnet-C-${self:provider.stage}

database-service.yml

service: database-service provider: name: aws region: us-east-1 stage: ${opt:stage, dev} environment: stage: ${opt:stage, dev} plugins: - serverless-plugin-ifelse custom: appVersion: 0.0.1 AURORA: DB_NAME: database${self:provider.stage} USERNAME: ${ssm:/my-db-username~true} PASSWORD: ${ssm:/my-db-password~true} HOST: Fn::GetAtt: [AuroraRDSCluster, Endpoint.Address] PORT: Fn::GetAtt: [AuroraRDSCluster, Endpoint.Port] serverlessIfElse: - If: '"${opt:stage}" == "prod"' Set: resources.Resources.AuroraRDSCluster.Properties.EngineMode: provisioned ElseSet: resources.Resources.AuroraRDSCluster.Properties.EngineMode: serverless resources.Resources.AuroraRDSCluster.Properties.ScalingConfiguration.MinCapacity: 1 resources.Resources.AuroraRDSCluster.Properties.ScalingConfiguration.MaxCapacity: 4 ElseExclude: - resources.Resources.AuroraRDSInstanceParameter - resources.Resources.AuroraRDSInstance resources: Resources: AuroraSubnetGroup: Type: AWS::RDS::DBSubnetGroup Properties: DBSubnetGroupDescription: "Aurora Subnet Group" SubnetIds: - 'Fn::ImportValue': vpc-subnet-A-${self:provider.stage} - 'Fn::ImportValue': vpc-subnet-B-${self:provider.stage} - 'Fn::ImportValue': vpc-subnet-C-${self:provider.stage} AuroraRDSClusterParameter: Type: AWS::RDS::DBClusterParameterGroup Properties: Description: Parameter group for the Serverless Aurora RDS DB. Family: aurora5.6 Parameters: character_set_database: "utf32" AuroraRDSCluster: Type: "AWS::RDS::DBCluster" Properties: MasterUsername: ${self:custom.AURORA.USERNAME} MasterUserPassword: ${self:custom.AURORA.PASSWORD} DBSubnetGroupName: Ref: AuroraSubnetGroup Engine: aurora EngineVersion: "5.6.10a" DatabaseName: ${self:custom.AURORA.DB_NAME} BackupRetentionPeriod: 3 DBClusterParameterGroupName: Ref: AuroraRDSClusterParameter VpcSecurityGroupIds: - 'Fn::ImportValue': VPCDefaultSecurityGroup-${self:provider.stage} # this is needed for non-serverless mode AuroraRDSInstanceParameter: Type: AWS::RDS::DBParameterGroup Properties: Description: Parameter group for the Serverless Aurora RDS DB. Family: aurora5.6 Parameters: sql_mode: IGNORE_SPACE max_connections: 100 wait_timeout: 900 interactive_timeout: 900 # this is needed for non-serverless mode AuroraRDSInstance: Type: "AWS::RDS::DBInstance" Properties: DBInstanceClass: db.t2.small DBSubnetGroupName: Ref: AuroraSubnetGroup Engine: aurora EngineVersion: "5.6.10a" PubliclyAccessible: false DBParameterGroupName: Ref: AuroraRDSInstanceParameter DBClusterIdentifier: Ref: AuroraRDSCluster Outputs: DatabaseName: Description: 'Database name.' Value: ${self:custom.AURORA.DB_NAME} Export: Name: DatabaseName-${self:provider.stage} DatabaseHost: Description: 'Database host.' Value: ${self:custom.AURORA.HOST} Export: Name: DatabaseHost-${self:provider.stage} DatabasePort: Description: 'Database port.' Value: ${self:custom.AURORA.PORT} Export: Name: DatabasePort-${self:provider.stage}

outage-service.yml

service: outage-service package: individually: true plugins: - serverless-bundle - serverless-plugin-ifelse - serverless-domain-manager custom: appVersion: 0.0.12 stage: ${opt:stage} domains: prod: api.foo.com test: test-api.foo.com dev: dev-api.foo.com customDomain: domainName: ${self:custom.domains.${opt:stage}} stage: ${opt:stage} basePath: outages custom.customDomain.certificateName: "*.foo.com" custom.customDomain.certificateArn: 'arn:aws:acm:us-east-1:395671985612:certificate/XXXX' createRoute53Record: true serverlessIfElse: - If: '"${opt:stage}" == "prod"' Set: custom.customDomain.enabled: true ElseSet: custom.customDomain.enabled: false provider: name: aws runtime: nodejs12.x stage: ${opt:stage} region: us-east-1 environment: databaseName: !ImportValue DatabaseName-${self:provider.stage} databaseUsername: ${ssm:/my-db-username~true} databasePassword: ${ssm:/my-db-password~true} databaseHost: !ImportValue DatabaseHost-${self:provider.stage} databasePort: !ImportValue DatabasePort-${self:provider.stage} functions: hello: memorySize: 2048 timeout: 30 handler: functions/handler.hello vpc: securityGroupIds: - 'Fn::ImportValue': VPCDefaultSecurityGroup-${self:provider.stage} subnetIds: - 'Fn::ImportValue': vpc-subnet-A-${self:provider.stage} - 'Fn::ImportValue': vpc-subnet-B-${self:provider.stage} - 'Fn::ImportValue': vpc-subnet-C-${self:provider.stage} environment: functionName: getTowns events: - http: path: outage method: get cors: origin: '*' headers: - Content-Type - authorization resources: - Outputs: ApiGatewayRestApiId: Value: Ref: ApiGatewayRestApi Export: Name: ${self:custom.stage}-ApiGatewayRestApiId ApiGatewayRestApiRootResourceId: Value: Fn::GetAtt: - ApiGatewayRestApi - RootResourceId Export: Name: ${self:custom.stage}-ApiGatewayRestApiRootResourceId
amazon-web-services aws-lambda serverless-framework amazon-route53 vpc
1个回答
0
投票
请确保为API GW创建VPC接口端点,并在您创建的API中使用它。这将允许API请求在VPC中运行的lambda

参考:

https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-private-apis.html#apigateway-private-api-create-interface-vpc-endpoint

    https://aws.amazon.com/blogs/compute/introducing-amazon-api-gateway-private-endpoints/
  • 希望这会有所帮助!
  • © www.soinside.com 2019 - 2024. All rights reserved.