• +49 (0) 731 7255 8870
  • sales@inno-on.de

Alexa Skill zur Steuerung von Amazon EC2 Instanzen

Zu Demonstrationszwecken haben wir vor einigen Wochen einen Alexa Skill entworfen, welcher es mit Hilfe von Amazon Echo ermöglicht, Amazon EC2 Instanzen zu starten und zu stoppen.

Für die Demo mussten folgende Schritte durchgeführt werden:

  1. Alexa Skill erstellen (erfordert Developer Account)
  2. Invocations & Intents definieren
  3. Lambda Funktion inkl. Code erstellen
  4. Skill und Lambda Funktion verknüpfen

 

In der Alexa Developer Console wurde nun also zunächst ein neuer Aufruf (Invocation) erstellt. In unserem Fall haben wir den Namen "deployment" gewählt, die Auswahl des Namens wird später beim Aufrufen des Skills relevant sein.

innvocationname Amazon echo

Nach erfolgreicher Erstellung des Aufrufs konfigurieren wir 2 Vorhaben (Intents). Für jeden Skill gibt es diese Intents, sie beschreiben die Aktion die ausgeführt werden soll. Für die Demonstration wird unser Skill nur das Starten und Stoppen von EC2 Instanzen unterstützen.

Intents Amazon Echo 

 Wie schon beschrieben soll der erste Intent die Server starten, der zweite Intent soll die Server stoppen. Dazu geben wir jeweils den Aufruf an: "start all servers" sowie "stop all servers". 

startintent amazonecho

stopintent amazonecho 

Nun ist es an der Zeit die Lambda Funktion zu erstellen. Wir wechseln also von der Alexa Developer Console in die AWS Management Console und springen dort zum Service Lambda. Wir nutzen übrigens zum heutigen Stand der Funktionalität die Region Ireland (eu-west-1).

Bereitstellung der Lambda Funktion: Ohne Vorgabe erstellen - in unserem Szenario mit Python 2.7 sowie einer IAM Rolle (Vorlage siehe unten) welche berechtigt ist EC2 Instanzen zu starten und zu stoppen.

lambda funktion amazonecho

Sie finden hier zum einen den Python Code für die Lambda Funktion sowie die IAM Role Policy (Codebasiert). Wichtig: Im Python Code muss angeben werden welche EC2 Instanzen gestartet / gestoppt werden sollen. Dies geschieht über die Angabe der Instance ID. Eine weiterentwickelte Version des Codes könnte sich natürlich auch anderen Attributen wie beispielsweise dem Instanznamen bedienen.

Code-Snippet Lambda Funktion (Python)

import boto3

def lambda_handler(event, context):
if event['request']['type'] == "IntentRequest":
return on_intent(event['request'], event['session'])

# Intent Magic
def on_intent(intent_request, session):
intent = intent_request['intent']
intent_name = intent_request['intent']['name']
region = 'eu-west-1'
# Wichtig: Geben Sie hier die Instance IDs ein die Sie steuern möchten.
instances = ['i-04157*******', 'i-04fa491******']
session_attributes = {}
ec2 = boto3.client('ec2', region_name=region)
session_attributes = {}
if intent_name == "startInstanceIntent":
ec2.start_instances(InstanceIds=instances)
# Antwort
speech_output = "All servers have been started."
should_end_session = True
return build_response(session_attributes, build_speechlet_response(
"All Done", speech_output, "Repromt", should_end_session))
elif intent_name == "stopInstanceIntent":
ec2.stop_instances(InstanceIds=instances)
# Antwort
speech_output = "All servers have been stopped"
should_end_session = True
return build_response(session_attributes, build_speechlet_response(
"All Done", speech_output, "Repromt", should_end_session))
else:
raise ValueError("Invalid intent")

# Antwort Magic
def build_speechlet_response(title, output, reprompt_text, should_end_session):
return {
'outputSpeech': {
'type': 'PlainText',
'text': output
},
'card': {
'type': 'Simple',
'title': 'SessionSpeechlet - ' + title,
'content': 'SessionSpeechlet - ' + output
},
'reprompt': {
'outputSpeech': {
'type': 'PlainText',
'text': reprompt_text
}
},
'shouldEndSession': should_end_session
}


def build_response(session_attributes, speechlet_response):
return {
'version': '1.0',
'sessionAttributes': session_attributes,
'response': speechlet_response
}

IAM Policy Vorlage zur Steuerung (Start / Stop) von EC2 Instanzen (JSON)

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Effect": "Allow",
"Action": [
"ec2:Start*",
"ec2:Stop*"
],
"Resource": "*"
}
]
}

Der ARN (Amazon-Resourcename) befindet sich im rechten oberen Bereich der jeweiligen Funktion. (Beispiel: arn:aws:lambda:eu-west-1:123456789101:function:startserver), diesen benötigen wir zur Vernüpfung mit unserem Alexa Skill. 

lambda ARN amazonecho

Dazu kopieren wir den ARN aus der Lambda Funktion in den Service Endpoint unseres Skills. (Das Feld lautet: Default Region in der Alexa Developer Console)

endpoint amazonecho

 

Nachdem der Python Code eingefügt wurde und die IAM Rolle definiert ist, kann der Alexa Skill wie folgt getestet werden (Alexa Developer Console):

test amazonecho

 

Fazit: Obwohl dieses Beispiel keine produktive Anwendung finden wird, so zeigt es doch mit wie wenig Aufwand verschiedene Dienste kombiniert werden können. Lambda ist ein Service der auch in Zukunft bei uns Anwendung bei verschiedensten Projekten finden wird und die Steuerung von EC2 Instanzen ist nur der Anfang der bereits vorhandenen Möglichkeiten.

  • Erstellt am .
  • Gelesen: 3275
Copyright by Innovations ON GmbH

Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell für den Betrieb der Seite, während andere uns helfen, diese Website und die Nutzererfahrung zu verbessern (Tracking Cookies). Sie können selbst entscheiden, ob Sie die Cookies zulassen möchten. Bitte beachten Sie, dass bei einer Ablehnung womöglich nicht mehr alle Funktionalitäten der Seite zur Verfügung stehen.