2016-08-17 12 views
0

インポートされたライブラリでPythonでLambdaスクリプトを実行しようとしていますが、権限エラーが発生しています。 データベースについていくつかの警告が表示されていますが、サブプロセスの後にデータベースクエリが呼び出されるため、関連しているとは思われません。誰かがなぜエラーを起こすのか説明できますか?AWS - OSエラー許可Lambdaスクリプトが拒否されました

アラート情報

Alarm:Database-WriteCapacityUnitsLimit-BasicAlarm 
State changed to INSUFFICIENT_DATA at 2016/08/16. Reason: Unchecked: Initial alarm creation 

ラムダエラー

[Errno 13] Permission denied: OSError Traceback (most recent call last):File "/var/task/lambda_function.py", line 36, in lambda_handler  
xml_output = subprocess.check_output(["./mediainfo", "--full", "--output=XML", signed_url]) 
File "/usr/lib64/python2.7/subprocess.py", line 566, in check_output process = Popen(stdout=PIPE, *popenargs, **kwargs) 
File "/usr/lib64/python2.7/subprocess.py", line 710, in __init__ errread, errwrite) File "/usr/lib64/python2.7/subprocess.py", line 1335, in _execute_child raise child_exception 
OSError: [Errno 13] Permission denied 

ラムダコード

import logging 
import subprocess 

import boto3 

SIGNED_URL_EXPIRATION = 300  # The number of seconds that the Signed URL is valid 
DYNAMODB_TABLE_NAME = "TechnicalMetadata" 
DYNAMO = boto3.resource("dynamodb") 
TABLE = DYNAMO.Table(DYNAMODB_TABLE_NAME) 

logger = logging.getLogger('boto3') 
logger.setLevel(logging.INFO) 


def lambda_handler(event, context): 
    """ 

    :param event: 
    :param context: 
    """ 
    # Loop through records provided by S3 Event trigger 
    for s3_record in event['Records']: 
     logger.info("Working on new s3_record...") 
     # Extract the Key and Bucket names for the asset uploaded to S3 
     key = s3_record['s3']['object']['key'] 
     bucket = s3_record['s3']['bucket']['name'] 
     logger.info("Bucket: {} \t Key: {}".format(bucket, key)) 
     # Generate a signed URL for the uploaded asset 
     signed_url = get_signed_url(SIGNED_URL_EXPIRATION, bucket, key) 
     logger.info("Signed URL: {}".format(signed_url)) 
     # Launch MediaInfo 
     # Pass the signed URL of the uploaded asset to MediaInfo as an input 
     # MediaInfo will extract the technical metadata from the asset 
     # The extracted metadata will be outputted in XML format and 
     # stored in the variable xml_output 
     xml_output = subprocess.check_output(["./mediainfo", "--full", "--output=XML", signed_url]) 
     logger.info("Output: {}".format(xml_output)) 
     save_record(key, xml_output) 

def save_record(key, xml_output): 
    """ 
    Save record to DynamoDB 

    :param key:   S3 Key Name 
    :param xml_output: Technical Metadata in XML Format 
    :return: 
    """ 
    logger.info("Saving record to DynamoDB...") 
    TABLE.put_item(
     Item={ 
      'keyName': key, 
      'technicalMetadata': xml_output 
     } 
    ) 
    logger.info("Saved record to DynamoDB") 


def get_signed_url(expires_in, bucket, obj): 
    """ 
    Generate a signed URL 
    :param expires_in: URL Expiration time in seconds 
    :param bucket: 
    :param obj:   S3 Key name 
    :return:   Signed URL 
    """ 
    s3_cli = boto3.client("s3") 
    presigned_url = s3_cli.generate_presigned_url('get_object', Params={'Bucket': bucket, 'Key': obj}, 
                ExpiresIn=expires_in) 
    return presigned_url 
+0

ラムダ関数でサブプロセスを実行しようとしているようです。あなたが助けが必要な場合は、コードを表示する必要があります。また、データベース(DynamoDB?)アラートがどのように関連しているかはわかりません。 –

+0

@ MarkB私はAWS上でサブプロセスを実行するためにどのような権限が必要ですか? – Juanvulcano

+0

ラムダ展開の一環として、この「mediainfo」スクリプトまたは実行可能ファイルをパッケージ化しましたか? –

答えて

0

私は、これはラムダ実行環境によって課される制限があることをかなり確信しているが、それシェルを介してスクリプトを実行することで回避できます。
は、あなたのサブプロセスの呼び出しに真のシェルを=提供してみてください。

xml_output = subprocess.check_output(["./mediainfo", "--full", "--output=XML", signed_url], shell=True) 
+0

先日、このソリューションがありましたが、試してみませんでした。私の問題はかなり簡単に解決されました。私は実行可能ファイルとしてコマンドを圧縮せず、アクセスできませんでした。それをexeにして、再度圧縮して私の問題を解決しました – Juanvulcano

0

私は似たような状況に遭遇しました。私は、エラーを受け取った:私のために

2016-11-28T01:49:01.304Z d4505c71-b50c-11e6-b0a1-65eecf2623cd Error: Command failed: /var/task/node_modules/youtube-dl/bin/youtube-dl --dump-json -f best https://soundcloud.com/bla/blabla 
python: can't open file '/var/task/node_modules/youtube-dl/bin/youtube-dl': [Errno 13] Permission denied 

(および他のすべての)サードパーティのライブラリを含むノードラムダプロジェクト、「node_modules」(ほとんどのチュートリアル、such as this oneというディレクトリが存在します、意志の詳細を、このディレクトリが作成される方法すべてのサードパーティのパッケージとそれらの依存関係があります。他のサポートされている言語(現在のPythonとJava)にも同じ原則が適用されます。 これは、アマゾンが実際にラムダAMISを装着し、使用しようとしているファイルであるです。だから、問題を解決するために、node_modulesディレクトリ(または任意のディレクトリサードパーティライブラリが住んでいる)でこれを実行します。

chmod -R 777 /Users/bla/bla/bla/lambdaproject/node_modules 

このコマンドは、読み出し、書き込み可能なすべてのユーザが実行可能ファイルを行うことを意味します。明らかに、ラムダ関数を実行するサーバが動作するために必要なものです。うまくいけば、これは役立ちます!

+0

私のnode_modulesディレクトリをchmodしても同じエラーが出ます。他に何かをしなければなりませんでしたか?私が試した他のすべてのモジュールは動作するようです – Jon

+0

私は考えることができません。私の高度なアドバイスは、[これと似たような](https://medium.com/@AdamRNeary/a-gulp-workflow-for-amazon-lambda-61c2afd723b6#.aggupxrrr)のデプロイメントを自動化して、任意のステップを逃す。参考までに、私のデプロイスクリプトの1つ([https://github.com/josephecombs/automated_soundcloud_downloading/blob/master/downloadThenUpload/gulpfile.js])を参考にしてください。 –

関連する問題