web-dev-qa-db-ja.com

Boto3タイムアウトを使用するAWSLambda関数

私は自分の質問を解決しましたが、他の誰かを数時間節約することを期待してとにかくそれを投稿しています!

Pythonを使用してレコードをキネシスキューに挿入するサーバーレスプロジェクトがAWSにあります。ただし、boto3.client( 'kinesis')またはput_record関数を使用すると、時間になるまでハングするようです。エラーメッセージやその他の情報はありません。以下は機能です。

import boto3

def put_record_kinesis(data, stream_name, partition_key):
    print "create kinesis begin"
    kinesis = boto3.client("kinesis")

    print "put record begin"
    response = kinesis.put_record(StreamName=stream_name, Data=data, PartitionKey=partition_key)
    print "put record complete"
    print response

Serverless.ymlの定義は次のとおりです。

provider:
  name: aws
  runtime: python2.7
  iamRoleStatements:
    - Effect: "Allow"
      Action:
        - "ec2:CreateNetworkInterface"
        - "ec2:DescribeNetworkInterfaces"
        - "ec2:DeleteNetworkInterface"
        - "kinesis:*"
      Resource: "*"

  vpc:
    securityGroupIds:
      - sg-...
    subnetIds:
      - subnet-...
      - subnet-...
      - subnet-...

  stage: dev
  region: eu-west-1
  memorySize: 128

functions:
  LambdaQueueFunction:
    handler: python_file.queue
    memorySize: 1024
    timeout: 100

  LambdaDequeueFunction:
    handler: python_file.dequeue

resources:
  Resources:
    KinesisQueue:
      Type: AWS::Kinesis::Stream
      Properties:
        Name: kinesis-queue
        ShardCount: 1
    ChronosQueueMap:
      Type: AWS::Lambda::EventSourceMapping
      DependsOn:
        - "LambdaDequeueFunctionLambdaFunction"
        - "IamPolicyLambdaExecution"
      Properties:
        BatchSize: 1
        EventSourceArn:
          Fn::GetAtt:
            - "KinesisQueue"
            - "Arn"
        FunctionName:
          Fn::GetAtt:
            - "LambdaDequeueFunctionLambdaFunction"
            - "Arn"
        StartingPosition: "TRIM_HORIZON"

関数を実行すると、クラウドウォッチログに次のように表示されます。

10:53:02 | START RequestId: 027bb0cb-acb4-11e6-b20c-1b587b734943 Version: $LATEST
10:53:02 | put records begin
10:54:42 | END RequestId: 027bb0cb-acb4-11e6-b20c-1b587b734943
10:54:42 | REPORT RequestId: 027bb0cb-acb4-11e6-b20c-1b587b734943   Duration: 100002.99 ms  Billed Duration: 100000 ms Memory Size: 1024 MB Max Memory Used: 22 MB
10:54:42 | 2016-11-17T10:54:42.155Z 027bb0cb-acb4-11e6-b20c-1b587b734943 Task timed out after 100.00 seconds

解決策は、ラムダ関数がインターネットにアクセスできなかったということでした。デフォルトでは、VPCにないラムダ関数にはインターネットアクセスがありますが、VPC内のラムダ関数にはありません。

これを修正するために、新しいサブネット、ルートテーブル、エラスティックIP、およびNATゲートウェイを作成しました。それらは次のように構成されました。

  • NATゲートウェイはElasticIPを使用し、インターネットゲートウェイを持つ任意のサブネットを指します
  • ルートテーブルには、ローカルトラフィックのルート(。0.0/16 |ローカル|アクティブ)と、他のすべてのIPのNATゲートウェイへのルート(0.0.0.0/0 | NAT ID |アクティブ)
  • は、新しいルートテーブルを使用するように設定されています。

これが誰かを助けることを願っています!

14
William Moore

解決策は、ラムダ関数がインターネットにアクセスできなかったということでした。デフォルトでは、VPCにないラムダ関数にはインターネットアクセスがありますが、VPC内のラムダ関数にはありません。

これを修正するために、新しいサブネット、ルートテーブル、エラスティックIP、およびNATゲートウェイを作成しました。それらは次のように構成されました。

  • NATゲートウェイはエラスティックIPを使用し、インターネットゲートウェイを持つ任意のサブネットを指します
  • ルートテーブルには、ローカルトラフィックのルートがあります(..0.0/16 | Local | Active)および他のすべてのIPのNATゲートウェイ(0.0.0.0/0 | NAT ID | Active
  • は、新しいルートテーブルを使用するように設定されています。

これが誰かを助けることを願っています!

22
William Moore