【问题标题】: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,它使用 apigateways3 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
      相关资源
      最近更新 更多