Befehle ausführen, wenn Sie eine EC2 Instance mit Benutzerdateneingabe starten - Amazon Elastic Compute Cloud

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.

Befehle ausführen, wenn Sie eine EC2 Instance mit Benutzerdateneingabe starten

Wenn Sie eine EC2 Amazon-Instance starten, können Sie Benutzerdaten an die Instance übergeben, die zur Ausführung automatisierter Konfigurationsaufgaben oder zur Ausführung von Skripten nach dem Start der Instance verwendet wird.

Wenn Sie an komplexeren Automatisierungsszenarien interessiert sind, könnten Sie AWS CloudFormation oder in Betracht ziehen AWS OpsWorks. Weitere Informationen finden Sie hier:

Auf Linux-Instances können Sie zwei Arten von Benutzerdaten an Amazon übergebenEC2: Shell-Skripte und Cloud-Init-Direktiven. Sie können diese Daten auch als Klartext, als Datei (dies ist nützlich, um Instances mit den Befehlszeilentools zu starten) oder als Base64-codierten Text (für Aufrufe) an den Launch-Instance-Assistenten übergeben. API

Auf Windows-Instances verarbeiten die Launch-Agents Ihre Benutzerdatenskripts. In den folgenden Abschnitten werden die Unterschiede im Umgang mit Benutzerdaten auf den einzelnen Betriebssystemen beschrieben.

Benutzerdaten in AWS Management Console

Sie können Instance-Benutzerdaten angeben, wenn Sie die Instance starten. Wenn das Root-Volume der Instance ein EBS Volume ist, können Sie die Instance auch beenden und ihre Benutzerdaten aktualisieren.

Geben Sie die Benutzerdaten der Instanz beim Start mit dem Launch Wizard an

Sie können Benutzerdaten angeben, wenn Sie eine Instance mit dem Launch Wizard in der EC2 Konsole starten. Um Benutzerdaten beim Start anzugeben, folgen Sie dem Verfahren zum Starten einer Instance. Das Feld User data (Benutzerdaten) befindet sich im Abschnitt Erweiterte Details des Launch Instance Wizard. Geben Sie Ihr PowerShell Skript in das Feld Benutzerdaten ein und schließen Sie dann den Vorgang zum Starten der Instance ab.

Im folgenden Screenshot des Feldes Benutzerdaten erstellt das Beispielskript eine Datei im temporären Windows-Ordner und verwendet das aktuelle Datum und die Uhrzeit im Dateinamen. Wenn Sie <persist>true</persist> einfügen, wird das Skript bei jedem Neustart oder Start der Instance ausgeführt. Wenn Sie das Kontrollkästchen Benutzerdaten wurden bereits base64-codiert leer lassen, führt die EC2 Amazon-Konsole die Base64-Kodierung für Sie durch.

Textfeld für erweiterte Details für Benutzerdaten.

Weitere Informationen finden Sie unter Geben Sie die Benutzerdaten der Instanz beim Start mit dem Launch Wizard an. Ein Linux-Beispiel, das das verwendet, finden Sie unter AWS CLI. Benutzerdaten und AWS CLI Ein Windows-Beispiel, das die Tools für Windows verwendet PowerShell, finden Sie unterBenutzerdaten und die Tools für Windows PowerShell.

Anzeigen und Aktualisieren der Instance-Benutzerdaten

Sie können die Instance-Benutzerdaten für jede beliebige Instance anzeigen und die Instance-Benutzerdaten für eine angehaltene Instance aktualisieren.

So aktualisieren Sie die Benutzerdaten für eine Instance mit der Konsole
  1. Öffnen Sie die EC2 Amazon-Konsole unter https://console.aws.amazon.com/ec2/.

  2. Wählen Sie im Navigationsbereich Instances aus.

  3. Wählen Sie die Instance und dann Aktionen, Instance-Status, Instance anhalten aus.

    Warnung

    Wenn Sie eine Instance anhalten, werden sämtliche Daten auf allen Instance-Speicher-Volumes gelöscht. Wenn Sie Daten von Instance-Speicher-Volumes behalten möchten, sichern Sie diese auf einem persistenten Speicher.

  4. Wenn Sie zur Bestätigung aufgefordert werden, wählen Sie Stop aus. Das Anhalten der Instance kann einige Minuten dauern.

  5. Wählen Sie mit der ausgewählten Instance Aktionen, Instance-Einstellungen, Benutzerdaten bearbeiten aus. Die Benutzerdaten können nicht geändert werden, solange die Instance ausgeführt wird; Sie können die Benutzerdaten nur anzeigen.

  6. Aktualisieren Sie die Benutzerdaten im Dialogfeld View/Change User Data (Benutzerdaten anzeigen/ändern) und wählen Sie dann die Option Save (Speichern). Um die Benutzerdaten-Skripts bei jedem Neustart oder Starten der Instance auszuführen, fügen Sie <persist>true</persist> hinzu, wie im folgenden Beispiel gezeigt:

    Dialogfeld für Benutzerdaten bearbeiten.
  7. Starten Sie die Instance. Wenn Sie die Ausführung von Benutzerdaten für nachfolgende Neustarts oder Starts aktiviert haben, werden die aktualisierten Benutzerdaten-Skripts als Teil des Instance-Startprozesses ausgeführt.

Wie Amazon EC2 mit Benutzerdaten für Linux-Instances umgeht

In den folgenden Beispielen werden die Befehle von Install a LAMP server on Amazon Linux 2 in ein Shell-Skript und eine Reihe von Cloud-Init-Direktiven umgewandelt, die beim Start der Instance ausgeführt werden. In den Beispielen werden die folgenden Aufgaben von den Benutzerdaten ausgeführt:

  • Die Softwarepakete der Bereitstellung werden aktualisiert.

  • Der notwendige Webserver sowie die ebensolchen php- und mariadb-Pakete werden installiert.

  • Der httpd-Service wird mithilfe des Befehls systemctl gestartet und aktiviert.

  • Der ec2-user wird der Apache-Gruppe hinzugefügt.

  • Eigentümer und Dateiberechtigungen für das Webverzeichnis und die darin enthaltenen Daten werden festgelegt.

  • Eine einfache Webseite wird erstellt, um den Webserver und PHP die Engine zu testen.

