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