2016-04-26 74 views
5

我想允許用戶開始需要,只有當它的EC2實例開始從AWS LAMBDA EC2實例。超時而使用boto3

所以我創建了一個lambda函數來做到這一點:

import boto3 

def lambda_handler(event, context): 
    ec2 = boto3.resource('ec2', region_name='eu-central-1') 
    return ec2.instances.filter(InstanceIds=['i-abc123']).start() 

我還添加以下IAM權限:

{ 
     "Effect": "Allow", 
     "Action": [ 
      "ec2:StartInstances" 
     ], 
     "Resource": "arn:aws:ec2:*" 
    }, 
    { 
     "Effect": "Allow", 
     "Action": [ 
      "ec2:DescribeInstances" 
     ], 
     "Resource": "*" 
    } 

問題是,當我執行拉姆達我得到定時出。

BTW在同一個VPC和相同權限內運行完全相同的EC2代碼,立即返回。

有什麼想法?

+0

您是否爲Lambda函數啓用了VPC訪問? –

+0

您是否在Lambda中設置了適當的IAM角色+用戶 http://docs.aws.amazon.com/lambda/latest/dg/setting-up.html 您可能需要將資源庫設置爲「」 arn:aws:ec2:accoun-id:user-name「 lamdba腳本還需要特定的用戶憑證來確定資源 – mootmoot

+0

我將lambda的VPC配置爲與EC2實例相同 – Michael

回答

2

如果憑據問題,你不會得到超時。更有可能的是,你正在使用一個小內存模型,並且boto需要大量內存,甚至做簡單的事情。嘗試使用更大的內存模型或更長的超時運行。

如果這變成是這個問題,可以考慮創建類的初始化代碼的EC2資源或使用Singleton模式,以便後續調用可以使用相同的資源。但是,一定要設置函數超時,以便它有足夠的時間進行初始化以及正常的任務,即使這看起來沒有必要。如果你的函數發生錯誤,下一次運行可能包括類初始化時間。