Voraussetzungen

Die Beispiele in diesem Thema setzen Folgendes voraus:

  • Ihre Instanz hat einen öffentlichen DNS Namen, der über das Internet erreichbar ist.

  • Die Ihrer Instance zugeordnete Sicherheitsgruppe ist so konfiguriert, dass sie Datenverkehr SSH (Port 22) zulässt, sodass Sie eine Verbindung mit der Instance herstellen können, um die ausgegebenen Logdateien einzusehen.

  • Ihre Instance wird mit einem Amazon Linux 2 gestartetAMI. Diese Anleitung ist zur Verwendung mit Amazon Linux 2 gedacht. Die Befehle und Anweisungen funktionieren möglicherweise nicht bei anderen Linux-Distributionen. Weitere Informationen zu anderen Bereitstellungen, z. B. zu ihrer Unterstützung von Cloud-Init, finden Sie in der jeweiligen Dokumentation.

Benutzerdaten und Shell-Skripts

Shell-Skripts sind, sofern Sie sich damit auskennen, die einfachste und vollständigste Methode, mit der Sie einer Instance beim Start Anweisungen übermitteln. Wenn diese Skripts beim Start ausgeführt werden, verlängert sich dadurch die Dauer des Instance-Starts. Erlauben Sie einige Minuten für die vollständige Ausführung der Aufgaben, bevor Sie überprüfen, ob die Benutzerskripte vollständig ausgeführt wurden.

Wichtig

Standardmäßig werden Benutzerdatenskripte und Cloud-init-Direktiven nur während des Startzyklus ausgeführt, wenn Sie eine Instance zum ersten Mal starten. Sie können Ihre Konfiguration aktualisieren, um sicherzustellen, dass Ihre Benutzerdatenskripte und Cloud-Init-Direktiven bei jedem Neustart der Instance ausgeführt werden. Weitere Informationen finden Sie unter Wie kann ich Benutzerdaten verwenden, um bei jedem Neustart meiner Amazon EC2 Linux-Instance automatisch ein Skript auszuführen? im AWS Knowledge Center.

Benutzerdaten-Shell-Skripts müssen mit den Zeichen #! und dem Pfad zu dem Interpreter beginnen, der das Skript lesen soll (üblicherweise /bin/bash)). Eine Einführung in Shell-Scripting finden Sie im Bash-Referenzhandbuch auf der GNUBetriebssystem-Website.

Als Benutzerdaten eingegebene Skripte werden als Stammbenutzer ausgeführt. Verwenden Sie daher nicht den sudo-Befehl im Skript. Denken Sie daran, dass alle von Ihnen erstellten Dateien dem Stammbenutzer gehören. Wenn Sie Zugriff auf die Dateien durch einen anderen Benutzer als den Stammbenutzer benötigen, sollten Sie die Berechtigungen im Skript entsprechend ändern. Außerdem können Sie keine Befehle verwenden, die Benutzerfeedback erfordern (z. B. yum update ohne das -y-Flag ), da das Skript nicht interaktiv ausgeführt wird.

Wenn Sie ein AWS API, einschließlich des AWS CLI, in einem Benutzerdatenskript verwenden, müssen Sie beim Starten der Instance ein Instanzprofil verwenden. Ein Instanzprofil stellt die entsprechenden AWS Anmeldeinformationen bereit, die das Benutzerdatenskript benötigt, um den API Anruf auszulösen. Weitere Informationen finden Sie im IAM Benutzerhandbuch unter Verwenden von Instanzprofilen. Die Berechtigungen, die Sie der IAM Rolle zuweisen, hängen davon ab, welche Dienste Sie mit dem aufrufenAPI. Weitere Informationen finden Sie unter IAMRollen für Amazon EC2.

Die Ausgabeprotokolldatei von Cloud-Init zeichnet die Ausgabe der Konsole auf, was die Behebung von Fehlern an den Skripts vereinfacht, falls sich die Instance nach dem Start nicht verhält wie erwartet. Um die Protokolldatei anzuzeigen, stellen Sie eine Verbindung mit der Instance her und öffnen Sie /var/log/cloud-init-output.log.

Wird ein Benutzerdatenskript verarbeitet, dann wird es nach kopiert und von dort aus ausgeführ /var/lib/cloud/instances/instance-id/. Das Skript wird nach der Ausführung nicht gelöscht. Stellen Sie sicher, dass Sie die Benutzerdatenskripts löschen, /var/lib/cloud/instances/instance-id/ bevor Sie sie AMI aus der Instanz erstellen. Andernfalls ist das Skript in diesem Verzeichnis auf jeder Instance vorhanden, die von der aus gestartet wirdAMI.

Aktualisieren Sie die Benutzerdaten der Instanz

Um die Instance-Benutzerdaten aktualisieren zu können, müssen Sie zuerst die Instance anhalten. Wenn die Instance ausgeführt wird, können Sie die Benutzerdaten anzeigen, sie können jedoch nicht ändern.

Warnung

Wenn Sie eine Instance anhalten, werden sämtliche Daten auf allen Instance-Speicher-Volumes gelöscht. Wenn Sie Daten von Instance-Speicher-Volumes behalten möchten, sichern Sie diese auf einem persistenten Speicher.

