Как переопределить aws_cdk.core.LegacyStackSynthesizer.add_docker_image_asset в AWS CDK для Python - PullRequest
1 голос
/ 03 августа 2020

Я хотел бы загрузить изображение docker с локального диска c в репозиторий, который я создал с помощью AWS CDK.

Когда я использую aws_ecr_assets.DockerImageAsset для добавления Docker изображение в репозиторий (который отлично работает, за исключением того, что я не могу установить разрешения для его репозитория через CDK), я получаю следующее предупреждение об устаревании:

DockerImageAsset.repositoryName is deprecated. Override "core.Stack.addDockerImageAsset" to control asset locations

При просмотре core.Stack.addDockerImageAsset я получаю подсказка, что я должен переопределить stack.synthesizer.addDockerImageAsset().

Мой упрощенный стек с настраиваемым синтезатором выглядит так:

class CustomSynthesizer(core.LegacyStackSynthesizer):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def add_docker_image_asset(
        self,
        *,
        directory_name,
        source_hash,
        docker_build_args=None,
        docker_build_target=None,
        docker_file=None,
        repository_name=None,
    ):
        # What should I put in this function to upload the docker image into my repository?


class ContainerStack(core.Stack):
    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:

        super().__init__(scope, id, synthesizer=CustomSynthesizer(), **kwargs)

        repo = ecr.Repository(self, "TestRepo", repository_name="test_repo")
        repo.grant_pull(iam.AccountPrincipal("123456789123"))

        image_location = self.synthesizer.add_docker_image_asset(
            directory_name="path/to/dir/with/Dockerfile",
            source_hash="latest",
            repository_name=repo.repository_name,
        )

Еще я попробовал использовать стандартный синтезатор стека и вызвать add_docker_image_asset на нем. К сожалению, я получаю следующее сообщение об ошибке, и стек не удается развернуть:

test-stack: deploying...
[0%] start: Publishing latest:current
[25%] fail: Unable to execute 'docker' in order to build a container asset. Please install 'docker' and try again.
...
 ❌  test-stack failed: Error: Failed to publish one or more assets. See the error messages above for more information.
    at Object.publishAssets (/home/user/.npm-global/lib/node_modules/aws-cdk/lib/util/asset-publishing.ts:25:11)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
    at Object.deployStack (/home/user/.npm-global/lib/node_modules/aws-cdk/lib/api/deploy-stack.ts:216:3)
    at CdkToolkit.deploy (/home/user/.npm-global/lib/node_modules/aws-cdk/lib/cdk-toolkit.ts:181:24)
    at main (/home/user/.npm-global/lib/node_modules/aws-cdk/bin/cdk.ts:268:16)
    at initCommandLine (/home/user/.npm-global/lib/node_modules/aws-cdk/bin/cdk.ts:188:9)
Failed to publish one or more assets. See the error messages above for more information.

Я лежу на спине относительно того, как решить эту проблему, и любая помощь приветствуется!

1 Ответ

1 голос
/ 26 августа 2020

DockerImageAsset - управляемая конструкция, которая сама обрабатывает репозиторий и управление версиями. По умолчанию он создает репозиторий для вашего стека и загружает в него docker изображений (помечая их по их ha sh).

Вам не нужно создавать этот репозиторий самостоятельно. Однако, если вы похожи на меня и хотите иметь разборчивое имя для репозитория, вы можете назвать репо, используя файл конфигурации cdk.json и его раздел context:

// cdk.json
{
  "app": "python3 your_app",
  "context": {
    "@aws-cdk/core:enableStackNameDuplicates": "true",
    "aws-cdk:enableDiffNoFail": "true",
    "assets-ecr-repository-name": "<REPO NAME GOES HERE>"
  }
}

Если вы хотите продолжить измените репо (я бы предпочел оставить его полностью управляемым, но эй), вы можете загрузить репо в стек CDK, используя один из методов stati c в конструкции aws_ecr.Repository. https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-ecr.Repository.html#static -from-wbr-repository-wbr-namescope-id-repositoryname

Надеюсь, это немного поможет: -)

...