[PYTHON] À propos du démarrage d'une instance avec un volume EBS crypté (où j'étais accro)

Je l'ai résumé parce qu'il y avait une partie à laquelle j'étais accro lorsque j'ai essayé de démarrer automatiquement une instance avec un volume racine EBS chiffré à l'aide de Lambda.

Chiffrement du volume racine EBS

EBS prend actuellement en charge le chiffrement du volume racine d'une instance, comme décrit dans l'article ci-dessous. http://aws.typepad.com/aws_japan/2015/12/new-encrypted-ebs-boot-volumes.html Cette fois, j'écrirai sur les points auxquels j'étais accro lors du démarrage automatique d'une instance avec ce cryptage de volume racine.

Échec du démarrage de l'instance

Cette fois, j'essayais d'automatiser le lancement d'une instance à l'aide d'AWS Lambda. Le script utilisé est le lot de démarrage d'instance suivant créé à partir de la fonction Lambda (python) qui prend la sauvegarde AMI. Vous pouvez également le trouver sur GitHub avec l'arrêt. 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)

#Nom de la fonction: 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')

#Nom de la fonction: exécuter_start_instance
#Valeur de retour: résultat de l'exécution
#Argument: ec2_client
#       : ec2_resource
#Fonction: démarrer une instance.
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

#Nom de la fonction: est_target
#Valeur de retour: s'il faut démarrer
#Argument: instance_info <dict>
#Fonction: déterminer si le démarrage est nécessaire
def is_target(instance_info):
    val = get_tag_value(
        instance_info,
        TAG_KEY_AUTO_START
    )

    if val is None:
        return False

    return True

#Nom de la fonction: get_tag_value
#Valeur de retour: valeur de la balise (aucune s'il n'y a pas de correspondance pour la clé)
#Argument: instance_info <dict>
#       : key <str>
#Fonction: obtenir la valeur de balise de la clé spécifiée à partir des informations d'instance
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

Cependant, quel que soit le nombre de fois où j'ai exécuté la fonction Lambda, l'instance n'a pas démarré même si la réponse correcte a été renvoyée comme ci-dessous. .. .. ..

{u'StartingInstances': [{u'InstanceId': 'ID d'instance', 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'}}

Cause: autorisations insuffisantes pour le rôle d'exécution

J'ai fait beaucoup de recherches, mais la cause était très simple. L'autorisation d'exécution de KMS (Key Management Service) était manquante. .. Cette fois, j'ai créé et utilisé moi-même la clé de cryptage au lieu de la clé par défaut. Dans ce cas, il était nécessaire d'autoriser l'utilisation de la clé par «l'utilisateur clé» de la clé de chiffrement correspondante ou de la politique du rôle d'exécution. Si vous souhaitez le définir comme "utilisateur clé" de la clé de chiffrement, vous pouvez le définir avec l'interface graphique comme suit. 暗号化キーのキーユーザ設定.png

La politique de rôle d'exécution serait comme ceci.

Lors de la définition de la stratégie de rôle d'exécution


{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1236596007000",
            "Effect": "Allow",
            "Action": [
                "kms:*"
            ],
            "Resource": [
                "ARN de la clé créée"
            ]
        }
    ]
}

À la fin

La cause est tout à fait naturelle, mais il est difficile d'arriver à ce point s'il s'agit d'une fonction que vous n'utilisez pas normalement. J'ai pensé que je devais continuer à toucher des fonctions que je n'ai pas touchées, tant à l'intérieur qu'à l'extérieur de l'entreprise.

Recommended Posts

À propos du démarrage d'une instance avec un volume EBS crypté (où j'étais accro)
Où j'étais inquiet pour heroku
J'étais accro au grattage avec Selenium (+ Python) en 2020
Éléments à prendre en compte lors de la mise en œuvre d'Airflow avec docker-compose
Ce qui m'inquiétait lors de l'affichage d'images avec matplotlib
J'étais accro à ne pas pouvoir obtenir une adresse e-mail de Google avec l'authentification django-allauth
Ce à quoi j'étais accro avec json.dumps dans l'encodage base64 de Python
Une note à laquelle j'étais accro lors de la création d'une table avec SQL Alchemy
J'étais accro aux variables de classe et aux variables d'instance erronées en Python
Je suis mort en pensant qu'une variable de classe Python était une variable d'instance