2016-06-24 9 views
1

Ich Berufung auf die folgenden Lambda-Funktion zu beschreiben, eine Instanz Informationen laufen:Kann nicht EC2 Methode in AWS Lambda-Funktion

'use strict' 

var aws = require('aws-sdk'); 

exports.handler = function(event, context) { 
    var instanceID = JSON.parse(event.Records[0].Sns.Message).Trigger.Dimensions[0].value; 

    aws.config.region = 'us-east-1'; 

    var ec2 = new aws.EC2; 

    var params = {InstanceIds: [instanceID]}; 

    ec2.describeInstances(params, function(e, data) { 
     if (e) 
      console.log(e, e.stack); 
     else 
      console.log(data); 
    } 
}; 

In Cloudwatch Logs ich diese Funktion läuft bis zum Ende sehen kann, aber doesn‘ log t nichts innen ec2.describeInstances Methode:

END RequestId: xXXXXXXXXXXXXX REPORT RequestId: xxxxxxxxxxxxxx Dauer: xx ms Angekündigt Dauer: xx ms Speichergröße: xx MB Max Memory Used: xx MB

Meine Lambda-Funktion hat VPC-Zugang und IAM Rolle von AdministratorAccess (Vollzugriff). Aus irgendeinem Grund kann die Methode ec2.describeInstances nicht ausgeführt werden. Was ist falsch und wie kann ich es beheben?

+0

Ist Ihre EC2-Instanz in einem privaten Subnetz in einer VPC? – error2007s

+0

Ja, und meine Lambda-Funktion hat dieses Subnetz in ihrer Konfiguration. – Danilo

+0

Haben Sie das jemals gelöst? Ich habe das gleiche Problem, und keine der Antworten geholfen – Slav

Antwort

1

Wenn Sie eine VPC-Konfiguration zu einer Lambda-Funktion hinzufügen, kann sie nur auf Ressourcen in dieser VPC zugreifen. Wenn eine Lambda-Funktion auf VPC-Ressourcen und das öffentliche Internet zugreifen muss, muss die VPC eine Network Address Translation (NAT) -Instanz in der VPC haben. Damit die EC2-Instanz Protokolle an die Cloud-Überwachung senden kann, benötigt sie eine Internetverbindung über die NAT-Instanz.

AWS Lambda verwendet die von Ihnen bereitgestellten VPC-Informationen zum Einrichten von ENIs, mit denen Ihre Lambda-Funktion auf VPC-Ressourcen zugreifen kann. Jedem ENI wird eine private IP-Adresse aus dem IP-Adressbereich innerhalb der von Ihnen angegebenen Subnetze zugewiesen, ihm werden jedoch keine öffentlichen IP-Adressen zugewiesen. Wenn Ihre Lambda-Funktion Internetzugriff erfordert (z. B. Zugriff auf AWS-Dienste, die keine VPC-Endpunkte haben, z. B. Amazon Cloudwatch), können Sie eine NAT-Instanz in Ihrer VPC konfigurieren oder das Amazon VPC-NAT-Gateway verwenden. Weitere Informationen finden Sie im Amazon VPC-Benutzerhandbuch unter NAT Gateways. Sie können kein Internet-Gateway verwenden, das an Ihre VPC angeschlossen ist, da dafür die ENI öffentliche IP-Adressen benötigt.

+0

Anstatt eine ec2-Methode zu verwenden und sie in CloudWatch zu protokollieren, möchte ich die Lambda-Funktion verwenden, um eine ec2-Instanz innerhalb derselben VPC von Lambda-Konfiguration zu ssh zu senden. Ist es notwendig, ein NAT zu konfigurieren? Muss ich eine Sicherheitsgruppe festlegen, damit Lambda sich mit Port 22 der Instanz verbinden kann? – Danilo

+0

Sie können SSH in die Instanz keine Internetverbindung, d. H. NAT benötigt nur für SSH. Und ja, Sie werden Lambda Zugang zu dieser EC2 Instination benötigen. – error2007s

1

Zuerst versuchen, diese role auf Ihr Lambda geben

{ 
     "Effect": "Allow", 
     "Resource": "*", 
     "Action": [ 
      "ec2:DescribeInstances", 
      "ec2:CreateNetworkInterface", 
      "ec2:AttachNetworkInterface", 
      "ec2:DescribeNetworkInterfaces", 
      "ec2:DeleteNetworkInterface", 
      "ec2:DetachNetworkInterface", 
      "ec2:ModifyNetworkInterfaceAttribute", 
      "ec2:ResetNetworkInterfaceAttribute", 
      "autoscaling:CompleteLifecycleAction" 
     ] 
    } 

Wenn die einen Unterschied dann nicht machen,

  • Sie ENI erstellen müssen. Gehen Sie zur Seite 'Netzwerkschnittstellen' https://console.aws.amazon.com/ec2/v2/home#NIC:sort=securityGroup und 'Create Network Interface'. Wählen Sie die entsprechenden Sicherheitsgruppen und das Subnetz aus (z. B. s0bn3t).
  • Jetzt, in den "Erweiterte Einstellungen" Ihres Lambda, wenn Sie die VPC auswählen, werden Sie eine Liste der Subnetze sehen. Wählen Sie nun das Subnetz aus, dem das obige ENI zugeordnet ist ('s0bn3t').

Ich glaube, das sollte es tun.

+0

Haben Sie das jemals gelöst? Ich habe das gleiche Problem, und keine der Antworten hat geholfen – Slav