Ändern von Instance-Benutzerdaten
  1. Öffnen Sie die EC2 Amazon-Konsole unter https://console.aws.amazon.com/ec2/.

  2. Wählen Sie im Navigationsbereich Instances aus.

  3. Wählen Sie die Instance und dann Instance state (Instance-Status), Stop instance (Instance anhalten) aus. Wenn diese Option deaktiviert ist, wurde die Instance entweder bereits angehalten oder das Root-Gerät ist ein Instance-Speicher-Volume.

  4. Wenn Sie zur Bestätigung aufgefordert werden, wählen Sie Stop aus. Das Anhalten der Instance kann einige Minuten dauern.

  5. Wählen Sie mit der ausgewählten Instance Aktionen, Instance-Einstellungen, Benutzerdaten bearbeiten aus.

  6. Ändern Sie die Benutzerdaten nach Bedarf und wählen Sie dann Speichern.

  7. Starten Sie die Instance. Die neuen Benutzerdaten werden nach dem Start in Ihrer Instance angezeigt, Benutzerdatenskripts werden jedoch nicht ausgeführt.

Benutzerdaten und Cloud-Init-Anweisungen

Das Cloud-Init-Paket konfiguriert bestimmte Aspekte einer neuen Amazon Linux-Instance bei deren Start. Insbesondere wird die Datei .ssh/authorized_keys für den ec2-user konfiguriert, sodass Sie sich mit dem eigenen privaten Schlüssel anmelden können. Weitere Informationen zu den Konfigurationsaufgaben, die das Cloud-Init-Paket für Amazon Linux-Instances ausführt, finden Sie unter Using cloud-init on Amazon Linux 2 im Amazon Linux 2-Benutzerhandbuch.

Die Cloud-Init-Anweisungen können wie ein Skript auch beim Start einer Instance an diese weitergeleitet werden, wenngleich sich die Syntax unterscheidet. Weitere Informationen zu cloud-init finden Sie unter http://cloudinit.readthedocs.org/en/latest/index.html.

Wichtig

Standardmäßig werden Benutzerdatenskripte und Cloud-init-Direktiven nur während des Startzyklus ausgeführt, wenn Sie eine Instance zum ersten Mal starten. Sie können Ihre Konfiguration aktualisieren, um sicherzustellen, dass Ihre Benutzerdatenskripte und Cloud-Init-Direktiven bei jedem Neustart der Instance ausgeführt werden. Weitere Informationen finden Sie unter Wie kann ich Benutzerdaten verwenden, um bei jedem Neustart meiner Amazon EC2 Linux-Instance automatisch ein Skript auszuführen? im AWS Knowledge Center.

Wenn diese Skripts beim Start ausgeführt werden sollen, verlängert sich dadurch die Dauer des Instance-Starts. Erlauben Sie einige Minuten für die vollständige Ausführung der Aufgaben, bevor Sie überprüfen, ob die Benutzerdatenanweisungen vollständig durchgeführt wurden.

Leiten Sie Cloud-Init-Anweisungen wie folgt an eine Instance mit Benutzerdaten weiter:
  1. Folgen Sie dem Verfahren unter Starten einer Instance. Das Feld User data (Benutzerdaten) befindet sich im Abschnitt Erweiterte Details des Launch Instance Wizard. Geben Sie den Text Ihrer cloud-init-Anweisung im Feld User Data (Benutzerdaten) ein und führen Sie dann das Verfahren zum Starten der Instance aus.

    Das folgende Beispiel zeigt, wie Anweisungen einen Webserver in Amazon Linux 2 erstellen und konfigurieren. Die Zeile #cloud-config ganz oben ist erforderlich, um die Befehle als cloud-init-Anweisungen zu identifizieren.

    #cloud-config repo_update: true repo_upgrade: all packages: - httpd - mariadb-server runcmd: - [ sh, -c, "amazon-linux-extras install -y lamp-mariadb10.2-php7.2 php7.2" ] - systemctl start httpd - sudo systemctl enable httpd - [ sh, -c, "usermod -a -G apache ec2-user" ] - [ sh, -c, "chown -R ec2-user:apache /var/www" ] - chmod 2775 /var/www - [ find, /var/www, -type, d, -exec, chmod, 2775, {}, \; ] - [ find, /var/www, -type, f, -exec, chmod, 0664, {}, \; ] - [ sh, -c, 'echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php' ]
  2. Geben Sie der Instance ausreichend Zeit zum Starten und zum Ausführen der Anweisungen in Ihren Benutzerdaten, dann überprüfen Sie, ob die Anweisungen die gewünschten Aufgaben ausgeführt haben.

    Geben Sie für dieses Beispiel in einem Webbrowser die URL aus der PHP Testdatei stammende Anweisung ein. Dies URL ist die öffentliche DNS Adresse Ihrer Instanz, gefolgt von einem Schrägstrich und dem Dateinamen.

    http://my.public.dns.amazonaws.com/phpinfo.php

    Sie sollten die PHP Informationsseite sehen. Wenn Sie die PHP Informationsseite nicht sehen können, überprüfen Sie, ob die von Ihnen verwendete Sicherheitsgruppe eine Regel zum Zulassen von Datenverkehr HTTP (Port 80) enthält. Weitere Informationen finden Sie unter Sicherheitsgruppenregeln konfigurieren.

  3. (Optional) Wenn Ihre Anweisungen nicht die Aufgaben erfüllt haben, die Sie erwartet haben oder wenn Sie nur überprüfen möchten, ob Ihre Direktiven ohne Fehler abgeschlossen wurden, stellen Sie eine Verbindung mit der Instance her, untersuchen Sie die Ausgabeprotokolldatei (/var/log/cloud-init-output.log) und suchen Sie nach Fehlermeldungen in der Ausgabe. Weitere Informationen zur Fehlerbehebung erhalten Sie, indem Sie den Anweisungen die folgende Zeile hinzufügen:

    output : { all : '| tee -a /var/log/cloud-init-output.log' }

    Diese Anweisung übermittelt die Ausgabe von runcmd an /var/log/cloud-init-output.log.

