Ich habe es zusammengefasst, weil es einen Teil gab, von dem ich süchtig war, als ich versuchte, eine Instanz mit einem verschlüsselten EBS-Root-Volume mit Lambda automatisch zu starten.
EBS unterstützt derzeit die Verschlüsselung des Root-Volumes einer Instanz, wie im folgenden Artikel beschrieben. http://aws.typepad.com/aws_japan/2015/12/new-encrypted-ebs-boot-volumes.html Dieses Mal werde ich über die Punkte schreiben, nach denen ich süchtig war, als ich automatisch eine Instanz mit dieser Root-Volume-Verschlüsselung startete.
Dieses Mal habe ich versucht, den Start einer Instanz mit AWS Lambda zu automatisieren. Das verwendete Skript ist der folgende Instanzstartstapel, der basierend auf der [Lambda-Funktion (Python), die eine AMI-Sicherung erstellt] erstellt wurde (http://qiita.com/Hiroyama-Yutaka/items/9fab02438dc22c0b85ea). Sie können es auch auf GitHub zusammen mit dem Stopp finden. https://github.com/tatsuo48/Hello-world/tree/master/LambdaFunctions
startinstance.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import json
import boto3
import pprint
TAG_KEY_AUTO_START = 'auto-start'
print('Loading function')
pp = pprint.PrettyPrinter(indent=4)
#Funktionsname: Lambda_handler
def lambda_handler(event, context):
print("Received event: " + json.dumps(event, indent=2))
ec2_client = boto3.client('ec2')
ret = execute_start_instance(ec2_client)
print 'Start instance success(%s).' % (ret)
return 0
raise Exception('Something went wrong')
#Funktionsname: ausführen_start_instance
#Rückgabewert: Ausführungsergebnis
#Argument: ec2_client
# : ec2_resource
#Funktion: Starten Sie eine Instanz.
def execute_start_instance(ec2_client):
response = ec2_client.describe_instances()
result = None
for ec2_group in response['Reservations']:
for instance_info in ec2_group['Instances']:
ret = is_target(instance_info)
if (ret == False):
continue
instance_id = instance_info.get('InstanceId')
response = ec2_client.start_instances(InstanceIds=[instance_id,])
print response
result = True
return result
#Funktionsname: ist_target
#Rückgabewert: Gibt an, ob gestartet werden soll
#Argument: Instanz_info <dict>
#Funktion: Beurteilen Sie, ob ein Start erforderlich ist
def is_target(instance_info):
val = get_tag_value(
instance_info,
TAG_KEY_AUTO_START
)
if val is None:
return False
return True
#Funktionsname: get_tag_value
#Rückgabewert: Tag-Wert (Keine, wenn der Schlüssel nicht übereinstimmt)
#Argument: Instanz_info <dict>
# : key <str>
#Funktion: Ruft den Tag-Wert des angegebenen Schlüssels aus den Instanzinformationen ab
def get_tag_value(instance_info, key):
tags = instance_info.get('Tags')
if tags == None:
return None
for tag in tags:
if not (key == tag['Key']):
continue
tag_value = tag['Value']
if tag_value == "true":
return True
return None
Unabhängig davon, wie oft ich die Lambda-Funktion ausgeführt habe, wurde die Instanz nicht gestartet, obwohl die richtige Antwort wie folgt zurückgegeben wurde. .. .. ..
{u'StartingInstances': [{u'InstanceId': 'Instanz-ID', u'CurrentState': {u'Code': 0, u'Name': 'pending'}, u'PreviousState': {u'Code': 80, u'Name': 'stopped'}}], 'ResponseMetadata': {'HTTPStatusCode': 200, 'RequestId': 'kkksfh084k-l9hh-8iy6-hshs4-ipsug88w9hwh'}}
Ich habe viel recherchiert, aber die Ursache war sehr einfach. Die Ausführungsberechtigung von KMS (Key Management Service) fehlte. .. Dieses Mal habe ich den Verschlüsselungsschlüssel anstelle des Standardschlüssels selbst erstellt und verwendet. In diesem Fall war es erforderlich, die Verwendung des Schlüssels durch den "Schlüsselbenutzer" des entsprechenden Verschlüsselungsschlüssels oder die Richtlinie der Ausführungsrolle zuzulassen. Wenn Sie es als "Schlüsselbenutzer" des Verschlüsselungsschlüssels festlegen möchten, können Sie es über die GUI wie folgt festlegen.
Die Ausführungsrollenrichtlinie wäre wie folgt.
Beim Festlegen der Ausführungsrollenrichtlinie
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1236596007000",
"Effect": "Allow",
"Action": [
"kms:*"
],
"Resource": [
"ARN des erstellten Schlüssels"
]
}
]
}
Die Ursache ist ganz natürlich, aber es ist schwierig, an diesen Punkt zu gelangen, wenn es sich um eine Funktion handelt, die Sie normalerweise nicht verwenden. Ich dachte, ich sollte weiterhin Funktionen berühren, die ich nicht berührt habe, sowohl innerhalb als auch außerhalb des Unternehmens.
Recommended Posts