[PYTHON] Ich möchte einen Lebenszyklus in der Aufgabendefinition von ECS festlegen

Einführung

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.

Was wurde verwendet

Rufen Sie eine Liste der ECS-Aufgabendefinitionen ab

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'
]

Formatieren von Aufgabendefinitionsdaten

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

ECS-Aufgabe löschen (Registrierung aufheben)

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))

Stellen Sie es in Lambda zur Verfügung

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)

Ganzer Code

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)

AWS irgendwie

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.

image.png

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/deregister-task-definition.html

Recommended Posts

Ich möchte einen Lebenszyklus in der Aufgabendefinition von ECS festlegen
Ich möchte eine Liste in der Reihenfolge anderer Listen sortieren
Ich möchte eine Liste der WebDAV-Dateien im Modul Anfragen anzeigen
Ich möchte in der Einschlussnotation drucken
[Einführung in StyleGAN] Ich habe mit "The Life of a Man" ♬ gespielt
Ich möchte die Bevölkerung jedes Landes der Welt kennenlernen.
Ich möchte das Ergebnis von "Zeichenfolge" .split () in Python stapelweise konvertieren
Ich möchte einen Teil der Excel-Zeichenfolge mit Python einfärben
Ich möchte einen beliebigen Befehl im Befehlsverlauf von Shell belassen
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen
Python: Ich möchte die Verarbeitungszeit einer Funktion genau messen
Ich möchte das Erscheinungsbild von zabbix anpassen
Ich möchte den Fortschritt in Python anzeigen!
Wenn Sie den Ausführungsbenutzer mitten in einer Fabric-Aufgabe wechseln möchten, stellen Sie den Kontextmanager ein
Ich möchte komplizierte vier Regeln in der IF-Anweisung der Django-Vorlage verwenden! → Verwenden Sie eine benutzerdefinierte Vorlage
Die Geschichte der IPv6-Adresse, die ich auf ein Minimum beschränken möchte
[Django-Memo] Ich möchte die angemeldeten Benutzerinformationen im Voraus im Formular festlegen.
Ich habe einen Appdo-Befehl erstellt, um Befehle im Kontext der App auszuführen
Ich möchte dem Anfang einer WAV-Datei 1 Sekunde lang Stille hinzufügen
Ich möchte die Ergebnisse von% time, %% time usw. in einem Objekt (Variable) speichern.
Ich möchte eine Variable in einen Python-String einbetten
Ich möchte Timeout einfach in Python implementieren
Ich möchte mit einem Knopf am Kolben übergehen
Ich möchte das Ausführungsergebnis von strace erfassen
Ich möchte in Python schreiben! (2) Schreiben wir einen Test
Ich möchte eine Datei mit Python zufällig testen
Ich möchte die Grundlagen von Bokeh vollständig verstehen
Ich möchte mit einem Roboter in Python arbeiten.
Ich möchte ein Paket von Php Redis installieren
Ich möchte in Python schreiben! (3) Verwenden Sie Mock
Ich möchte R-Datensatz mit Python verwenden
Ich möchte die Sicherheit der SSH-Verbindung erhöhen
Ich möchte mit swagger-codegen in Sekundenschnelle einen Mock-Server für Python-Flask einrichten.
Ich möchte einen Screenshot der Site in Docker mit einer beliebigen Schriftart erstellen
Suchen Sie eine Richtlinie für die Anzahl der Prozesse / Threads, die auf dem Anwendungsserver festgelegt werden sollen
[Python] Ich möchte einen gemeinsamen Satz zwischen numpy erhalten
Ich möchte nur die SudachiPy-Normalisierungsverarbeitung verwenden
Ich möchte Betriebsinformationen über die Yahoo-Route erhalten
Ich habe eine Funktion erstellt, um das Modell von DCGAN zu überprüfen
Ich möchte die Authentizität eines Elements eines numpy-Arrays bestimmen
Ich möchte die Natur von Python und Pip kennenlernen
Ich möchte den Wörterbuchtyp in der Liste eindeutig machen
Keras Ich möchte die Ausgabe einer beliebigen Ebene erhalten !!
Ich möchte die gültigen Zahlen im Numpy-Array ausrichten
Ich möchte die Legende der IT-Technologiewelt kennenlernen
Ich möchte eine schöne Ergänzung zu input () in Python hinzufügen
Ich möchte vorerst eine Docker-Datei erstellen.
Ich wollte den AWS-Schlüssel nicht in das Programm schreiben
Notieren Sie sich, was Sie in Zukunft mit Razpai machen möchten
Ich möchte die Grafik in 3D sehen! Ich kann einen solchen Traum wahr werden lassen.
Ich möchte den Schnittpunkt einer Bezier-Kurve und einer geraden Linie finden (Bezier-Clipping-Methode)
Ich möchte eine wunderschön angepasste Wärmekarte der Korrelationsmatrix ausgeben. matplotlib edition
Ich schrieb einen Test in "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren".