Как не перестраивать DockerImageAsset при каждом развертывании, используя aws -cdk в TypeScript? - PullRequest
1 голос
/ 23 января 2020

Мое приложение представляет собой Python API, который я упаковываю как изображение Docker и использую с ECS Fargate (точечные экземпляры). Приведенный ниже код работает.

Моя проблема заключается в том, что он перестраивает весь образ каждый раз, когда я его развертываю, что занимает очень много времени (загрузка всех зависимостей, создание образа, загрузка и т. Д. c). Я хочу, чтобы он снова использовал то же самое изображение, загруженное в ECR самим aws-cdk.

Есть ли способ (переменная env или другое) для меня, чтобы пропустить это, когда я не касаюсь кода приложения и просто внести изменения в стек?

#!/usr/bin/env node
import * as cdk from "@aws-cdk/core"
import * as ecs from "@aws-cdk/aws-ecs"
import * as ec2 from "@aws-cdk/aws-ec2"
import * as ecrassets from "@aws-cdk/aws-ecr-assets"

// See https://docs.aws.amazon.com/cdk/api/latest/docs/aws-ecs-readme.html
export class Stack extends cdk.Stack {
    constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
        super(scope, id, props)

        /**
         * Repository & Image
         */

        const apiDockerImage = new ecrassets.DockerImageAsset(
            this,
            `my-api-image`,
            {
                directory: `.`,
                exclude: [`cdk.out`, `cdk`, `.git`]
            }
        )

        /**
         * Cluster
         */

        const myCluster = new ecs.Cluster(this, "Cluster", {})

        // Add Spot Capacity to the Cluster
        myCluster.addCapacity(`spot-auto-scaling-group-capacity`, {
            maxCapacity: 2,
            minCapacity: 1,
            instanceType: new ec2.InstanceType(`r5a.large`),
            spotPrice: `0.0400`,
            spotInstanceDraining: true
        })

        // A task Definition describes what a single copy of a task should look like
        const myApiFargateTaskDefinition = new ecs.FargateTaskDefinition(
            this,
            `api-fargate-task-definition`,
            {
                cpu: 2048,
                memoryLimitMiB: 8192,
            }
        )

        // Add image to task def
        myApiFargateTaskDefinition.addContainer(`api-container`, {
            image: ecs.ContainerImage.fromEcrRepository(
                apiDockerImage.repository,
                `latest`
            ),
        })

        // And the service attaching the task def to the cluster
        const myApiService = new ecs.FargateService(
            this,
            `my-api-fargate-service`,
            {
                cluster: myCluster,
                taskDefinition: myApiFargateTaskDefinition,
                desiredCount: 1,
                assignPublicIp: true,
            }
        )
    }
}

...