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.
Node.js Es ist relativ einfach, da Sie "npm install" ausführen und "node_modules" in einer Zip-Datei zusammenstellen können. https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/nodejs-create-deployment-pkg.html
Java
Maven
oder Gradle
oder so ähnlich ist einfach
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-java-how-to-create-deployment-package.html
Python Eine ziemlich enttäuschende Prozedur (Kapitel Erstellen eines Bereitstellungspakets mit einer mit Virtualenv erstellten Python-Umgebung) https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html
Es gibt noch keine Best Practice, oder ich habe hier kaum etwas gesehen. [^ 1]
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]
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.
Sogenannter Typ → http://d.hatena.ne.jp/naoya/20140502/1399027655 Es ist eine Geschichte, die man machen kann, wenn man es kann.
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.
Es ist nicht nur die der Lambda-Funktion zugewiesene IAM-Rolle erforderlich, sondern auch der in CircleCI festgelegte IAM-Benutzer.
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 "
** Notieren Sie sich ARN [^ 3], da diese Rolle in den folgenden Kapiteln verwendet wird. ** **.
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 "
** Notieren Sie sich die Anmeldeinformationen dieses Benutzers, da wir sie im nächsten Kapitel verwenden werden. ** **.
$ 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
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
versioning: false
default_alias: master
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 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
--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.)
staging
und Production
fügen explizit eine Option hinzu, um Aliasnamen und Versionierung zu aktivieren
Sie können einen Aliasnamen mit "-a" angeben und die Versionierung mit "-p" aktivieren.Let's deploy! Stellen Sie eine Pull-Anfrage und versuchen Sie, sie zusammenzuführen.
Sehen wir uns das Bereitstellungsergebnis an.
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
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>
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