【问题标题】:Best Practices to deploy serverless app (s3, api gateway, lambda, cognito...) with AWS CDK使用 AWS CDK 部署无服务器应用程序(s3、api 网关、lambda、cognito...)的最佳实践
【发布时间】:2021-12-06 17:09:12
【问题描述】:

我开始使用 AWS 的无服务器服务构建应用程序,现在我想将其全部放入 AWS CDK。我还想使用 CodePipeline 创建一个 CICD 管道,以通过更改自动部署基础架构。

为了使用 API 网关接口,我从 AWS 控制台生成了适用于 Javascript 的开发工具包,并将其手动包含到网站文件夹中。

  1. 是否可以生成 SDK 并将其包含在项目中,或者使用 CDK 自动包含一些随机存储桶?

  2. 是否有一些关于使用 CICD 管道以自动化方式配置此类基础架构的最佳实践?

【问题讨论】:

    标签: amazon-web-services serverless-framework aws-cdk aws-serverless serverless-architecture


    【解决方案1】:

    是否可以生成 SDK 并将其包含在项目中,或者使用 CDK 自动包含一些随机存储桶?

    根据文档,您可以通过两种方式生成 SDK。通过 AWS 控制台或使用 AWS CLI(参考:https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-generate-sdk.html)

    您可以编写使用 AWS CLI 生成 SDK 的脚本并将其上传到网站文件夹或存储桶。

    是否有一些关于使用 CICD 管道以自动化方式配置此类基础架构的最佳实践?

    这是一个非常笼统的问题。本文讨论了使用 CDK (https://aws.amazon.com/blogs/devops/best-practices-for-developing-cloud-applications-with-aws-cdk/) 的最佳实践。

    aws-samples Github repo 也很有用,其中包括这样的示例:https://github.com/aws-samples/aws-serverless-app-sam-cdk

    【讨论】:

    • 我也想过你提到的方式,但这似乎有点作为一种解决方法,所以我认为可能有一个更方便的解决方案。我担心我关于最佳实践的问题在某种程度上是笼统的。我将查看您提供的文档。非常感谢您的回答
    【解决方案2】:

    将Custom Resource 添加到您的 CDK 堆栈。正如CloudFormation docs 所说,

    自定义资源使您能够编写自定义预置逻辑...... AWS CloudFormation 在您创建、更新(如果您更改了自定义资源)或删除堆栈时运行。

    换句话说,每次堆栈的 API 定义更改时,您都可以将 API 客户端 SDK 本地提取到存储桶中。

    您定义一个 lambda,它使用 apigateway 和 s3 SDK 客户端生成 API 客户端 .zip 输出并将其保存到存储桶中。然后是你 将其与custom resource logic 集成到stack lifecycle events 中。 CloudFormation 处理在 create-update-delete 和响应上调用 lambda。

    (注意:术语“自定义资源”可能会令人困惑。是的,它们可以帮助填补 CDK/CloudFormation 的空白 使用 API 调用实际创建基础设施资源。但是CustomResource 没有 必须创建任何基础设施。它们用于查找、运行测试和播种初始数据。你能做什么取决于你的 lambda。)

    aws-cdk-samples has an example 的自定义资源实现。以下是您的用例的自定义资源管道框架:

    export class ExportApigCustomResource extends Construct {
      constructor(scope: Construct, id: string, props: ExportApigCustomResourceProps) {
        super(scope, id);
    
        // the provider handles the orchestration
        // https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib-readme.html#custom-resource-providers
        const provider = new cr.Provider(this, 'Provider', {
          // CloudFormation will call this lambda on create-update-delete
          onEventHandler: new lambda.NodejsFunction(this, 'ExportApigLambda', {
              entry: path.join(__dirname, 'exportApi.ts'),
              role: new iam.Role(this, 'CrLambdaRole', {...add the right policies});
            })
        });
    
        // information for the getSdk call that is passed to the lambda in the triggered lifecycle events
        // use a strongly typed input type for safety
        const properties: ExportApigCustomResourceProperties = {
          restApiId: props.api.restApiId,
          bucketName: props.bucket.bucketName,
          stageName: 'prod',
          sdkType: 'javascript',
        };
    
        // the actual custom resource
        // https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.CustomResource.html
        new cdk.CustomResource(this, 'Resource', {
          resourceType: 'Custom::ExportApi',
          serviceToken: provider.serviceToken,
          properties,
        });
      }
    }
    

    自定义资源的设置很繁琐。但它们在 CDK 中得到了很好的支持,并且是一种将配置逻辑与基础架构代码保持在同一位置的优雅方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-07
      • 2021-12-28
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      相关资源
      最近更新 更多