Benutzerdaten und AWS CLI

Sie können den verwenden, AWS CLI um die Benutzerdaten für Ihre Instance anzugeben, zu ändern und anzuzeigen. Informationen zum Anzeigen von Benutzerdaten Ihrer Instance mithilfe von Instance-Metadaten erhalten Sie unter Auf Instanz-Metadaten für eine EC2 Instanz zugreifen.

Unter Windows können Sie den AWS Tools for Windows PowerShell anstelle von verwenden AWS CLI. Weitere Informationen finden Sie unter Benutzerdaten und die Tools für Windows PowerShell.

Beispiel: Angeben von Benutzerdaten beim Start

Verwenden Sie den Befehl run-instances mit dem Parameter --user-data, um Benutzerdaten beim Start Ihrer Instance anzugeben. Mit run-instances AWS CLI führt der die Base64-Kodierung der Benutzerdaten für Sie durch.

Im folgenden Beispiel wird gezeigt, wie Sie ein Skript als String auf der Befehlszeile angeben:

aws ec2 run-instances --image-id ami-abcd1234 --count 1 --instance-type m3.medium \ --key-name my-key-pair --subnet-id subnet-abcd1234 --security-group-ids sg-abcd1234 \ --user-data echo user data

Im folgenden Beispiel wird gezeigt, wie Sie ein Skript mithilfe einer Textdatei angeben: Verwenden Sie beim Angeben der Datei das Präfix file://.

aws ec2 run-instances --image-id ami-abcd1234 --count 1 --instance-type m3.medium \ --key-name my-key-pair --subnet-id subnet-abcd1234 --security-group-ids sg-abcd1234 \ --user-data file://my_script.txt

Das folgende Element ist eine Beispieltextdatei mit einem Shell-Skript.

#!/bin/bash yum update -y service httpd start chkconfig httpd on
Beispiel: Modifizieren der Benutzerdaten einer angehaltenen Instance

Sie können die Benutzerdaten einer gestoppten Instanz mit dem modify-instance-attributeBefehl ändern. Mit modify-instance-attribute AWS CLI führt der keine Base64-Kodierung der Benutzerdaten für Sie durch.

  • Verwenden Sie auf einem Linux-Computer den Befehl „base64“, um die Benutzerdaten zu codieren.

    base64 my_script.txt >my_script_base64.txt
  • Verwenden Sie auf einem, Windows-Computer den Befehl „certutil“, um die Benutzerdaten zu codieren. Bevor Sie diese Datei mit dem verwenden können AWS CLI, müssen Sie die erste (BEGINCERTIFICATE) und letzte (ENDCERTIFICATE) Zeile entfernen.

    certutil -encode my_script.txt my_script_base64.txt notepad my_script_base64.txt

Verwenden Sie die Parameter --attribute und --value, um die codierte Textdatei zur Angabe der Benutzerdaten zu verwenden. Verwenden Sie beim Angeben der Datei das Präfix file://.

aws ec2 modify-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData --value file://my_script_base64.txt
Beispiel: Löschen der Benutzerdaten einer angehaltenen Instance

Um die vorhandenen Benutzerdaten zu löschen, verwenden Sie den modify-instance-attributeBefehl wie folgt:

aws ec2 modify-instance-attribute --instance-id i-1234567890abcdef0 --user-data Value=
Beispiel: Anzeigen von Benutzerdaten

Verwenden Sie den describe-instance-attributeBefehl, um die Benutzerdaten für eine Instanz abzurufen. Mit describe-instance-attribute AWS CLI führt der keine Base64-Decodierung der Benutzerdaten für Sie durch.

aws ec2 describe-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData

Im folgenden Beispiel wird die Ausgabe mit base64-Benutzerdaten verschlüsselt.

{ "UserData": { "Value": "IyEvYmluL2Jhc2gKeXVtIHVwZGF0ZSAteQpzZXJ2aWNlIGh0dHBkIHN0YXJ0CmNoa2NvbmZpZyBodHRwZCBvbg==" }, "InstanceId": "i-1234567890abcdef0" }
  • Verwenden Sie auf einem Linux-Computer die Option --query, um die codierten Benutzerdaten abzurufen, und den Befehl „base64“, um sie zu decodieren.

    aws ec2 describe-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData --output text --query "UserData.Value" | base64 --decode
  • Verwenden Sie auf einem Windows-Computer die Option --query, um die codierten Benutzerdaten abzurufen, und den Befehl „certutil“, um sie zu decodieren. Die codierte Ausgabe wird in einer, die decodierte Ausgabe in einer anderen Datei gespeichert.

    aws ec2 describe-instance-attribute --instance-id i-1234567890abcdef0 --attribute userData --output text --query "UserData.Value" >my_output.txt certutil -decode my_output.txt my_output_decoded.txt type my_output_decoded.txt

Es folgt eine Beispielausgabe.

#!/bin/bash yum update -y service httpd start chkconfig httpd on

Kombinieren von Shell-Skripts und cloud-init-Anweisungen

Standardmäßig können Sie jeweils nur einen Inhaltstyp in Benutzerdaten einbeziehen. Allerdings können Sie die Inhaltstypen text/cloud-config und text/x-shellscript in einer mehrteiligen MIME-Datei verwenden, um sowohl ein Shell-Skript als auch cloud-init-Anweisungen in Ihren Benutzerdaten einzubeziehen.

Nachfolgend wird das mehrteilige MIME-Format veranschaulicht.

Content-Type: multipart/mixed; boundary="//" MIME-Version: 1.0 --// Content-Type: text/cloud-config; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="cloud-config.txt" #cloud-config cloud-init directives --// Content-Type: text/x-shellscript; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="userdata.txt" #!/bin/bash shell script commands --//--

