[PYTHON] Die Lambda-Funktion bietet Best Practice mit CircleCI + Lamvery

Vorwort

AWS Lambda ist ereignisgesteuert und kann bei Bedarf ohne EC2-Instanz so viel Code wie nötig ausführen. Der Start der Abrechnung kostet Geld. Im Gegensatz zu EC2 handelt es sich um einen sehr leistungsstarken und attraktiven Dienst, der nur für das berechnet, was Sie vollständig nutzen.

Ich bin jedoch der Meinung, dass dieser Service oft mühsam und ärgerlich ist, wahrscheinlich weil es viele einzigartige Konzepte gibt, die in der Vergangenheit im Gegensatz zu seinem leichten und einfachen Konzept nicht existierten.

Aus diesem Grund mache ich ein Tool namens Lamvery, weil ich es einfacher und praktischer verwenden möchte. In dem Teil der Bereitstellung, den ich für ein Problem hielt, konnte ich einen Flow erstellen, der im Moment als die beste Vorgehensweise für mich bezeichnet werden kann. Daher möchte ich ihn vorstellen.

Drei Herausforderungen bei der Bereitstellung der Lambda-Funktion

① Erstellen Sie ein Bereitstellungspaket

② Versionsverwaltung

③ Entwicklung des Bereitstellungsflusses

Es gibt noch keine Best Practice, oder ich habe hier kaum etwas gesehen. [^ 1]

Was kann mit dieser Methode gelöst werden

① Python-Bereitstellungspaket erstellen (Node.js sollte auch funktionieren)

Erstens kann Lamvery selbst auf einfache Weise ein Bereitstellungspaket in virtauluenv erstellen und bereitstellen. Sie müssen also lediglich eine saubere Virenumgebung in der Python-Umgebung von CircleCI erstellen, die erforderlichen Bibliotheken installieren und bereitstellen. Sie können das aktuelle Verzeichnis und darunter einfach in einer Zip-Datei bereitstellen, sodass Node.js dies auch tun sollte, wenn Sie "package.json" in das Repository aufnehmen und auf "npm install" klicken. [^ 2]

(2) Verknüpfung mit dem Git-Zweig unter Verwendung der speziellen Versionsspezifikationen von Lambda

Unter Verwendung des an die Lambda-Version angehängten Alias und unter Ausnutzung der Eigenschaft, dass die Funktion ausgeführt werden kann, indem der Alias einzeln angegeben wird, wird eine mit dem Zweig verknüpfte individuelle Ausführungsumgebung bereitgestellt.

③ Ziehen Sie den anforderungsbasierten Bereitstellungsablauf

Sogenannter Typ → http://d.hatena.ne.jp/naoya/20140502/1399027655 Es ist eine Geschichte, die man machen kann, wenn man es kann.

Methoden und Verfahren

Hier ist übrigens die tatsächliche Überprüfung dieses Inhalts. https://github.com/marcy-terui/lamvery-circleci-deploy

Der Ort, an dem das entsprechende Repository in CircleCI aktiviert wird, ist derselbe wie üblich, daher werde ich ihn weglassen.

1. IAM-Einstellungen

Es ist nicht nur die der Lambda-Funktion zugewiesene IAM-Rolle erforderlich, sondern auch der in CircleCI festgelegte IAM-Benutzer.

IAM-Rollenrichtlinie, die der Lambda-Funktion zugewiesen ist

Dies hängt davon ab, was die Funktion tun soll. Wenn Sie jedoch vertrauliche Informationen mit KMS übertragen möchten, einer einzigartigen Funktion von Lamvery, verfügen Sie über die folgenden Berechtigungen.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": [
                "arn:aws:kms:<region>:<account-number>:key/<key-id>"
            ]
        }
    ]
}

Ersetzen Sie "", "", "<Schlüssel-ID>" entsprechend. Klicken Sie hier, um einen KMS-Schlüssel zu erstellen (geben Sie eine Schlüssel-ID ein) ↓ https://docs.aws.amazon.com/ja_jp/kms/latest/developerguide/create-keys.html

