.net NET集成

.net NET集成,.net,amazon-web-services,amazon-athena,.net,Amazon Web Services,Amazon Athena,我正在着手一个项目,将现有的VB.net webform应用程序集成到AWS上存储的新数据中。我已经下载了一个雅典娜SDK,建议它可以完全做到这一点,但我无法让它工作。以下是我到目前为止的模块: Imports System Imports System.Threading Imports System.Threading.Tasks Imports System.Collections.Generic Imports Amazon Imports Amazon.Athena Imports A

我正在着手一个项目,将现有的VB.net webform应用程序集成到AWS上存储的新数据中。我已经下载了一个雅典娜SDK,建议它可以完全做到这一点,但我无法让它工作。以下是我到目前为止的模块:

Imports System
Imports System.Threading
Imports System.Threading.Tasks
Imports System.Collections.Generic
Imports Amazon
Imports Amazon.Athena
Imports Amazon.Athena.Model

Namespace athena_api
Class AthenaQuery

    Private Const ATHENA_TEMP_PATH As String = "s3://xxxxxxxxxxx"
    Private Const ATHENA_DB As String = "xxxxx"
    Public Sub New()

        Using client = New AmazonAthenaClient(Amazon.RegionEndpoint.USEast1)
            Dim qContext As QueryExecutionContext = New QueryExecutionContext()
            qContext.Database = ATHENA_DB
            Dim resConf As ResultConfiguration = New ResultConfiguration()
            resConf.OutputLocation = ATHENA_TEMP_PATH
            Console.WriteLine("Created Athena Client")
            run(client, qContext, resConf).Wait()
        End Using

    End Sub

    Public Shared Async Function run(ByVal client As IAmazonAthena, ByVal qContext As QueryExecutionContext, ByVal resConf As ResultConfiguration) As Task
        Dim qReq As StartQueryExecutionRequest = New StartQueryExecutionRequest() With {
            .QueryString = "select count(*) from testTable",
            .QueryExecutionContext = qContext,
            .ResultConfiguration = resConf
        }

        Try
            Dim qRes As StartQueryExecutionResponse = Await client.StartQueryExecutionAsync(qReq)
            Dim items As List(Of Dictionary(Of String, String)) = Await getQueryExecution(client, qRes.QueryExecutionId)

            For Each item In items

                For Each pair As KeyValuePair(Of String, String) In item
                    Console.WriteLine("Col: {0}", pair.Key)
                    Console.WriteLine("Val: {0}", pair.Value)
                Next
            Next

        Catch e As InvalidRequestException
            Console.WriteLine("Run Error: {0}", e.Message)
        End Try


    End Function

    Public Shared Async Function getQueryExecution(ByVal client As IAmazonAthena, ByVal id As String) As Task(Of List(Of Dictionary(Of String, String)))
        Dim items As List(Of Dictionary(Of String, String)) = New List(Of Dictionary(Of String, String))()
        Dim results As GetQueryExecutionResponse = Nothing
        Dim q As QueryExecution = Nothing
        Dim qReq As GetQueryExecutionRequest = New GetQueryExecutionRequest() With {
            .QueryExecutionId = id
        }

        Do

            Try
                results = Await client.GetQueryExecutionAsync(qReq)
                q = results.QueryExecution
                Console.WriteLine("Status: {0}... {1}", q.Status.State, q.Status.StateChangeReason)
                Await Task.Delay(5000)
            Catch e As InvalidRequestException
                Console.WriteLine("GetQueryExec Error: {0}", e.Message)
            End Try
        Loop While q.Status.State = "RUNNING" OrElse q.Status.State = "QUEUED"

        Console.WriteLine("Data Scanned for {0}: {1} Bytes", id, q.Statistics.DataScannedInBytes)
        Dim resReq As GetQueryResultsRequest = New GetQueryResultsRequest() With {
            .QueryExecutionId = id,
            .MaxResults = 10
        }
        Dim resResp As GetQueryResultsResponse = Nothing

        Do
            resResp = Await client.GetQueryResultsAsync(resReq)

            For Each row As Row In resResp.ResultSet.Rows
                Dim dict As Dictionary(Of String, String) = New Dictionary(Of String, String)()

                For i = 0 To resResp.ResultSet.ResultSetMetadata.ColumnInfo.Count - 1
                    dict.Add(resResp.ResultSet.ResultSetMetadata.ColumnInfo(i).Name, row.Data(i).VarCharValue)
                Next

                items.Add(dict)
            Next

            If resResp.NextToken IsNot Nothing Then
                resReq.NextToken = resResp.NextToken
            End If
        Loop While resResp.NextToken IsNot Nothing

        Return items
    End Function
End Class

End Namespace
运行时,我收到以下错误:

mscorlib.dll中发生类型为“System.AggregateException”的未处理异常

我也不清楚这个api是如何对AWS进行身份验证的。。。没有请求任何密钥或令牌,因此似乎任何具有S3路径和DB名称的人都可以访问


谢谢大家,这是我第一次尝试使用AWS的项目,所以请耐心听我说

在身份验证部分…针对Visual Studio…安装针对Visual Studio的AWS工具包。。。这将包括AWS浏览器。您可以从那里创建和管理配置文件-然后在AppSettings中引用配置文件名称。。。比如:

<appSettings>
    <add key="AWSProfileName" value="YOUR-PROFILE-NAME"/>
    <add key="AWSRegion" value="us-east-1" />
</appSettings>

关于错误


关于雅典娜。。。c#,但如果足够接近,我会想:

假设您正在桌面上运行此程序,它将通过您可能已设置的
default
AWS配置文件进行身份验证。如果你还没有设置,你可能想这样做,错误可能会消失。我被告知有一个默认配置文件,但仍然得到错误。还有其他想法吗?此API上似乎没有文档。如果您有默认配置文件,那么您应该具有良好的凭据。我需要查看AggregateException的内部异常,才能真正了解出了什么问题。