Die folgenden Benutzerdaten enthalten beispielsweise cloud-init-Anweisungen und ein Bash-Shell-Skript. Die cloud-init-Anweisungen erstellen eine Datei (/test-cloudinit/cloud-init.txt) und schreiben Created by cloud-init in diese Datei. Das Bash-Shell-Skript erstellt eine Datei (/test-userscript/userscript.txt) und schreibt Created by bash shell script in diese Datei.

Content-Type: multipart/mixed; boundary="//" MIME-Version: 1.0 --// Content-Type: text/cloud-config; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="cloud-config.txt" #cloud-config runcmd: - [ mkdir, /test-cloudinit ] write_files: - path: /test-cloudinit/cloud-init.txt content: Created by cloud-init --// Content-Type: text/x-shellscript; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="userdata.txt" #!/bin/bash mkdir test-userscript touch /test-userscript/userscript.txt echo "Created by bash shell script" >> /test-userscript/userscript.txt --//--

Wie Amazon EC2 mit Benutzerdaten für Windows-Instances umgeht

Auf Windows-Instances führt der Launch-Agent die Aufgaben im Zusammenhang mit Benutzerdaten aus. Weitere Informationen finden Sie hier:

Beispiele für die Zusammenstellung einer UserData Eigenschaft in einer AWS CloudFormation Vorlage finden Sie unter Base64 Encoded Property und Base64 Encoded UserData UserData Property with and. AccessKey SecretKey

Ein Beispiel für die Ausführung von Befehlen auf einer Instance innerhalb einer Auto Scaling Scaling-Gruppe, die mit Lifecycle-Hooks arbeitet, finden Sie unter Tutorial: Benutzerdaten konfigurieren, um den Ziellebenszyklusstatus über Instance-Metadaten abzurufen im Amazon EC2 Auto Scaling Scaling-Benutzerhandbuch.

Benutzerdatenskripts

EC2LaunchUm Skripts auszuführen EC2Config oder auszuführen, müssen Sie das Skript in ein spezielles Tag einschließen, wenn Sie es zu den Benutzerdaten hinzufügen. Welches Tag Sie verwenden, hängt davon ab, ob die Befehle in einem Befehlszeilenfenster (Batch-Befehle) oder unter Windows PowerShell ausgeführt werden.

Wenn Sie sowohl ein Batch-Skript als auch ein PowerShell Windows-Skript angeben, wird das Batch-Skript zuerst und das PowerShell Windows-Skript als Nächstes ausgeführt, unabhängig von der Reihenfolge, in der sie in den Instanzbenutzerdaten erscheinen.

Wenn Sie ein AWS API, einschließlich des AWS CLI, in einem Benutzerdatenskript verwenden, müssen Sie beim Starten der Instanz ein Instanzprofil verwenden. Ein Instanzprofil stellt die entsprechenden AWS Anmeldeinformationen bereit, die das Benutzerdatenskript für den API Aufruf benötigt. Weitere Informationen finden Sie unter Instance-Profile. Die Berechtigungen, die Sie der IAM Rolle zuweisen, hängen davon ab, welche Dienste Sie mit dem aufrufenAPI. Weitere Informationen finden Sie unter IAMRollen für Amazon EC2.

Syntax für Batch-Skripts

Geben Sie ein Batch-Skript unter Verwendung des script-Tags (Markierung) an. Trennen Sie die Befehle durch Zeilenumbrüche, wie im folgenden Beispiel gezeigt.

<script> echo Current date and time >> %SystemRoot%\Temp\test.log echo %DATE% %TIME% >> %SystemRoot%\Temp\test.log </script>

In der Standardeinstellung werden Benutzerdatenskripte einmal ausgeführt, wenn Sie die Instance starten. Um die Benutzerdaten-Skripts bei jedem Neustart oder Starten der Instance auszuführen, fügen Sie den Benutzerdaten <persist>true</persist> hinzu.

<script> echo Current date and time >> %SystemRoot%\Temp\test.log echo %DATE% %TIME% >> %SystemRoot%\Temp\test.log </script> <persist>true</persist>
EC2Launchv2-Agent

Um ein XML Benutzerdatenskript als eigenständigen Prozess mit der EC2Launch executeScript v2-Aufgabe in der UserData Phase auszuführen, fügen Sie <detach>true</detach> es den Benutzerdaten hinzu.

Anmerkung

Das detach Tag wird von früheren Launch-Agents nicht unterstützt.

<script> echo Current date and time >> %SystemRoot%\Temp\test.log echo %DATE% %TIME% >> %SystemRoot%\Temp\test.log </script> <detach>true</detach>

Syntax für PowerShell Windows-Skripts

Die AWS Windows AMIs enthalten die AWS Tools for Windows PowerShell, sodass Sie diese Cmdlets in Benutzerdaten angeben können. Wenn Sie Ihrer Instance eine IAM Rolle zuordnen, müssen Sie keine Anmeldeinformationen für die Cmdlets angeben, da Anwendungen, die auf der Instance ausgeführt werden, die Anmeldeinformationen der Rolle verwenden, um auf AWS Ressourcen (z. B. Amazon S3 S3-Buckets) zuzugreifen.

Geben Sie mithilfe des Tags ein PowerShell Windows-Skript an. <powershell> Trennen Sie die Befehle mithilfe von Zeilenumbrüchen voneinander. Beim <powershell>-Tag wird die Groß- und Kleinschreibung beachtet.

Beispielsweise:

<powershell> $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file </powershell>

Standardmäßig werden die Benutzerdatenskripts einmal ausgeführt, wenn Sie die Instance starten. Um die Benutzerdaten-Skripts bei jedem Neustart oder Starten der Instance auszuführen, fügen Sie den Benutzerdaten <persist>true</persist> hinzu.

