我在 AWS 中有一个 ECR 存储库,其中有很多图像,其中一些正在使用,另一些则没有使用,我创建了一个 lambda,它将删除超过 30 天的未使用的 ECR 图像,lambda 每天都会触发,但最近其中一台 ECS 停止了一段时间,lambda 认为它的镜像未使用并删除了该镜像,当 ECS 服务启动时,它因找不到镜像而失败。
这是我的 lambda:
import boto3
from datetime import datetime, timedelta
def lambda_handler(event, context):
client = boto3.client("ecr")
response = client.describe_images(repositoryName="test")
# print(response)
last_30_days = (datetime.now() - timedelta(days=30)).strftime("%Y-%m-%d")
last_30_days = datetime.strptime(last_30_days, "%Y-%m-%d")
todo_delete = []
for x in response["imageDetails"]:
image_date = x["imagePushedAt"].strftime("%Y-%m-%d")
image_date = datetime.strptime(image_date, "%Y-%m-%d")
if last_30_days > image_date:
todo_delete.append(x["imageDigest"])
for imageDigest in todo_delete:
response = client.batch_delete_image(
repositoryName="test",
imageIds=[
{"imageDigest": imageDigest},
],
)
print(response)
我尝试了更多更改,将期限延长为 90 天,但这并不能永久解决问题。有什么方法可以避免某些图像(期望标签我尝试过,它会起作用,但在我的情况下标签是动态的,所以我们不知道那里有什么)。
我建议使用 Lambda 更好的解决方案,您可以使用 ECR 生命周期策略
生命周期策略允许您定义一组规则来自动删除旧的容器映像。您还可以预览规则,以准确查看规则运行时哪些容器映像受到影响。这使得存储库可以更好地组织,更容易找到重要的代码修订,并降低存储成本
这是一个例子:
{
"rules": [
{
"rulePriority": 1,
"description": "Expire images older than 14 days",
"selection": {
"tagStatus": "untagged",
"countType": "sinceImagePushed",
"countUnit": "days",
"countNumber": 14
},
"action": {
"type": "expire"
}
}
]
}
您的问题是您只检查图像创建日期,而不检查它是否正在使用。要检查图像是否被使用,最简单的方法可能是查找图像标签。默认情况下,您推送的最后一个图像应标记为“最新”。只能有一张带有给定标签的图像(例如最新的),因此您的旧图像将没有标签(如果它们仅被标记为最新的,如果它们有其他尚未重用的标签,它们仍然会有一个)。通过这种方式检查没有标签的图像可以帮助您检查您的图像是否正在使用。