使用 Python Lambda 函数的 AWS ECR 图像标签

AWS ECR Image Tags using Python Lambda Function

我正在使用 python lambda 函数使用 boto3 将图像标签添加到 ECR 图像。以下代码有效并将所需的标签添加到指定的图像。但是,使用不同的测试事件定位不同的图像会从最后一个图像中删除先前应用的标签。我尝试了 3 种不同的 repos,以及跨账户和本地账户 lambda 函数。

例如,这是存储库 "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
                )

这是示例测试事件(我切换了 image-digest 和 image-tag 以针对同一 repo 中的不同图像):

{
  "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
    }
  }
}

在您的示例中,标签具有完全相同的值:DELETEON_2020-03-06。它们是同一个标签。在 Docker 仓库中,一个标签只能指向一件事。标签是唯一的标识符。您不能将同一个标签指向多个 Docker 图片。如果允许这样做,那么当您 运行 命令时会发生什么: docker run my-image:DELETEON_2020-03-06?

当您将该标签应用于一个图像,并且它已经指向另一个图像时,Docker 会自动移动 该标签。因此 Docker 标签不适合这个特定的用例。我认为存储这些删除日期的最佳选择是在 ECR 之外的单独位置,例如 DynamoDB table.