<powershell> $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file </powershell> <persist>true</persist>

Sie können ein oder mehrere PowerShell Argumente mit dem <powershellArguments> Tag angeben. Wenn keine Argumente übergeben werden, EC2Launch und EC2Launch v2 fügen Sie standardmäßig das folgende Argument hinzu:-ExecutionPolicy Unrestricted.

Beispiel:

<powershell> $file = $env:SystemRoot + "\Temp" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file </powershell> <powershellArguments>-ExecutionPolicy Unrestricted -NoProfile -NonInteractive</powershellArguments>
EC2Launchv2-Agent

Um ein XML Benutzerdatenskript als eigenständigen Prozess mit der EC2Launch executeScript v2-Aufgabe in der UserData Phase auszuführen, fügen Sie <detach>true</detach> es den Benutzerdaten hinzu.

Anmerkung

Das detach Tag wird von früheren Launch-Agents nicht unterstützt.

<powershell> $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file </powershell> <detach>true</detach>

Syntax für YAML Konfigurationsskripten

Wenn Sie EC2Launch v2 zum Ausführen von Skripten verwenden, können Sie das YAML Format verwenden. Konfigurationsaufgaben, Details und Beispiele für EC2Launch Version 2 finden Sie unterEC2LaunchKonfiguration der v2-Aufgabe.

Geben Sie zusammen mit der executeScript Aufgabe ein YAML Skript an.

YAMLBeispielsyntax zum Ausführen eines PowerShell Skripts

version: 1.0 tasks: - task: executeScript inputs: - frequency: always type: powershell runAs: localSystem content: |- $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file

YAMLBeispielsyntax zum Ausführen eines Batch-Skripts

version: 1.1 tasks: - task: executeScript inputs: - frequency: always type: batch runAs: localSystem content: |- echo Current date and time >> %SystemRoot%\Temp\test.log echo %DATE% %TIME% >> %SystemRoot%\Temp\test.log

Base64-Codierung

Wenn Sie Amazon EC2 API oder ein Tool verwenden, das keine Base64-Kodierung der Benutzerdaten durchführt, müssen Sie die Benutzerdaten selbst codieren. Andernfalls wird ein Fehler ausgegeben, der darauf hinweist, dass keine auszuführenden script- oder powershell-Tags gefunden wurden. Im Folgenden finden Sie ein Beispiel, das mit Windows codiert. PowerShell

$UserData = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($Script))

Das Folgende ist ein Beispiel für die Dekodierung mit. PowerShell

$Script = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($UserData))

Weitere Informationen zur Base64-Kodierung finden Sie unter https://www.ietf.org/rfc/rfc4648.txt.

Ausführung von Benutzerdaten

Standardmäßig ist in allen AWS Windows-Versionen AMIs die Ausführung von Benutzerdaten für den ersten Start aktiviert. Sie können vorgeben, dass die Benutzerdaten-Skripts beim nächsten Neustart oder erneuten Starten der Instance ausgeführt werden sollen. Alternativ können Sie vorgeben, dass die Benutzerdaten-Skripts bei jedem Neustart oder erneuten Starten der Instance ausgeführt werden sollen.

Anmerkung

Benutzerdaten können nach dem ersten Start nicht standardmäßig ausgeführt werden. Informationen darüber, wie Sie Benutzerdaten beim Neustart oder beim Starten der Instance ausführen können, finden Sie unter Führen Sie Skripts bei nachfolgenden Neustarts oder Starts aus.

Benutzerdaten-Skripts werden vom lokalen Administratorkonto ausgeführt, wenn ein zufälliges Passwort generiert wird. Andernfalls werden Benutzerdaten-Skripts vom Systemkonto ausgeführt.

Skripts zum Starten von Instanzen

Skripts in den Instance-Benutzerdaten werden beim ersten Start der Instance ausgeführt. Ist der persist-Tag (Markierung) vorhanden, wir die Ausführung der Benutzerdaten für nachfolgende Neustarts oder Starts aktiviert. Die Protokolldateien für EC2Launch Version 2EC2Launch, und EC2Config enthalten die Ausgabe der Standardausgabe- und Standardfehlerstreams.

EC2Launch v2

Die Protokolldatei für EC2Launch v2 istC:\ProgramData\Amazon\EC2Launch\log\agent.log.

Anmerkung

Der Ordner C:\ProgramData ist möglicherweise ausgeblendet. Zum Anzeigen des Ordners müssen Sie die ausgeblendeten Dateien und Ordner einblenden.

Bei der Ausführung von Benutzerdaten werden die folgenden Informationen protokolliert:

  • Info: Converting user-data to yaml format— Wenn die Benutzerdaten im XML Format bereitgestellt wurden

  • Info: Initialize user-data state: Der Beginn der Benutzerdatenausführung

  • Info: Frequency is: always: Wenn die Benutzerdatenaufgabe bei jedem Start ausgeführt wird

  • Info: Frequency is: once: Wenn die Benutzerdatenaufgabe nur einmal ausgeführt wird

  • Stage: postReadyUserData execution completed: Das Ende der Ausführung von Benutzerdaten

EC2Launch

Die Protokolldatei für EC2Launch lautet C:\ProgramData\Amazon\EC2-Windows\Launch\Log\UserdataExecution.log.

Der Ordner C:\ProgramData ist möglicherweise ausgeblendet. Zum Anzeigen des Ordners müssen Sie die ausgeblendeten Dateien und Ordner einblenden.

Bei der Ausführung von Benutzerdaten werden die folgenden Informationen protokolliert:

  • Userdata execution begins: Der Beginn der Benutzerdatenausführung

  • <persist> tag was provided: true: Wenn das persist-Tag (Markierung) gefunden wird

  • Running userdata on every boot: Wenn der persist-Tag (Markierung) gefunden wird

  • <powershell> tag was provided.. running powershell content: Wenn der powershell-Tag (Markierung) gefunden wird

  • <script> tag was provided.. running script content: Wenn der Skript-Tag (Markierung) gefunden wird

  • Message: The output from user scripts: Wenn Benutzerdatenskripte ausgeführt werden, wird deren Ausgabe protokolliert

