Wenn beim Schreiben der Stapelverarbeitung usw. mit der Taskplanfunktion von ECS die Task mehrmals mit "ecs-cli" aktualisiert wird, erhöht sich die "Revision" der Taskdefinition.
Es ist mühsam, die Revision zu löschen (Registrierung aufzuheben), indem Sie auf den Konsolenbildschirm von aws klicken, und es gibt auch eine Methode, um sie mit der Deregister-Task-Definition von awscli zu löschen, aber es ist auch mühsam, sie über die Befehlszeile auszuführen. ..
So löschen Sie mit awscli https://docs.aws.amazon.com/cli/latest/reference/ecs/deregister-task-definition.html
Also habe ich beschlossen, "Lambda" auszuführen, um die Registrierung aufzuheben.
Verwenden Sie ecs.list_task_definitions
in boto3
, um alle Aufgabendefinitionen abzurufen.
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ecs.html#ECS.Client.list_task_definitions
Ich habe "sort =" DESC "als Argument festgelegt, aber ich habe es auf" DESC "gesetzt, da dies erforderlich ist, wenn später" itertools.groupby "verwendet wird.
import json
import boto3
import logging
logger = logging.Logger(__name__)
logger.setLevel(logging.DEBUG)
def get_task_definitions():
"""Abrufen der ECS-Aufgabendefinition
Returns:
list --Liste der Aufgabendefinition arn
"""
client = boto3.client('ecs')
try:
res = client.list_task_definitions(
status='ACTIVE',
sort='DESC')
logger.info(json.dumps(res))
except Exception as e:
logger.info(e)
else:
logger.info('Erfolgreiche Erfassung von Aufgabendefinitionen')
list_task_definitions = res['taskDefinitionArns']
return list_task_definitions
Sie können es so bekommen
[
'arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXXX:task-definition/task_a:3',
'arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXXX:task-definition/task_a:2',
'arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXXX:task-definition/task_a:1',
'arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXXX:task-definition/task_b:5',
'arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXXX:task-definition/task_b:4',
'arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXXX:task-definition/task_b:3',
'arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXXX:task-definition/task_b:2',
'arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXXX:task-definition/task_b:1',
'arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXXX:task-definition/task_c:5',
'arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXXX:task-definition/task_c:4',
'arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXXX:task-definition/task_c:3',
'arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXXX:task-definition/task_c:2',
'arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXXX:task-definition/task_c:1'
]
Nachdem wir die Aufgabendefinition haben, werden wir sie nach demselben Aufgabennamen gruppieren und die Daten formatieren, damit wir sehen können, wie viele Revisionen die Aufgabe hat. Ich habe die Aufgabendefinition erhalten, aber um genau zu sein, sie gehört nicht zur Aufgabendefinition, daher formatiere ich sie nur auf den Aufgabennamen.
#Die Form, die Sie formen möchten
{
'task_a': ['3', '2', '1'],
'task_b': ['5', '4', '3', '2', '1'],
'task_c': ['5', '4', '3', '2', '1']
}
Gruppieren Sie mit "itertools.groupby". Ich habe die Sortierung für "ecs.list_task_definitions" festgelegt, da ich im Voraus sortieren muss, um "itertools.groupby" zu verwenden.
a = [('a', '3'), ('a', '2'), ('a', '1'), ('b', '4'), ('b', '3'),
('b', '2'), ('b', '1'), ('c', '2'), ('c', '1')]
for key, group in groupby(a, lambda x: x[0]):
for team in group:
print(team)
print('')
Es wird so gruppiert, dass ich es in ein Wörterbuch formatieren werde.
('a', '3')
('a', '2')
('a', '1')
('b', '4')
('b', '3')
('b', '2')
('b', '1')
('c', '2')
('c', '1')
from itertools import groupby
def groupby_task_definitions(list_task_definitions):
"""Stellen Sie eine Liste von arn in der Aufgabendefinition zusammen
Arguments:
list_task_definitions {list} --Liste der Aufgabendefinition arn
Returns:
dict --Aufgabenname und Revisionsliste
Example:
{
task_a: ['4', '3', '2', '1'],
task_b: ['2', 1]
}
"""
group_list = []
for task_definition in list_task_definitions:
#Schneiden Sie nur den Aufgabennamen und die Revision aus
task_definition = task_definition.rsplit('/', 1)[1]
task_name, revision = task_definition.split(':')
#Zur Liste als Taple hinzufügen
group_list.append((task_name, revision))
result_dict = {}
for key, group in groupby(group_list, lambda x: x[0]):
revision_list = []
for _, v in group:
revision_list.append(v)
result_dict[key] = revision_list
return result_dict
Nachdem wir ein Wörterbuch mit Aufgabendefinitionen erstellt haben, werden wir die ECS-Aufgaben löschen. Drehen Sie das Wörterbuch mit "for" und löschen Sie es mit "pop ()", bis die Länge der erhaltenen Liste von "revision" die angegebene Anzahl erreicht.
Sie können es einfach ausführen, indem Sie dem Argument "ecs.deregister_task_definition" den Namen der Aufgabendefinition geben.
def deregister_task_definition(groupby_task_definitions_dict, leave):
"""Löschen Sie die Aufgabendefinition und belassen Sie die beiden neuesten Versionen
Arguments:
groupby_task_definitions_dict {dict} --Ein Diktat, das eine Liste von Aufgabennamen und Revisionen speichert
"""
client = boto3.client('ecs')
for name, revision_list in groupby_task_definitions_dict.items():
logger.info(name)
try:
while len(revision_list) > 2:
revision = revision_list.pop()
client.deregister_task_definition(
taskDefinition='{}:{}'.format(name, revision)
)
except Exception as e:
logger.error(e)
else:
logger.info('{} : OK!'.format(name))
Wir haben zu diesem Zeitpunkt noch keine Ereignisse festgelegt, aber Sie können "Lambda Invoke" verwenden oder dies regelmäßig mit "CloudWatch Events" tun.
serverless.yml Wir werden Lambda mit "Serverless Framework" erstellen, also "serverless.yml" verfügbar machen.
serverless.yml
service: ecs-task
provider:
name: aws
runtime: python3.7
region: ap-northeast-1
logRetentionInDays: 30
iamRoleStatements:
- Effect: Allow
Action:
- ecs:*
Resource: "*"
functions:
definition-lifecycle :
handler: handler.main
plugins:
- serverless-python-requirements
custom:
pythonRequirements:
usePipenv: true
handler Der Handler führt nur eine Funktion aus, die das tut, was er bisher getan hat.
def main(event, context):
list_task_definitions = get_task_definitions()
groupby_task_definitions_dict = groupby_task_definitions(
list_task_definitions)
logger.info(groupby_task_definitions_dict)
deregister_task_definition(groupby_task_definitions_dict, leave)
handler.py
import boto3
import json
from itertools import groupby
import logging
logger = logging.Logger(__name__)
logger.setLevel(logging.DEBUG)
def get_task_definitions():
"""Abrufen der ECS-Aufgabendefinition
Returns:
list --Liste der Aufgabendefinition arn
"""
client = boto3.client('ecs')
try:
res = client.list_task_definitions(
status='ACTIVE',
sort='DESC')
logger.info(json.dumps(res))
except Exception as e:
logger.info(e)
else:
logger.info('Erfolgreiche Erfassung von Aufgabendefinitionen')
list_task_definitions = res['taskDefinitionArns']
return list_task_definitions
def groupby_task_definitions(list_task_definitions):
"""Stellen Sie eine Liste von arn in der Aufgabendefinition zusammen
Arguments:
list_task_definitions {list} --Liste der Aufgabendefinition arn
Returns:
dict --Aufgabenname und Revisionsliste
Example:
{
task_a: ['4', '3', '2', '1'],
task_b: ['2', 1]
}
"""
group_list = []
for task_definition in list_task_definitions:
#Schneiden Sie nur den Aufgabennamen und die Revision aus
task_definition = task_definition.rsplit('/', 1)[1]
task_name, revision = task_definition.split(':')
group_list.append((task_name, revision))
result_dict = {}
for key, group in groupby(group_list, lambda x: x[0]):
revision_list = []
for _, v in list(group):
revision_list.append(v)
result_dict[key] = revision_list
return result_dict
def deregister_task_definition(groupby_task_definitions_dict):
"""Löschen Sie die Aufgabendefinition und belassen Sie die beiden neuesten Versionen
Arguments:
groupby_task_definitions_dict {dict} --Ein Diktat, das eine Liste von Aufgabennamen und Revisionen speichert
"""
client = boto3.client('ecs')
for name, revision_list in groupby_task_definitions_dict.items():
logger.info(name)
try:
while len(revision_list) > 2:
revision = revision_list.pop()
client.deregister_task_definition(
taskDefinition='{}:{}'.format(name, revision)
)
except Exception as e:
logger.error(e)
else:
logger.info('{} : OK!'.format(name))
def main(event, context):
list_task_definitions = get_task_definitions()
groupby_task_definitions_dict = groupby_task_definitions(
list_task_definitions)
logger.info(groupby_task_definitions_dict)
deregister_task_definition(groupby_task_definitions_dict)
Sie können die Aufgabendefinition nur für die Aufgabe "Aktiv" löschen (die Registrierung aufheben), und dann befindet sie sich im Status "Inaktiv". In diesem Zustand kann es zu diesem Zeitpunkt nicht vollständig gelöscht werden, daher warten wir auf die Antwort von AWS.
Zu diesem Zeitpunkt bleibt die Definition der INAKTIVEN Aufgabe in Ihrem Konto auf unbestimmte Zeit erkennbar. Dieses Verhalten kann sich jedoch in Zukunft ändern und sollte nicht davon abhängen, dass die ACL-Aufgabendefinition über den gesamten Lebenszyklus der zugeordneten Aufgabe und des zugehörigen Dienstes beibehalten wird.
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/deregister-task-definition.html
Recommended Posts