如何通过AWS CDK构建含API网关与Lambda的AWS Amplify后端
解决Amplify与CDK创建的Lambda/API Gateway关联问题
核心原因
你直接通过CDK创建的Lambda和API Gateway属于独立AWS资源,未纳入Amplify的后端管理体系,因此Amplify控制台不会自动识别展示这些资源,前端aws-amplify库也无法自动关联。要实现关联,需通过Amplify专用CloudFormation资源或CDK构造将资源绑定到Amplify App。
方案1:通过Amplify CloudFormation资源关联(适配现有CDK代码)
在现有代码基础上,添加Amplify后端环境、后端函数和后端API的CloudFormation资源,将已创建的Lambda和API Gateway绑定到Amplify App:
class AmplifyInfraStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # 创建Amplify App amplify_app = amplify.CfnApp(self, "MyApp", name='MyAppName') # 创建Lambda函数 lambda_function = lambda_.Function( self, 'MyFunction', code=lambda_.InlineCode(inline_code), handler='index.lambda_handler', runtime=lambda_.Runtime.PYTHON_3_9 ) # 创建API Gateway api = apiGateway.LambdaRestApi(self, 'MyAPI', handler=lambda_function) # 创建Amplify后端环境(关联后端资源的基础) backend_env = amplify.CfnBackendEnvironment(self, "MyBackendEnv", app_id=amplify_app.attr_app_id, environment_name="prod", stack_name="AmplifyBackendProdStack" ) # 将Lambda关联为Amplify后端函数,让控制台识别 amplify_backend_function = amplify.CfnBackendFunction(self, "AmplifyMyFunction", app_id=amplify_app.attr_app_id, environment_name=backend_env.environment_name, function_name="MyFunction", lambda_function_config=amplify.CfnBackendFunction.LambdaFunctionConfigProperty( lambda_arn=lambda_function.function_arn, runtime="PYTHON_3_9" ) ) # 将API Gateway关联为Amplify后端API,让控制台识别 amplify_backend_api = amplify.CfnBackendAPI(self, "AmplifyMyAPI", app_id=amplify_app.attr_app_id, environment_name=backend_env.environment_name, api_name="MyAPI", backend_api_config=amplify.CfnBackendAPI.BackendAPIConfigProperty( rest_api_config=amplify.CfnBackendAPI.RestAPIConfigProperty( endpoint=api.url, authorization_type="NONE" # 根据需求调整认证类型,如API_KEY、AWS_IAM等 ) ) )
关键说明
CfnBackendEnvironment:为Amplify App创建后端环境,是关联后端资源的基础载体CfnBackendFunction:将已有Lambda的ARN绑定到Amplify后端体系,使控制台识别为Amplify托管函数CfnBackendAPI:将API Gateway的URL和配置绑定到Amplify后端,控制台会展示该API条目
方案2:配置前端aws-amplify对接外部资源
若无需在Amplify控制台展示资源,仅需前端能调用API,可通过Amplify App环境变量注入API信息,再在前端手动配置:
1. 在CDK中为Amplify App添加环境变量
amplify_app = amplify.CfnApp(self, "MyApp", name='MyAppName', environment_variables={ "API_URL": api.url, "AWS_REGION": self.region } )
2. 前端配置aws-amplify
在前端代码中手动导入API配置:
import { Amplify, API } from 'aws-amplify'; Amplify.configure({ API: { endpoints: [ { name: "MyAPI", endpoint: process.env.REACT_APP_API_URL, // 对应Amplify环境变量 region: process.env.REACT_APP_AWS_REGION } ] } }); // API调用示例 API.get("MyAPI", "/your-path").then(response => { console.log(response); });
注意事项
- 方案1需确保Lambda和API Gateway的权限配置正确,可通过CDK为Amplify执行角色添加对应资源的调用权限
- 认证类型需根据实际场景调整,如使用AWS_IAM认证时,前端需配置IAM身份验证逻辑,确保用户具备API和Lambda的调用权限
内容的提问来源于stack exchange,提问作者Fin M.
相关产品推荐
相关产品推荐