EC2Config

Die Protokolldatei für EC2Config lautet C:\Program Files\Amazon\Ec2ConfigService\Logs\Ec2Config.log. Bei der Ausführung von Benutzerdaten werden die folgenden Informationen protokolliert:

  • Ec2HandleUserData: Message: Start running user scripts: Der Beginn der Benutzerdatenausführung

  • Ec2HandleUserData: Message: Re-enabled userdata execution: Wenn der persist-Tag (Markierung) gefunden wird

  • Ec2HandleUserData: Message: Could not find <persist> and </persist>: Wenn der persist-Tag (Markierung) nicht gefunden wird

  • Ec2HandleUserData: Message: The output from user scripts: Wenn Benutzerdatenskripte ausgeführt werden, wird deren Ausgabe protokolliert

Führen Sie Skripts bei nachfolgenden Neustarts oder Starts aus

Wenn Sie Instance-Benutzerdaten aktualisieren, werden Benutzerdaten-Skripts nicht automatisch ausgeführt, wenn Sie die Instance neu starten oder starten. Sie können die Ausführung von Benutzerdaten jedoch so aktivieren, dass Benutzerdaten-Skripts einmalig beim Neustart oder Starten der Instance oder bei jedem Neustart oder Starten der Instance ausgeführt werden.

Wenn Sie die OptionShutdown with Sysprep (Herunterfahren mit Sysprep) wählen, werden Benutzerdaten-Skripts beim Neustart oder Starten der Instance ausgeführt, auch wenn Sie die Ausführung der Benutzerdaten für nachfolgende Neustarts oder Starts nicht aktiviert haben. Die Benutzerdaten-Skripts werden bei nachfolgenden Neustarts oder Starts nicht ausgeführt.

Um die Ausführung von Benutzerdaten mit EC2Launch Version 2 zu ermöglichen
  • Wenn eine Aufgabe beim ersten Start für Benutzerdaten ausgeführt werden soll, setzen Sie frequency auf once.

  • Wenn eine Aufgabe bei jedem Start für Benutzerdaten ausgeführt werden soll, setzen Sie frequency auf always.

Um die Ausführung von Benutzerdaten zu aktivieren mit EC2Launch
  1. Herstellen einer Verbindung mit Ihrer Windows-Instance.

  2. Öffnen Sie ein PowerShell Befehlsfenster und führen Sie den folgenden Befehl aus:

    C:\ProgramData\Amazon\EC2-Windows\Launch\Scripts\InitializeInstance.ps1 -Schedule
  3. Trennen Sie die Verbindung zu Ihrer Windows-Instance. Um beim nächsten Starten der Instance aktualisierte Skripts auszuführen, halten Sie die Instance an und aktualisieren die Benutzerdaten.

Um die Ausführung von Benutzerdaten zu ermöglichen mit EC2Config
  1. Herstellen einer Verbindung mit Ihrer Windows-Instance.

  2. Öffnen C:\Program Files\Amazon\Ec2ConfigService\Ec2ConfigServiceSetting.exe.

  3. Wählen Sie für Benutzerdaten die Option UserDataAusführung für den nächsten Dienststart aktivieren aus.

  4. Trennen Sie die Verbindung zu Ihrer Windows-Instance. Um beim nächsten Starten der Instance aktualisierte Skripts auszuführen, halten Sie die Instance an und aktualisieren die Benutzerdaten.

Benutzerdaten und die Tools für Windows PowerShell

Sie können die Tools für Windows verwenden, PowerShell um die Benutzerdaten für Ihre Instanz anzugeben, zu ändern und anzuzeigen. Informationen zum Anzeigen von Benutzerdaten Ihrer Instance mithilfe von Instance-Metadaten erhalten Sie unter Auf Instanz-Metadaten für eine EC2 Instanz zugreifen. Hinweise zu Benutzerdaten und dem AWS CLI finden Sie unterBenutzerdaten und AWS CLI.

Beispiel: Angeben von Instance-Benutzerdaten beim Start

Erstellen Sie eine Textdatei mit Instance-Benutzerdaten. Um die Benutzerdaten-Skripts bei jedem Neustart oder Starten der Instance auszuführen, fügen Sie <persist>true</persist> hinzu, wie im folgenden Beispiel gezeigt.

<powershell> $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file </powershell> <persist>true</persist>

Verwenden Sie den New-EC2InstanceBefehl, um die Benutzerdaten für die Instanz anzugeben, wenn Sie Ihre Instance starten. Dieser Befehl führt keine Base64-Codierung der Benutzerdaten für Sie durch Verwenden Sie die folgenden Befehle, um die Benutzerdaten in einer Textdatei namens script.txt zu codieren.

PS C:\> $Script = Get-Content -Raw script.txt PS C:\> $UserData = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($Script))

Verwenden Sie den Parameter -UserData, um die Benutzerdaten an den Befehl New-EC2Instance zu übergeben.

PS C:\> New-EC2Instance -ImageId ami-abcd1234 -MinCount 1 -MaxCount 1 -InstanceType m3.medium \ -KeyName my-key-pair -SubnetId subnet-12345678 -SecurityGroupIds sg-1a2b3c4d \ -UserData $UserData
Beispiel: Aktualisieren von Instance-Benutzerdaten einer angehaltenen Instance

Sie können die Benutzerdaten einer gestoppten Instance mithilfe des Edit-EC2InstanceAttributeBefehls ändern.

Erstellen Sie eine Textdatei mit dem neuen Skript. Verwenden Sie die folgenden Befehle, um die Benutzerdaten in der Textdatei namens new-script.txt zu codieren.

