Automatisierte EC2 Instanzen mit User data Skripts

Ich habe vor kurzem ec2metadata, die eine einfache CLI-und Python-Schnittstelle bietet, um die Metadaten eines Amazon EC2-Instanz veröffentlicht. In diesem Beitrag habe ich erwähnt, dass “eines der nützlichsten Teile der Daten User-Daten, die verwendet werden, um Konfigurations-Informationen oder sogar Initialisierung Skripte, um die Instanz übergeben beim Start werden kann“.

Ich bekam ein paar Antworten per E-Mail Bitte um weitere Informationen, so ist es hier.

Aber zuerst, lassen Sie mich nur bedanken Eric Hammond (und RightScale) für die Idee. Unten ist eine Python-Implementierung, die ec2metadata nutzt als Kommunikationsprotokoll Schicht.

Unterstützung für benutzerdefinierte Daten-Skripte (ec2metadata, 25ec2-userdata) ist in den neuesten TurnKey AMI enthalten. Wenn Sie den Mechanismus Setup wie oben beschrieben sollte es auf eigene Faust AMIs zu arbeiten.

Verwendung

Es ist ganz einfach. Wenn der Benutzer-Daten beginnt der Inhalt mit den beiden Zeichen #! (Shebang), wird sie ausgeführt werden. Wenn kein Benutzer-Daten angegeben ist, oder nicht mit #! Starten, passiert nichts.

Starten einer Instanz mit User-Daten

Beim Starten einer Instanz, geben Sie die Benutzer-Daten-Datei zu der Instanz übergeben.

Zum Beispiel:

ec2-run-instances --key KEYPAIR --user-data-file USERDATA_FILE ami-cbc12fa2

Das obige Beispiel verwendet die Amazon EC2 CLI-Tools, aber es ist möglich, benutzerdefinierte Daten über die AWS-Konsole als auch weitergeben. Die AMI angegeben wird, dass von schlüsselfertigen Kern in der US-EAST-1 Region, die komplette Liste der verfügbaren AMI ist hier.

Beispiel User-Daten-Skript

#!/bin/bash -ex
install()
{
    apt-get update
    DEBIAN_FRONTEND=noninteractive apt-get -y \
        -o DPkg::Options::=--force-confdef \
        -o DPkg::Options::=--force-confold \
        install $@
}

# installs hello - a highly useful package
install hello

# tell the world what we've done!
echo 'Hello world - I just executed user-data!' > /root/helloworld

Der Code

Das folgende Skript hängt ec2metadata und basiert auf firstboot von inithooks auf TurnKey AMI ausgeführt.

/usr/lib/inithooks/firstboot.d/25ec2-userdata

#!/usr/bin/python
# Copyright (c) 2010 Alon Swartz <alon@turnkeylinux.org> - all rights reserved

import os
import shutil
import tempfile

import executil
import ec2metadata

class TempFile(file):
    def __init__(self, prefix='tmp', suffix=''):
        fd, path = tempfile.mkstemp(suffix, prefix)
        os.close(fd)
        self.path = path
        self.pid = os.getpid()
        file.__init__(self, path, "w")

    def __del__(self):
        if self.pid == os.getpid():
            os.remove(self.path)

def main():
    userdata = ec2metadata.get('user-data')

    if userdata and userdata.startswith("#!"):
        fh = TempFile(prefix="ec2userdata")
        fh.writelines(userdata)
        fh.close()

        os.chmod(fh.path, 0750)
        executil.system(fh.path)
        print "# executed ec2 user-data script"

if __name__ == "__main__":
    main()