
Tengo una función lambda que configuré para iniciar una instancia:
import boto3
ec2 = boto3.client('ec2')
response = ec2.start_instances(
InstanceIds=['i-xxx']
)
print(response)
La respuesta se ve bien y muestra que pasa a pendiente desde detenido:
START RequestId: 26c0cf5e-6d70-4701-b0bd-68276b06d30d Version: $LATEST
{
"StartingInstances": [
{
"CurrentState": {"Code": 0, "Name": "pending"},
"InstanceId": "i-xxxxxx",
"PreviousState": {"Code": 80, "Name": "stopped"},
}
],
"ResponseMetadata": {
"RequestId": "fdab5818-0536-457f-a19e-17fea60100f4",
"HTTPStatusCode": 200,
"HTTPHeaders": {
"x-amzn-requestid": "fdab5818-0536-457f-a19e-17fea60100f4",
"content-type": "text/xml;charset=UTF-8",
"content-length": "579",
"date": "Wed, 16 Dec 2020 18:38:57 GMT",
"server": "AmazonEC2",
},
"RetryAttempts": 0,
},
}
END RequestId: f2ed2be9-e2f2-4beb-a69b-4cddee35bef4
REPORT RequestId: f2ed2be9-e2f2-4beb-a69b-4cddee35bef4 Duration: 1381.48 ms Billed Duration: 1382 ms Memory Size: 256 MB Max Memory Used: 97 MB Init Duration: 688.96 ms
Sin embargo, cuando miro la consola, todavía aparece como detenida y nunca se inicia.
No parece que no haya podido iniciarse:
"StateReason": {
"Code": "Client.UserInitiatedShutdown",
"Message": "Client.UserInitiatedShutdown: User initiated shutdown",
},
Política basada en la ejecución:
{
"Version": "2012-10-17",
"Id": "default",
"Statement": [
{
"Sid": "xxxxxxx",
"Effect": "Allow",
"Principal": {
"Service": "s3.amazonaws.com"
},
"Action": "lambda:InvokeFunction",
"Resource": "xxxxxxFunction",
"Condition": {
"StringEquals": {
"AWS:SourceAccount": "xxxxxxxx"
}
}
}
]
}
Parece que realmente no intentó comenzar. He usado este código para iniciar otras instancias. Me pregunto si es un problema de permisos, pero no hay ningún error. La función de ejecución de la función lambda tiene EC2fullaccess.
Tenga en cuenta, otro punto de datos. Probé más código que usa el comando ssm send para enviar un comando una vez que se está ejecutando (después de iniciarlo manualmente). Si lo intento mientras se está ejecutando, tiene éxito.
Respuesta1
Su volumen de EBS está cifrado mediante una clave KMS y la función de IAM que utiliza su función Lambda no tiene permiso para descifrar utilizando esa clave KMS. En este caso, la instancia EC2 se inicia, pero luego se detiene inmediatamente.
Entonces hay dos posibles soluciones.
Solución 1: agregue su función de IAM como "usuario" de su CMK. Esto requiere que edite la política de permisos adjunta a su clave KMS y agregue su función de IAM como "usuario" de la clave (para cifrar/descifrar).
Solución 2: agregue kms:CreateGrant
a la función IAM de Lambda. Con esto en su función de IAM, AWS permitirá que se inicie la instancia EC2.