AWS ECR теги изображений с использованием Python лямбда-функции - PullRequest
0 голосов
/ 04 марта 2020

Я использую python лямбда-функцию для добавления тега изображения к изображениям ECR с помощью boto3. Следующий код работает и добавляет нужный тег к указанному изображению. Однако нацеливание на другое изображение с другим тестовым событием удаляет ранее примененный тег из последнего изображения. Я пробовал 3 разных репозитория, а также лямбда-функции кросс-аккаунта и локального аккаунта.

Например, в репозитории «test-repo» есть три тега изображения:

  1. 1.0 .0.1
  2. 1.0.0.2
  3. 1.0.0.3

Я запускаю тестовое событие для 1.0.0.1, и теперь присутствуют следующие теги:

  1. DELETEON_2020-03-06, 1.0.0.1
  2. 1.0.0.2
  3. 1.0.0.3

Когда я запускаю тестовое событие для любого другое изображение, в этом примере 1.0.0.2, вот что происходит:

  1. 1.0.0.1
  2. DELETEON_2020-03-06, 1.0.0.2
  3. 1.0. 0.3

Я ожидаю, что код применит тег к 1.0.0.1, а затем, когда я запускаю его для 1.0.0.2, он просто добавляет тег к этому изображению. Я не понимаю, почему он удаляет ранее примененный тег. Мне нужно иметь возможность применять тег DELETEON ко всем выявленным уязвимым изображениям. Есть ли что-то, чего я не вижу или не понимаю в методах boto3 ECR, самом ECR, или, возможно, это ошибка?

    import json
    import boto3
    import datetime
    from datetime import timedelta

    def lambda_handler(event, context):
        acct = event['account']
        date = datetime.date.today()
        repo = event['detail']['repository-name']
        digest = event['detail']['image-digest']
        imagetag = event['detail']['image-tags'][0]
        client = boto3.client('ecr')
        dayint = datetime.date.today() + datetime.timedelta(days=3)
        deletetag = dayint.strftime("%Y-%m-%d")

        response = client.batch_get_image(
            registryId=acct,
            repositoryName=repo,
            imageIds=[
                {
                    'imageDigest': digest,
                    'imageTag': imagetag
                }
            ]
        )
        putresponse = client.put_image(
                    registryId=acct,
                    repositoryName=repo,
                    imageManifest=response['images'][0]['imageManifest'],
                    imageTag='DELETEON_' + deletetag
                )

Вот пример тестового события (я отключаю дайджест изображения и тег изображения для нацеливания на разные изображения в одном репо):

{
  "version": "0",
  "id": "1111111111-22222222222-3333333333333",
  "detail-type": "ECR Image Scan",
  "source": "aws.ecr",
  "account": "111111111111",
  "time": "2020-02-14T22:41:19Z",
  "region": "us-east-1",
  "resources": [
    "arn:aws:ecr:us-east-1:111111111111:repository/test-repo"
  ],
  "detail": {
    "scan-status": "COMPLETE",
    "repository-name": "test-repo",
    "image-digest": "sha256:111111111111111111111111111111111111111111111111111",
    "image-tags": [
      "1.0.0.1"
    ],
    "finding-severity-counts": {
      "HIGH": 12,
      "MEDIUM": 46,
      "INFORMATIONAL": 84,
      "LOW": 72,
      "UNDEFINED": 6
    }
  }
}

1 Ответ

0 голосов
/ 04 марта 2020

В вашем примере теги имеют одинаковое значение: DELETEON_2020-03-06. Это один и тот же тег. В репо Docker тег может указывать только на одну вещь. Теги являются уникальными идентификаторами. Вы не можете иметь один и тот же тег, указывающий на несколько Docker изображений. Если это было разрешено, то что произойдет, если вы запустите команду: docker run my-image:DELETEON_2020-03-06?

Когда вы применяете этот тег к одному изображению, а он уже указывает на другое изображение, Docker автоматически перемещая этот тег. Таким образом, теги Docker не подходят для этого конкретного c варианта использования. Я думаю, что ваша лучшая ставка для хранения этих дат удаления будет в отдельном месте за пределами ECR, например, в таблице DynamoDB.

...