我已经在.NET核心中编写了以下小型Lambda函数用于测试目的。它在S3存储桶中的PUT上触发,并应在CloudWatch中显示对象名称,并将对象名称插入RDS实例中的表中。
以下是代码:
public async Task<string> FunctionHandler(S3Event evnt, ILambdaContext context)
{
context.Logger.LogLine("context.Logger.LogLine function begin");
var s3Event = evnt.Records?[0].S3;
if(s3Event == null)
{
context.Logger.LogLine("No S3 Events recorded");
return null;
}
try
{
var response = await this.S3Client.GetObjectMetadataAsync(s3Event.Bucket.Name, s3Event.Object.Key);
context.Logger.LogLine("S3 Key: " + s3Event.Object.Key.ToString());
var connectionString = Environment.GetEnvironmentVariable("ConnectionString");
SqlConnection c = new SqlConnection(connectionString);
c.Open();
SqlCommand cmd = new SqlCommand("INSERT INTO LambdaTestTable (ValueText) VALUES('" + s3Event.Object.Key + "')", c);
cmd.ExecuteNonQuery();
c.Close();
return response.Headers.ContentType;
}
catch(Exception e)
{
context.Logger.LogLine($"Error getting object {s3Event.Object.Key} from bucket {s3Event.Bucket.Name}. Make sure they exist and your bucket is in the same region as this function.");
context.Logger.LogLine(e.Message);
context.Logger.LogLine(e.StackTrace);
throw;
}
}
我在CloudWatch中获得以下输出:
START RequestId:15c5eddb-8171-11e7-af34-251688cfddb2版本:$ LATEST Console.WriteLine函数开始context.Logger.LogLine函数开始 S3键:TaskTemplate.dp发现错误获取对象时出错 来自bucket api-dev-dpstorage-s3的TaskTemplate.dp。确保它们存在 并且您的存储桶与此功能位于同一区域。一个 建立时发生与网络相关或特定于实例的错误 与SQL Server的连接。服务器未找到或未找到 无障碍。验证实例名称是否正确以及SQL 服务器配置为允许远程连接。 (提供者:TCP 提供程序,错误:40 - 无法打开与SQL Server的连接)
我在这里不清楚两个错误。首先,当CloudWatch成功显示我的对象密钥,一旦文件被PUT到存储桶,它就会出现错误,说它无法找到对象?其次,它尝试连接到SQL RDS实例时出现网络/实例错误。我正在使用一个连接字符串,该字符串由另一个应用程序在EC2实例中成功使用。