You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无缝集成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代码示例:
    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,
    });
    
    Amplify Lambda代码示例:
    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每次调用前都拉取最新参数,而非依赖冷启动时的缓存值。
  • 资源ARN意外变更
    陷阱:CDK中修改资源的某些属性(如物理名称、服务关联配置)会导致资源重建,ARN变更。
    缓解:
    • 为CDK资源指定固定physicalName,避免自动生成的名称导致重建。
    • 在CDK中使用retain策略,防止资源被意外删除重建。
  • 权限缺失
    陷阱:Amplify Lambda没有权限访问CDK创建的状态机或SSM参数。
    缓解:
    • 在CDK中为Amplify的Lambda执行角色添加权限(如states:StartExecution、ssm:GetParameter)。
    • 如果Amplify角色是自动生成的,可通过CDK的iam.Role.fromRoleArn导入角色并附加权限。
  • Secrets Manager同步问题
    陷阱:手动更新Secrets Manager中的ARN容易遗漏,CDK更新后未自动同步。
    缓解:
    • 完全通过CDK管理Secrets Manager的秘钥值,部署时自动覆盖旧值,避免手动操作。
    • 设置秘钥版本,Lambda调用时指定获取最新版本。

3. 无需中间服务的高效实现方式

最直接高效的方式是CDK输出+Amplify环境变量的流水线联动,无需额外服务:

  1. 在CDK中输出资源ARN到文件:
    cdk deploy --outputs-file cdk-outputs.json
    
  2. 在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
    
  3. Amplify Lambda直接读取环境变量:
    const command = new StartExecutionCommand({
      stateMachineArn: process.env.STATE_MACHINE_ARN,
      input: JSON.stringify(record),
      name: "xyz",
    });
    

这种方式没有额外的服务调用开销,流程简单,适合ARN变更不频繁的场景。如果需要支持动态更新,再考虑SSM参数存储的方式。

内容的提问来源于stack exchange,提问作者Luke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 20:22:13