[PYTHON] Über das Starten einer Instanz mit einem verschlüsselten EBS-Volume (wo ich süchtig war)

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-Root-Volume-Verschlüsselung

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.

Instanzstartfehler

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'}}

Ursache: Unzureichende Berechtigungen für die Ausführungsrolle

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. 暗号化キーのキーユーザ設定.png

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"
            ]
        }
    ]
}

Am Ende

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

Über das Starten einer Instanz mit einem verschlüsselten EBS-Volume (wo ich süchtig war)
Wo ich mir Sorgen um Heroku machte
Ich war süchtig danach, 2020 mit Selen (+ Python) zu kratzen
Dinge, die Sie bei der Implementierung von Airflow mit Docker-Compose beachten sollten
Worüber ich mir Sorgen gemacht habe, als ich Bilder mit matplotlib angezeigt habe
Ich war süchtig danach, keine E-Mail-Adresse von Google mit Django-Allauth-Authentifizierung zu erhalten
Was ich mit json.dumps in Pythons base64-Codierung süchtig gemacht habe
Ein Hinweis, dem ich beim Erstellen einer Tabelle mit SQL Alchemy verfallen war
Ich war süchtig nach falschen Klassenvariablen und Instanzvariablen in Python
Ich bin gestorben, weil ich dachte, eine Python-Klassenvariable sei eine Instanzvariable