Lambda und Layer sind praktisch, es gibt jedoch ein Limit von 5 pro Funktion. Ich denke, dass es viele Fälle gibt, in denen Ebenen als ein Modul betrieben werden, aber es ist unerwartet unzureichend oder es ist mühsam, eine nach der anderen hinzuzufügen. Verwalten Sie Ihre Lieblingsmodule in der bekannten Datei "require.txt" und kombinieren Sie sie zu einer Ebene.
Erstellen Sie eine Anforderung.txt, die die 6 Module im Test importiert.
requirement.txt
selenium
requests
Pillow
lxml
numpy
Flask
Führen Sie dann das folgende Skript in derselben Ebene aus. Docker Bearbeiten Sie die Python-Version und die aws-Befehlsargumente nach Bedarf.
mkdir -p python/bin/
docker run --rm -v $(pwd):/var/task -w /var/task lambci/lambda:build-python3.7 pip install -r requirements.txt -t ./python
zip -r layer.zip python
aws lambda publish-layer-version --layer-name favorites --zip-file fileb://layer.zip --compatible-runtimes python3.7 --region ap-northeast-1
rm -rf layer.zip python
Sie können jetzt in Lambda registrierte Ebenen hinzufügen. Die Testfunktion wurde von aus diesem Repository Serverless Framework bereitgestellt und bestätigt. das ist alles!
Wenn Sie Serverless Framework verwenden, vereinfachen serverless-python-Anforderungen die Modulverwaltung, und es ist besser, nicht mithilfe von Ebenen zu trennen. Ich denke, dass Infrastruktur als Code gründlich und elegant ist. Wenn jedoch die Obergrenze der Anzahl der Schichten zu einem Hindernis wird oder wenn das Modul im Paket enthalten ist, ist die Wartezeit für die Bereitstellung lang. Ich persönlich bevorzuge es, mich nach Schichten zu trennen, da ich eine kleine Drehung höre.
Wenn Sie Selen verwenden, ist es übrigens einfacher, die Binärdateien zusammen zu verwalten. Unten finden Sie das Skript, das auch die Binärdatei hinzufügt. Abgesehen davon ist das kopflose Selen, das mit dem mir bekannten Lambda auf Python läuft, ein Satz dieser Skriptversion und von Python3.7. Aus diesem Grund verwenden Sie eine ältere Release-Version.
mkdir -p python/bin/
+ curl -SL https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-37/stable-+ headless-chromium-amazonlinux-2017-03.zip > headless-chromium.zip
+ unzip headless-chromium.zip -d python/bin/
+ curl -SL https://chromedriver.storage.googleapis.com/2.37/chromedriver_linux64.zip > chromedriver.zip
+ unzip chromedriver.zip -d python/bin/
+ rm -rf chromedriver.zip headless-chromium.zip
docker run --rm -v $(pwd):/var/task -w /var/task lambci/lambda:build-python3.7 pip install selenium -t ./python
zip -r layer.zip python
aws lambda publish-layer-version --layer-name selenium_with_bin --zip-file fileb://layer.zip --compatible-runtimes python3.7 --region ap-northeast-1
rm -rf layer.zip python
Die Testfunktion, mit der die chromeOptions für Selen so eingestellt werden, dass sie auf Lambda und dem von dieser Schicht erhaltenen Binärpfad ordnungsgemäß funktioniert, lautet hier. py).
Referenz https://github.com/adieuadieu/serverless-chrome/issues/133 https://dev.classmethod.jp/articles/managing-external-modules-with-serverless-framework-plugin/ https://www.npmjs.com/package/serverless-python-requirements https://hacknote.jp/archives/49974/ https://dev.classmethod.jp/articles/lambda-layer-first-action/
Recommended Posts