如何无缝集成AWS Amplify与AWS CDK实现资源共享?
解答:Amplify与CDK间共享资源ARN的最佳实践与问题解决
1. Amplify与CDK集成共享配置的最佳实践
- CDK输出+Amplify环境变量联动
在CDK中通过CfnOutput输出资源ARN,再通过CI/CD流水线将输出值注入Amplify的环境变量。Amplify的Lambda函数直接读取process.env中的变量,无需额外服务中转。
示例CDK代码:import * as cdk from 'aws-cdk-lib'; import * as sfn from 'aws-cdk-lib/aws-stepfunctions'; export class MyBackendStack extends cdk.Stack { constructor(scope: cdk.App, id: string, props?: cdk.StackProps) { super(scope, id, props); const stateMachine = new sfn.StateMachine(this, 'MyStateMachine', { definition: sfn.Chain.start(new sfn.Pass(this, 'Start')), }); // 输出ARN供流水线读取 new cdk.CfnOutput(this, 'StateMachineArn', { value: stateMachine.stateMachineArn, exportName: `StateMachineArn-${this.stackName}`, }); } } - 使用SSM参数存储同步
用CDK将ARN写入SSM参数存储(Standard类型即可),Amplify Lambda通过IAM权限读取该参数,运行时或冷启动时获取最新值。适合ARN可能频繁变更的场景,无需重新部署Amplify。
CDK代码示例:
Amplify Lambda代码示例:import * as ssm from 'aws-cdk-lib/aws-ssm'; // 状态机创建后添加 new ssm.StringParameter(this, 'StateMachineArnParam', { parameterName: `/amplify/${props.envName}/state-machine-arn`, stringValue: stateMachine.stateMachineArn, tier: ssm.ParameterTier.STANDARD, });import { GetParameterCommand, SSMClient } from "@aws-sdk/client-ssm"; const ssmClient = new SSMClient({}); const getArn = async () => { const command = new GetParameterCommand({ Name: `/amplify/${process.env.ENV}/state-machine-arn`, WithDecryption: false, }); const response = await ssmClient.send(command); return response.Parameter.Value; }; // 调用状态机时获取最新ARN const command = new StartExecutionCommand({ stateMachineArn: await getArn(), input: JSON.stringify(record), name: "xyz", }); - 统一CI/CD流水线
将CDK部署与Amplify部署放在同一流水线中,确保CDK资源部署完成并输出ARN后,再执行Amplify部署。从流程上保证配置同步,避免手动操作失误。
2. 需要注意的陷阱及缓解方案
- 竞态条件(CDK更新与Amplify配置不同步)
陷阱:CDK更新资源ARN后,Amplify未及时更新环境变量或参数,导致Lambda使用旧ARN调用失败。
缓解:- 用统一流水线,添加CDK部署后的等待确认步骤(如检查CloudFormation栈状态为
CREATE_COMPLETE/UPDATE_COMPLETE),再执行Amplify部署。 - 如果使用SSM参数存储,Lambda每次调用前都拉取最新参数,而非依赖冷启动时的缓存值。
- 用统一流水线,添加CDK部署后的等待确认步骤(如检查CloudFormation栈状态为
- 资源ARN意外变更
陷阱:CDK中修改资源的某些属性(如物理名称、服务关联配置)会导致资源重建,ARN变更。
缓解:- 为CDK资源指定固定
physicalName,避免自动生成的名称导致重建。 - 在CDK中使用
retain策略,防止资源被意外删除重建。
- 为CDK资源指定固定
- 权限缺失
陷阱:Amplify Lambda没有权限访问CDK创建的状态机或SSM参数。
缓解:- 在CDK中为Amplify的Lambda执行角色添加权限(如
states:StartExecution、ssm:GetParameter)。 - 如果Amplify角色是自动生成的,可通过CDK的
iam.Role.fromRoleArn导入角色并附加权限。
- 在CDK中为Amplify的Lambda执行角色添加权限(如
- Secrets Manager同步问题
陷阱:手动更新Secrets Manager中的ARN容易遗漏,CDK更新后未自动同步。
缓解:- 完全通过CDK管理Secrets Manager的秘钥值,部署时自动覆盖旧值,避免手动操作。
- 设置秘钥版本,Lambda调用时指定获取最新版本。
3. 无需中间服务的高效实现方式
最直接高效的方式是CDK输出+Amplify环境变量的流水线联动,无需额外服务:
- 在CDK中输出资源ARN到文件:
cdk deploy --outputs-file cdk-outputs.json - 在CI/CD中读取输出文件中的ARN,更新Amplify环境变量:
# 读取CDK输出的ARN STATE_MACHINE_ARN=$(jq -r '.MyBackendStack.StateMachineArn' cdk-outputs.json) # 更新Amplify环境变量 amplify env update --env-name ${ENV_NAME} --env-vars STATE_MACHINE_ARN=$STATE_MACHINE_ARN # 部署Amplify amplify publish --yes - Amplify Lambda直接读取环境变量:
const command = new StartExecutionCommand({ stateMachineArn: process.env.STATE_MACHINE_ARN, input: JSON.stringify(record), name: "xyz", });
这种方式没有额外的服务调用开销,流程简单,适合ARN变更不频繁的场景。如果需要支持动态更新,再考虑SSM参数存储的方式。
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

