Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Eine Lambda-Ebene ist ein ZIP-Dateiarchiv mit ergänzendem Code oder ergänzenden Daten. Ebenen enthalten üblicherweise Bibliotheksabhängigkeiten, eine benutzerdefinierte Laufzeit oder Konfigurationsdateien. Das Erstellen einer Ebene umfasst drei allgemeine Schritte:
-
Verpacken Ihres Ebeneninhalts. Dies bedeutet, dass Sie ein .zip-Dateiarchiv erstellen, das die Abhängigkeiten enthält, die Sie in Ihren Funktionen verwenden möchten.
-
Erstellen Sie die Ebene in Lambda.
-
Fügen Sie die Ebene zu Ihren Funktionen hinzu.
Dieses Thema enthält Schritte und Anleitungen zum ordnungsgemäßen Verpacken und Erstellen einer Ruby-Lambda-Ebene mit externen Bibliotheksabhängigkeiten.
Themen
Voraussetzungen
Um die Schritte in diesem Abschnitt ausführen zu können, müssen Sie über folgende Voraussetzungen verfügen:
-
Ruby 3.3
, das mit dem gem
-Paketinstallationsprogramm verteilt wird.
In diesem Thema verweisen wir auf die layer-ruby
In der layer-ruby
-Beispielanwendung verpacken Sie die tzinfo
layer/
-Verzeichnis enthält die Skripten zur Generierung der Ebene. Das function/
-Verzeichnis enthält eine Beispielfunktion, mit deren Hilfe getestet werden kann, ob die Ebene funktioniert. Der größte Teil dieses Tutorials beschäftigt sich mit der Erstellung und Verpackung dieser Ebene.
Kompatibilität der Ruby-Ebene mit der Lambda-Laufzeitumgebung
Wenn Sie Code in einer Ruby-Ebene verpacken, geben Sie die Lambda-Laufzeitumgebungen an, mit denen der Code kompatibel ist. Um die Codekompatibilität mit einer Laufzeit zu beurteilen, sollten Sie sich überlegen, für welche Versionen von Ruby, für welche Betriebssysteme und für welche Befehlssatzarchitekturen der Code konzipiert ist.
Lambda-Ruby-Laufzeiten geben ihre Ruby-Version und ihr Betriebssystem an. In diesem Dokument verwenden Sie die Ruby 3.3-Runtime, die auf AL2 023 basiert. Weitere Informationen zu Laufzeitversionen finden Sie unter Unterstützte Laufzeiten. Wenn Sie eine Lambda-Funktion erstellen, geben Sie die Befehlssatzarchitektur an. In diesem Dokument verwenden Sie die x86_64
-Architektur. Weitere Informationen über Architekturen in Lambda finden Sie unter Auswahl und Konfiguration einer Befehlssatzarchitektur für Ihre Lambda-Funktion.
Wenn Sie Code verwenden, der in einem Paket bereitgestellt wird, definiert jeder Paketbetreuer unabhängig dessen Kompatibilität. Die meisten Gems sind vollständig in Ruby geschrieben und mit jeder Laufzeitumgebung kompatibel, die eine kompatible Ruby-Sprachversion verwendet.
Manchmal verwenden Gems eine Ruby-Feature, die Erweiterungen genannt wird, um Code zu kompilieren, oder sie enthalten vorkompilierten Code als Teil ihres Installationsprozesses. Wenn Sie auf einen Gem mit einer nativen Erweiterung angewiesen sind, müssen Sie die Kompatibilität mit dem Betriebssystem und der Befehlssatzarchitektur prüfen. Um die Kompatibilität zwischen Ihren Gems und Ihrer Ruby-Laufzeitumgebung zu beurteilen, müssen Sie Ihre Gems und deren Dokumentation untersuchen. Sie können feststellen, ob Ihr Gem Erweiterungen verwendet, indem Sie prüfen, ob extensions
in seiner Gem-Spezifikation definiert ist. Ruby identifiziert die Plattform, auf der es läuft, durch die globale Konstante RUBY_PLATFORM
. Die Lambda-Ruby-Laufzeit definiert die Plattform als aarch64-linux
, wenn sie auf der arm64
-Architektur läuft, oder als x86_64-linux
, wenn sie auf der x86_64
-Architektur läuft. Es gibt keine garantierte Möglichkeit, zu überprüfen, ob ein Gem mit diesen Plattformen kompatibel ist, aber einige Gems deklarieren ihre unterstützten Plattformen über das platform
Gem-Spezifikationsattribut.
Ebenenpfade für Ruby-Laufzeiten
Wenn Sie einer Funktion eine Ebene hinzufügen, lädt Lambda den Ebeneninhalt in das Verzeichnis /opt
der Ausführungsumgebung. Für jede Lambda-Laufzeit enthält die Variable PATH
bereits spezifische Ordnerpfade innerhalb des Verzeichnisses /opt
. Um sicherzustellen, dass Lambda Ihren Layer-Inhalt aufnimmt, sollte Ihre Layer-.zip-Datei ihre Abhängigkeiten in den folgenden Ordnerpfaden haben:
-
ruby/gems/
, wobei x die Ruby-Version in Ihrer Runtime ist, z. B.x
3.3.0
. -
ruby/lib/
Verwenden Sie in diesem Dokument den ruby/gems/
-Pfad. Lambda erwartet, dass der Inhalt dieses Verzeichnisses der Struktur eines Bundler-Installationsverzeichnisses entspricht. Speichern Sie Ihre Gem-Abhängigkeiten im Unterverzeichnis x
/gems
des Ebenenpfads, zusammen mit anderen Metadaten-Unterverzeichnissen. Die resultierende Ebenen-.zip-Datei, die Sie in diesem Tutorial erstellen, hat beispielsweise die folgende Verzeichnisstruktur:
layer_content.zip
└ ruby
└ gems
└ 3.3.0
└ gems
└ tzinfo-2.0.6
└ <other_dependencies> (i.e. dependencies of the tzinfo package)
└ ...
└ <metadata generated by bundle>
Die tzinfo
-Bibliothek befindet sich korrekt im ruby/gems/3.3.0/
-Verzeichnis. Dadurch wird sichergestellt, dass Lambda die Bibliothek bei Funktionsaufrufen finden kann.
Verpacken des Ebeneninhalts
In diesem Beispiel verpacken Sie die Ruby tzinfo
-Bibliothek in einer Ebenen-.zip-Datei. Führen Sie die folgenden Schritte aus, um den Ebeneninhalt zu installieren und zu verpacken.
So installieren und verpacken Sie Ihren Ebeneninhalt
-
Klonen Sie das
aws-lambda-developer-guide
GitHub Repo, das den Beispielcode enthält, den Sie im Verzeichnis benötigen. sample-apps/layer-ruby
git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
-
Wechseln Sie in das Verzeichnis
layer
derlayer-ruby
-Beispielanwendung. Dieses Verzeichnis enthält die Skripts, die Sie verwenden, um die Ebene ordnungsgemäß zu erstellen und zu verpacken.cd aws-lambda-developer-guide/sample-apps/layer-ruby/layer
-
Untersuchen Sie die
Gemfile
. In dieser Datei werden die Abhängigkeiten definiert, die Sie in die Ebene aufnehmen wollen, nämlich die tzinfo
-Bibliothek. Sie können diese Datei so aktualisieren, dass sie alle Abhängigkeiten enthält, die Sie in Ihre eigene Ebene aufnehmen möchten.Beispiel Gemfile
source "https://rubygems.org" gem "tzinfo"
-
Stellen Sie sicher, dass Sie berechtigt sind, beide Skripte auszuführen.
chmod 744 1-install.sh && chmod 744 2-package.sh
-
Führen Sie das Skript
1-install.sh
mit dem folgenden Befehl aus. ./1-install.sh
Dieses Skript konfiguriert Bundler für die Installation von Abhängigkeiten in Ihrem Projektverzeichnis. Anschließend werden alle erforderlichen Abhängigkeiten in das
vendor/bundle/
-Verzeichnis installiert.Beispiel 1-install.sh
bundle config set --local path 'vendor/bundle' bundle install
-
Führen Sie das Skript
2-package.sh
mit dem folgenden Befehl aus. ./2-package.sh
Dieses Skript kopiert den Inhalt aus dem
vendor/bundle
-Verzeichnis in ein neues Verzeichnis mit dem Namenruby
. Anschließend wird der Inhalt des Verzeichnissesruby
in eine Datei namenslayer_content.zip
gepackt. Dies ist die ZIP-Datei für Ihre Ebene. Sie können die Datei entpacken und überprüfen, ob sie die richtige Dateistruktur enthält, wie im Abschnitt Ebenenpfade für Ruby-Laufzeiten gezeigt.Beispiel 2-package.sh
mkdir -p ruby/gems/3.3.0 cp -r vendor/bundle/ruby/3.3.0/* ruby/gems/3.3.0/ zip -r layer_content.zip ruby
Erstellen der Ebene
In diesem Abschnitt nehmen Sie die layer_content.zip
-Datei, die Sie im vorherigen Abschnitt generiert haben und laden sie als Lambda-Ebene hoch. Sie können eine Ebene mit der AWS Management Console oder der Lambda-API über die AWS Command Line Interface (AWS CLI) hochladen. Wenn Sie Ihre Layer-.zip-Datei hochladen, geben Sie ruby3.3
im folgenden PublishLayerVersion AWS CLI Befehl die kompatible Laufzeit und die kompatible arm64
Architektur an.
aws lambda publish-layer-version --layer-name ruby-requests-layer \ --zip-file fileb://layer_content.zip \ --compatible-runtimes ruby3.3 \ --compatible-architectures "arm64"
Notieren Sie sich aus der Antwort den LayerVersionArn
, der wie arn:aws:lambda:us-east-1:
aussieht. Sie benötigen diesen Amazon-Ressourcennamen (ARN) im nächsten Schritt dieses Tutorials, wenn Sie die Ebene zu Ihrer Funktion hinzufügen.123456789012
:layer:ruby-requests-layer:1
Hinzufügen der Ebene zur Funktion
In diesem Abschnitt stellen Sie eine Beispiel-Lambda-Funktion bereit, die die tzinfo
-Bibliothek in ihrem Funktionscode verwendet und fügen dann die Ebene hinzu. Um die Funktion bereitzustellen, benötigen Sie eine Definieren von Lambda-Funktionsberechtigungen mit einer Ausführungsrolle. Wenn Sie noch keine Ausführungsrolle haben, folgen Sie den Schritten im zusammenklappbaren Abschnitt.
So erstellen Sie eine Ausführungsrolle
-
Öffnen Sie die Seite Roles (Rollen)
in der IAM-Konsole. -
Wählen Sie Rolle erstellen.
-
Erstellen Sie eine Rolle mit den folgenden Eigenschaften.
-
Trusted entity (Vertrauenswürdige Entität) – Lambda.
-
Berechtigungen — AWSLambdaBasicExecutionRole.
-
Role name (Name der Rolle –
lambda-role
.
Die AWSLambdaBasicExecutionRoleRichtlinie verfügt über die Berechtigungen, die die Funktion benötigt, um Protokolle in Logs zu CloudWatch schreiben.
-
Der Lambda-Funktionscodetzinfo
-Bibliothek und gibt dann den Statuscode und eine lokalisierte Datumszeichenfolge zurück.
require 'json'
require 'tzinfo'
def lambda_handler(event:, context:)
tz = TZInfo::Timezone.get('America/New_York')
{ statusCode: 200, body: tz.to_local(Time.utc(2018, 2, 1, 12, 30, 0)) }
end
So stellen Sie die Lambda-Funktion bereit
-
Navigieren Sie zum
function/
Verzeichnis . Wenn Sie sich gerade in demlayer/
-Verzeichnis befinden, führen Sie den folgenden Befehl aus:cd ../function
-
Erstellen Sie mit dem folgenden Befehl ein Bereitstellungspaket in Form einer .zip-Datei:
zip my_deployment_package.zip lambda_function.rb
-
Bereitstellen der Funktion. Ersetzen Sie im folgenden AWS CLI Befehl den
--role
Parameter durch den ARN Ihrer Ausführungsrolle:aws lambda create-function --function-name ruby_function_with_layer \ --runtime ruby3.3 \ --architectures "arm64" \ --handler lambda_function.lambda_handler \ --role
arn:aws:iam::
\ --zip-file fileb://my_deployment_package.zip123456789012
:role/lambda-role -
Fügen Sie als Nächstes die Ebene zu Ihrer Funktion hinzu. Ersetzen Sie im folgenden AWS CLI Befehl den
--layers
Parameter durch den ARN der Layer-Version, den Sie zuvor notiert haben:aws lambda update-function-configuration --function-name ruby_function_with_layer \ --cli-binary-format raw-in-base64-out \ --layers "
arn:aws:lambda:us-east-1:
"123456789012
:layer:ruby-requests-layer:1 -
Versuchen Sie abschließend, Ihre Funktion mit dem folgenden AWS CLI Befehl aufzurufen:
aws lambda invoke --function-name ruby_function_with_layer \ --cli-binary-format raw-in-base64-out \ --payload '{ "key": "value" }' response.json
Die Ausgabe sollte in etwa wie folgt aussehen:
{ "StatusCode": 200, "ExecutedVersion": "$LATEST" }
Die
response.json
-Ausgabedatei enthält Details zur Antwort.
Sie können jetzt die Ressourcen, die Sie für dieses Tutorial erstellt haben, löschen, es sei denn, Sie möchten sie behalten. Durch das Löschen von AWS Ressourcen, die Sie nicht mehr verwenden, vermeiden Sie unnötige Kosten für Ihre AWS-Konto.
So löschen Sie die Lambda-Ebene
-
Öffnen Sie die Seite Ebenen
der Lambda-Konsole. -
Wählen Sie die Ebene aus, die Sie erstellt haben.
-
Klicken Sie auf Löschen und dann erneut auf Löschen.
So löschen Sie die Lambda-Funktion:
-
Öffnen Sie die Seite Funktionen
der Lambda-Konsole. -
Wählen Sie die Funktion aus, die Sie erstellt haben.
-
Wählen Sie Aktionen, Löschen aus.
-
Geben Sie
confirm
in das Texteingabefeld ein und wählen Sie Delete (Löschen) aus.