代码之家  ›  专栏  ›  技术社区  ›  Louis

如何从Lambda的CloudFormation访问Athena QueryString?

  •  2
  • Louis  · 技术社区  · 7 年前

    AWS加载了一个问题,但有人知道在Lambda中访问Athena查询字符串(在CloudFormation中)的正确方法吗?

    我在CloudFormation中设置了Athena NamedQuery和Lambda。抽象出一些更具体的项目细节,我的一般形式是:

    MyQuery:
     Type: AWS::Athena::NamedQuery
     Properties:
       Database: "mydatabase"
       Name: "DataQuery"
       QueryString: SELECT * FROM mydatabase
    
    MyLambda:
    Type: AWS::Serverless::Function
    Properties:
      Handler: 'handlers.migration_handler'
      Runtime: python3.6
      CodeUri:
        Bucket: BATS::SAM::CodeS3Bucket
        Key: BATS::SAM::CodeS3Key
      Description: Migrates data from output of Athena query to S3
      Policies:
        - AmazonS3FullAccess
        - AWSLambdaExecute
        - AmazonAthenaFullAccess
      Environment:
        Variables:
          MY_QUERY:
            Ref: MyQuery
    

    当我为lambda编写处理程序时,我想调用:

    athena_client = boto3.client('athena')
    response = athena_client.start_query_execution(
          QueryString = os.environ['MY_QUERY']
          ResultConfiguration = {'OutputLocation: 's3://my-bucket'}
    )
    

    然而,QueryString需要是一个字符串,所以这目前不起作用。我想访问我的\u查询中的QueryString属性,我觉得我已经很接近了,但我不太确定如何完成最后一步。我们将非常感谢您的帮助。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Louis    7 年前

    昨天就解决了(或者更具体地说,是我的队友解决了)。

    Boto3碰巧有另一个方法调用 get_named_query(NamedQueryId) ,并以以下形式返回字典:

    {
    'NamedQuery': {
        'Name': 'string',
        'Description': 'string',
        'Database': 'string',
        'QueryString': 'string',
        'NamedQueryId': 'string'
    }
    

    因此,当我将lambda处理程序修改为:

    athena_client = boto3.client('athena')
    
    query_info = athena_client.get_named_query(
        NamedQueryId = os.environ['MY_QUERY']
    )
    
    response = athena_client.start_query_execution(
        QueryString = query_info['NamedQuery']['QueryString']
        ResultConfiguration = {'OutputLocation: 's3://my-bucket'}
    )