PS C:\> $NewScript = Get-Content -Raw new-script.txt PS C:\> $NewUserData = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($NewScript))

Verwenden Sie die Parameter -UserData und -Value, um die Benutzerdaten anzugeben.

PS C:\> Edit-EC2InstanceAttribute -InstanceId i-1234567890abcdef0 -Attribute userData -Value $NewUserData
Beispiel: Anzeige von Instance-Benutzerdaten

Verwenden Sie den Get-EC2InstanceAttributeBefehl, um die Benutzerdaten für eine Instanz abzurufen.

PS C:\> (Get-EC2InstanceAttribute -InstanceId i-1234567890abcdef0 -Attribute userData).UserData

Es folgt eine Beispielausgabe. Beachten Sie, dass die Benutzerdaten codiert sind.

PHBvd2Vyc2hlbGw+DQpSZW5hbWUtQ29tcHV0ZXIgLU5ld05hbWUgdXNlci1kYXRhLXRlc3QNCjwvcG93ZXJzaGVsbD4=

Verwenden Sie die folgenden Befehle, um die codierten Benutzerdaten in einer Variablen zu speichern und anschließend zu decodieren.

PS C:\> $UserData_encoded = (Get-EC2InstanceAttribute -InstanceId i-1234567890abcdef0 -Attribute userData).UserData PS C:\> [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($UserData_encoded))

Es folgt eine Beispielausgabe.

<powershell> $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file </powershell> <persist>true</persist>
Beispiel: Umbenennen der Instance entsprechend des Tag (Markierung)-Werts

Sie können den Get-EC2TagBefehl verwenden, um den Tag-Wert zu lesen, die Instance beim ersten Start so umzubenennen, dass sie dem Tag-Wert entspricht, und den Computer neu zu starten. Um diesen Befehl erfolgreich auszuführen, müssen Sie der Instance eine Rolle mit ec2:DescribeTags Berechtigungen zugewiesen haben, da Tag-Informationen durch den API Aufruf abgerufen werden. Weitere Informationen zu den Einstellungen von Berechtigungen mithilfe von IAM Rollen finden Sie unterOrdnen Sie einer Instance eine IAM Rolle zu.

IMDSv2
<powershell> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri 'http://169.254.169.254/latest/api/token' -UseBasicParsing $instanceId = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri 'http://169.254.169.254/latest/meta-data/instance-id' -UseBasicParsing $nameValue = (Get-EC2Tag -Filter @{Name="resource-id";Value=$instanceid},@{Name="key";Value="Name"}).Value $pattern = "^(?![0-9]{1,15}$)[a-zA-Z0-9-]{1,15}$" #Verify Name Value satisfies best practices for Windows hostnames If ($nameValue -match $pattern) {Try {Rename-Computer -NewName $nameValue -Restart -ErrorAction Stop} Catch {$ErrorMessage = $_.Exception.Message Write-Output "Rename failed: $ErrorMessage"}} Else {Throw "Provided name not a valid hostname. Please ensure Name value is between 1 and 15 characters in length and contains only alphanumeric or hyphen characters"} </powershell>
IMDSv1
<powershell> $instanceId = (Invoke-WebRequest http://169.254.169.254/latest/meta-data/instance-id -UseBasicParsing).content $nameValue = (Get-EC2Tag -Filter @{Name="resource-id";Value=$instanceid},@{Name="key";Value="Name"}).Value $pattern = "^(?![0-9]{1,15}$)[a-zA-Z0-9-]{1,15}$" #Verify Name Value satisfies best practices for Windows hostnames If ($nameValue -match $pattern) {Try {Rename-Computer -NewName $nameValue -Restart -ErrorAction Stop} Catch {$ErrorMessage = $_.Exception.Message Write-Output "Rename failed: $ErrorMessage"}} Else {Throw "Provided name not a valid hostname. Please ensure Name value is between 1 and 15 characters in length and contains only alphanumeric or hyphen characters"} </powershell>

Sie können die Instance auch mit Tags aus Instance-Metadaten umbenennen, wenn Ihre Instance so konfiguriert ist, dass über die Instance-Metadaten auf Tags zugegriffen wird. Weitere Informationen finden Sie unter Zeigen Sie Tags für Ihre EC2 Instances mithilfe von Instanz-Metadaten an.

IMDSv2
<powershell> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri 'http://169.254.169.254/latest/api/token' -UseBasicParsing $nameValue = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri 'http://169.254.169.254/latest/meta-data/tags/instance/Name' -UseBasicParsing $pattern = "^(?![0-9]{1,15}$)[a-zA-Z0-9-]{1,15}$" #Verify Name Value satisfies best practices for Windows hostnames If ($nameValue -match $pattern) {Try {Rename-Computer -NewName $nameValue -Restart -ErrorAction Stop} Catch {$ErrorMessage = $_.Exception.Message Write-Output "Rename failed: $ErrorMessage"}} Else {Throw "Provided name not a valid hostname. Please ensure Name value is between 1 and 15 characters in length and contains only alphanumeric or hyphen characters"} </powershell>
IMDSv1
<powershell> $nameValue = Get-EC2InstanceMetadata -Path /tags/instance/Name $pattern = "^(?![0-9]{1,15}$)[a-zA-Z0-9-]{1,15}$" #Verify Name Value satisfies best practices for Windows hostnames If ($nameValue -match $pattern) {Try {Rename-Computer -NewName $nameValue -Restart -ErrorAction Stop} Catch {$ErrorMessage = $_.Exception.Message Write-Output "Rename failed: $ErrorMessage"}} Else {Throw "Provided name not a valid hostname. Please ensure Name value is between 1 and 15 characters in length and contains only alphanumeric or hyphen characters"} </powershell>