2015-11-28 8 views
8

私はこの関数をpythonで期待どおりに動作させています。 AWSラムダ関数に変換するにはどうすればよいですか?関数をLambdaに変換

def mymailgun(url):  
    import urllib2 
    myfile=urllib2.urlopen(url) 

    import requests 
    print requests.post("https://api.mailgun.net/v3/XXX.mailgun.org/messages", 
         auth=("api", "key-XXX"), 
         files=[("attachment", myfile) 
           #("attachment", open("files/test.txt")) 
           ], 
         data={"from": "Excited User <[email protected]>", 
           "to": "[email protected]", 
           "cc": "[email protected]", 
           "bcc": "[email protected]", 
           "subject": "Hello", 
           "text": "Testing some awesomness with attachments!", 
           "html": myfile}) 

答えて

1

コードはLambda Function Programming Modelに準拠している必要があります。コードは軽微な変更が必要になるようです。 Pythonコードでは、その関数の1つをハンドラとして識別する必要があります。公式マニュアルから

def handler_name(event, context): 
    ... 
    return some_value 

を:これは、次のように行われている

イベントAWSラムダは ハンドラにイベントデータを渡すために、このパラメータを使用しています。このパラメータは通常、Pythonのdict型です。 もlist、str、int、float、またはNoneTypeのいずれの型でもあります。

context-AWSラムダはこのパラメータを使用して、ランタイム情報 をハンドラに提供します。このパラメータはLambdaContext型です。 オプションで、ハンドラは値を返すことができます。何がラムダ 機能を呼び出すときに使用する呼び出しの種類に依存返さ 値はどうなる:

あなたはRequestResponse呼び出しタイプ(同期 実行)を使用している場合は、AWSラムダはPythonの関数呼び出し の結果を返します。クライアントはラムダ関数を呼び出す(HTTP応答で に呼び出し要求をJSONにシリアライズする)。たとえば、AWS Lambda コンソールはRequestResponse呼び出しタイプを使用するため、コンソールを使用して 関数を呼び出すと、コンソールに 戻り値が表示されます。

  • ハンドラが何も返さない場合、AWS Lambdaはnullを返します。

  • イベント起動型(非同期実行)を使用すると、値は破棄されます。これらの変更により

最初のステップは、展開パッケージに、すべての依存関係と一緒に、コードをパッケージ化するだろうしました。これを行うには、

.zipファイルを次のように作成する必要があります。

まず、パッケージのディレクトリを作成します。この場合はMailgunScriptなどと似ています。すべてのPythonソースファイルをこのディレクトリのルートレベルに保存します。

あなたはあなたの任意のディレクトリに、要求とurllib2のライブラリのように、すべての必要なライブラリをインストールするには、PIPコマンドを使用することができます。最後に

pip install requests -t /absolutePathTo/MailgunScript 
pip install urllib2 -t /absolutePathTo/MailgunScript 

、あなたはコンテンツから.zipアーカイブを作成する必要があります。このディレクトリのものであり、ディレクトリ自体のものではありません。

これで、展開パッケージをラムダ関数にする準備が整いました。 AWS管理コンソールにログインし、Create a Lambda Functionを選択します。青写真を選択するように求められたら、デフォルトのhello-world青写真を選択して、展開パッケージをアップロードし、必要に応じて残りのフィールドに記入してください。

メインのAWS管理コンソールに戻り、機能を選択してtestをクリックするだけで、この機能をテストできます。また、手動で次のようなコマンドを使用して、コマンドラインインターフェイスから新しいラムダ関数を呼び出すことができます。

aws lambda invoke \ 
--region yourRegion \ 
--function-name yourFunctionName \ 
--payload '{"url"}' \ 
--invocation-type RequestResponse \ 
/tmp/response 

これはあなたの機能と出力の検査のため/tmp/responseへの応答を実行します。

+0

私のmailgun関数にはURLが入力されています。イベントにどのように渡しますか? – shantanuo

+0

については、私はLinux zip fieで問題に直面しており、コードをウィンドウにコピーしてwinzipを使用する必要があります。そうでなければ、 "no module find"とエラーが発生し続けます。 – BMW

2

ラムダ関数で関数を設定する必要があります。 doumentationに言ったように:

def handler_name(event, context): 
    return some_value 

イベント - AWSラムダは、ハンドラにイベントデータを渡すために、このパラメータを使用しています。このパラメータは通常、Pythonのdict型です。また、list、str、int、float、またはNoneTypeの型にすることもできます。

コンテキスト - AWS Lambdaは、このパラメータを使用してハンドラにランタイム情報を提供します。このパラメータはLambdaContext型です。

テストラムダ関数としてコード:

  1. ファイルを保存し
  2. パッケージファイルと任意の依存関係.zipファイルにMore info
  3. のいずれかのコンソールを使用して.zipファイルをアップロードまたはAWS CLIを使用してラムダ関数を作成します。ラムダ関数との詳細については

    aws lambda create-function \ 
    --region us-west-2 \ 
    --function-name HelloPython \ 
    --zip-file fileb://deployment-package.zip \ 
    --role arn:aws:iam::account-id:role/lambda_basic_execution \ 
    --handler hello_python.my_handler \ 
    --runtime python2.7 \ 
    --timeout 15 \ 
    --memory-size 512 
    

    : クリックherehere

CLIコマンドMore infoは、ラムダ関数を作成します。 :)