簡體   English   中英

使用 Python Lambda 函數的 AWS ECR 圖像標簽

[英]AWS ECR Image Tags using Python Lambda Function

我正在使用 python lambda 函數使用 boto3 將圖像標簽添加到 ECR 圖像。 以下代碼有效並將所需的標簽添加到指定的圖像。 但是,使用不同的測試事件定位不同的圖像會從最后一個圖像中刪除先前應用的標簽。 我嘗試了 3 個不同的存儲庫,以及跨賬戶和本地賬戶 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 表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM