AWS lamba start_instances gibt eine ausstehende Antwort, aber die Konsole zeigt immer noch „gestoppt“ an

AWS lamba start_instances gibt eine ausstehende Antwort, aber die Konsole zeigt immer noch „gestoppt“ an

Ich habe eine Lambda-Funktion, die ich zum Starten einer Instanz eingerichtet habe:

import boto3
ec2 = boto3.client('ec2')
response = ec2.start_instances(
    InstanceIds=['i-xxx']
)
print(response)

Die Antwort sieht gut aus und zeigt, dass der Vorgang vom gestoppten in den ausstehenden Vorgang übergeht:

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    

Wenn ich jedoch auf die Konsole schaue, wird es immer noch als gestoppt angezeigt und startet nie.

Es scheint nicht so, als ob der Start fehlgeschlagen wäre:

                "StateReason": {
                    "Code": "Client.UserInitiatedShutdown",
                    "Message": "Client.UserInitiatedShutdown: User initiated shutdown",
                },

Ausführungsbasierte Richtlinie:

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

Es scheint, als ob es nicht wirklich versucht hat, zu starten. Ich habe diesen Code verwendet, um andere Instanzen zu starten. Ich frage mich, ob es ein Berechtigungsproblem ist, aber es liegt kein Fehler vor. Die Ausführungsrolle der Lambda-Funktion hat EC2fullaccess.

Beachten Sie, ein weiterer Datenpunkt. Ich habe weiteren Code ausprobiert, der den Befehl ssm send verwendet, um einen Befehl zu senden, sobald er ausgeführt wird (nach dem manuellen Start). Wenn ich das während der Ausführung versuche, funktioniert es.

Antwort1

Ihr EBS-Volume ist mit einem KMS-Schlüssel verschlüsselt und die IAM-Rolle, die Ihre Lambda-Funktion verwendet, hat keine Berechtigung zum Entschlüsseln mit diesem KMS-Schlüssel. In diesem Fall startet die EC2-Instanz, stoppt dann aber sofort wieder.

Es gibt also zwei mögliche Lösungen.

Lösung 1: Fügen Sie Ihre IAM-Rolle als „Benutzer“ Ihres KMS-Schlüssels hinzu. Dazu müssen Sie die an Ihren KMS-Schlüssel angehängte Berechtigungsrichtlinie bearbeiten und Ihre IAM-Rolle als „Benutzer“ des Schlüssels hinzufügen (zum Verschlüsseln/Entschlüsseln).

Lösung 2: Fügen Sie kms:CreateGrantdie IAM-Rolle Ihrer Lambda-Instanz hinzu. Mit dieser IAM-Rolle ermöglicht AWS den Start der EC2-Instanz.

verwandte Informationen