** Notieren Sie sich ARN [^ 3], da diese Rolle in den folgenden Kapiteln verwendet wird. ** **.

In CircleCI festzulegende IAM-Benutzerrichtlinie

Ich glaube nicht, dass sich hier viel ändert. Wenn es schwierig ist, eins nach dem anderen festzulegen, erlaubt lambda: * alle Ressourcen (" Resource ":" * "), aber in einigen Fällen kann es ant sein, aber iam: PassRole erlaubt alle Ressourcen Es ist sehr gefährlich, also solltest du damit aufhören. [^ 4]

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "lambda:*",
                "iam:PassRole"
            ],
            "Resource": [
                "arn:aws:lambda:<region>:<account-number>:function:<function-name>",
                "arn:aws:lambda:<region>:<account-number>:function:<function-name>:*",
                "<function-role-arn>"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "lambda:CreateFunction",
                "lambda:ListFunctions",
                "lambda:ListVersionsByFunction"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

Ersetzen Sie "", "", "" entsprechend. Das enthält die zuvor erstellte Rollen-ARN [^ 3].

** Notieren Sie sich die Anmeldeinformationen dieses Benutzers, da wir sie im nächsten Kapitel verwenden werden. ** **.

Holen Sie sich die IAM-Benutzeranmeldeinformationen und legen Sie sie in CircleCI fest

  1. Öffnen Sie die Projekteinstellungen image
  2. Wählen Sie AWS-Berechtigung image
  3. Geben Sie den Berechtigungsnachweis ein image

2. Installation und Konfiguration von Lamvery

Installieren Sie Lamvery und generieren Sie die Konfigurationsdatei

$ pip install lamvery
$ lamvery init
lamvery: Output initial file: .lamvery.yml
lamvery: Output initial file: .lamvery.exclude.yml
lamvery: Output initial file: .lamvery.event.yml
lamvery: Output initial file: .lamvery.secret.yml

Bearbeiten Sie die Einstellungsdatei

Ersetzen Sie jede Einstellung unter "Region" und "Konfiguration" entsprechend. Wenn der Teil von "{{env ['AWS_LAMBDA_ROLE']}}" ein privates Repository ist, ist es meiner Meinung nach in Ordnung, wenn sich die ARN der Rolle im Repository befindet. Wenn Sie die Umgebungsvariable auf die gleiche Weise übergeben möchten, können Sie sie unter "Projekteinstellungen" -> "Umgebungsvariablen" in CircleCI festlegen.

yaml:.lamvery.yml


profile: null
region: us-east-1
versioning: false
default_alias: master
configuration:
  name: lamvery-deploy-sample
  runtime: python2.7
  role: {{ env['AWS_LAMBDA_ROLE'] }}
  handler: lambda_function.lambda_handler
  description: This is a sample lambda function.
  timeout: 10
  memory_size: 128

Punkte setzen

Implementieren Sie die Funktion und listen Sie die erforderlichen Bibliotheken auf

Die Implementierung der Funktion ist nur Python-Codierung, daher werde ich sie weglassen. Im obigen Beispiel ist "handler" "lambda_function.lambda_handler", daher lautet die Datei wie folgt.

lambda_function.py


import lamvery


def lambda_handler(event, context):
    print(lamvery.secret.get('foo'))

In Python-Projekten schreibe ich es oft in require.txt, also mache ich es diesmal. Es wird empfohlen, die erforderlichen Bibliotheken wie unten gezeigt in virtualenv zu installieren und sie dann in eine Datei zu schreiben.

pip install flake8
pip freeze > requirements.txt

Auf diese Weise können Sie dieselbe Bibliothek installieren, indem Sie auf CircleCI Folgendes ausführen.

pip install -r requirements.txt

Beschreiben der CircleCI-Einstellungen

Beschreiben Sie wie folgt.

circle.yml


---
machine:
  python:
    version: 2.7

dependencies:
  pre:
    - |
      virtualenv .venv
      source .venv/bin/activate
      pip install -r requirements.txt

test:
  override:
    - |
      source .venv/bin/activate
      flake8 lambda_function.py

deployment:
  master-head:
    branch: master
    commands:
      - |
        source .venv/bin/activate
        lamvery deploy
  staging:
    branch: staging
    commands:
      - |
        source .venv/bin/activate
        lamvery deploy -a staging -p
  production:
    branch: production
    commands:
      - |
        source .venv/bin/activate
        lamvery deploy -a production -p

Punkte setzen

--Erstellen Sie eine saubere virtauluenv-Umgebung mit dependencies.pre und installieren Sie die erforderlichen Bibliotheken darin Lamvery ist ebenfalls enthalten (Wenn Sie keine vertraulichen Informationen weitergeben, ist Lamvery für die Funktion selbst nicht erforderlich, sodass Sie sie separat installieren können.)

Let's deploy! Stellen Sie eine Pull-Anfrage und versuchen Sie, sie zusammenzuführen.

image

Sehen wir uns das Bereitstellungsergebnis an.

image

Wenn Sie sich die farbigen Protokolle ansehen, können Sie sehen, dass eine neue Version mit dem Namen "4" veröffentlicht und in "Produktion" umbenannt wurde.

Übrigens denke ich, dass der Alias "Production-Pre" gleichzeitig gesetzt ist, aber dies ist für das Rollback und Sie können im Notfall wie folgt ein Rollback durchführen. Sie können es zur Hand oder mit ChatBot treffen.

$ lamvery rollback -a production
lamvery: [Function] Previous version: 2
lamvery: [Alias] production: 4 -> 2

Informationen zur Ausführung der bereitgestellten Funktion

Beachten Sie bei der Ausführung von verschiedenen Ereignissen, dass jeder Alias eine eigene ARN hat [^ 3]. Es wird wie folgt angegeben. Im Falle der API kann der Alias durch den Parameter "Qualifier" angegeben werden. arn:aws:lambda:<region>:<account-number>:function:<function-name>:<alias>

Zusammenfassung

Einer der Zwecke beim Erstellen eines Tools namens Lamvery bestand darin, einen Lambda-Funktionsbereitstellungsablauf zu erstellen, den ich für "dies!" Also habe ich es vorgestellt. Es gibt keinen großen Unterschied zu der Methode, die bisher in EC2 usw. verwendet wurde, und ich bin mir des Flusses bewusst, der ohne Beschwerden verwendet werden kann. Wenn Sie jedoch Meinungen haben, wie es besser ist, dies zu tun, wäre ich Ihnen dankbar, wenn Sie uns Feedback aus dem Folgenden geben könnten.

https://github.com/marcy-terui/lamvery

TODO: Erstellen einer CloudFormation-Vorlage, die bis zur Vorderseite von CircleCI automatisiert wird

[^ 1]: Das einzige, was ich gefunden habe, war dies. Es ist sehr gut gemacht, aber diesmal ist es spezifischer für die Bereitstellung und die Richtung ist anders. [^ 2]: Node.js wurde nicht verifiziert, daher würde ich mich freuen, wenn Sie es versuchen und die Ergebnisse melden könnten (Java ...?) [^ 3]: Abkürzung für Amazon Resource Name [^ 4]: Sie können jede Rolle zuweisen → Sie können angeben, ob Sie eine Rolle mit Administrator- oder PowerUser-Berechtigungen haben → Sie können über Lambda tun, was Sie wollen [^ 5]: Es ist ein verwirrender Ausdruck, aber mir fällt nichts anderes ein. .. ..

Recommended Posts

Die Lambda-Funktion bietet Best Practice mit CircleCI + Lamvery
Stellen Sie Django serverlos mit Lambda bereit
AWS Lambda-Entwicklung Meine Best Practices
Persönliche Best Practices bei der Feinabstimmung mit Chainer
Best Practices für den Umgang mit Daten mit Pandas
[Piyopiyokai # 1] Spielen wir mit Lambda: Erstellen einer Lambda-Funktion
python3x: Lambda-Funktion
Erstellen Sie eine Python-Version der Lambda-Funktion (+ Lambda-Schicht) mit Serverless Framework
Stellen Sie Lambda-Funktionen sicher mit Python bereit, das mit denselben Optionen wie Amazon Linux erstellt wurde