Skip to content

Commit 3112ff8

Browse files
authored
feat: add support for class library lambda functions (#31)
1 parent c8ce789 commit 3112ff8

34 files changed

+1205
-192
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"Projects": [
3+
{
4+
"Name": "Aspire.Hosting.AWS",
5+
"Type": "Patch",
6+
"ChangelogMessages": [
7+
"Add support for adding Class Library Lambda Functions"
8+
]
9+
}
10+
]
11+
}

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ bld/
3434

3535
# Visual Studio 2015/2017 cache/options directory
3636
.vs/
37+
38+
# Jetbrains Rider cache
39+
.idea/
3740
# Uncomment if you have tasks that create the project's static files in wwwroot
3841
#wwwroot/
3942

Directory.Packages.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
<PackageVersion Include="Microsoft.Extensions.ServiceDiscovery" Version="$(AspireVersion)" />
1212
<PackageVersion Include="Microsoft.Extensions.ServiceDiscovery.Dns" Version="$(AspireVersion)" />
1313
<PackageVersion Include="Microsoft.Extensions.Http.Resilience" Version="$(AspireVersion)" />
14+
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.12.0" />
1415
<!-- AWS SDK for .NET dependencies -->
1516
<PackageVersion Include="AWSSDK.CloudFormation" Version="3.7.402.6" />
1617
<PackageVersion Include="AWSSDK.Core" Version="3.7.402.2" />

buildtools/ci.buildspec.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ phases:
66
dotnet: 8.x
77
build:
88
commands:
9-
- dotnet test --verbosity normal integrations-on-dotnet-aspire-for-aws.sln --configuration Release --logger trx --results-directory ./testresults
9+
- dotnet test --verbosity normal integrations-on-dotnet-aspire-for-aws.sln --configuration Release --logger "console;verbosity=detailed" --logger trx --results-directory ./testresults
1010
reports:
1111
integrations-on-dotnet-aspire-for-aws-tests:
1212
file-format: VisualStudioTrx

integrations-on-dotnet-aspire-for-aws.sln

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ToUpperLambdaFunctionExecut
2929
EndProject
3030
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lambda.AppHost", "playground\Lambda\Lambda.AppHost\Lambda.AppHost.csproj", "{B95CE2E4-BE17-4E29-ACE7-BDE309B34B26}"
3131
EndProject
32-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebAddLambdaFunction", "playground\Lambda\WebAddLambdaFunction\WebAddLambdaFunction.csproj", "{4B38CE7D-C548-4106-AAC4-4216A1E7F62C}"
33-
EndProject
34-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebMinusLambdaFunction", "playground\Lambda\WebMinusLambdaFunction\WebMinusLambdaFunction.csproj", "{F94B620B-7A26-4EC8-952C-12583063802A}"
35-
EndProject
3632
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Aspire.Hosting.AWS.Integ.Tests", "tests\Aspire.Hosting.AWS.Integ.Tests\Aspire.Hosting.AWS.Integ.Tests.csproj", "{85E281A8-944D-4303-9D9A-28B4F5AEF69F}"
3733
EndProject
3834
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebDefaultLambdaFunction", "playground\Lambda\WebDefaultLambdaFunction\WebDefaultLambdaFunction.csproj", "{FCAF3F64-BD16-4901-8D07-80049844B0A4}"
@@ -46,6 +42,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
4642
EndProject
4743
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebAWSCallsLambdaFunction", "playground\Lambda\WebAWSCallsLambdaFunction\WebAWSCallsLambdaFunction.csproj", "{96396A08-6FB9-49C2-A923-1AF1C97087EF}"
4844
EndProject
45+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebCalculatorFunctions", "playground\Lambda\WebCalculatorFunctions\WebCalculatorFunctions.csproj", "{4CE69424-50B4-1D2F-EA87-E9FC81C4BEA6}"
46+
EndProject
4947
Global
5048
GlobalSection(SolutionConfigurationPlatforms) = preSolution
5149
Debug|Any CPU = Debug|Any CPU
@@ -84,14 +82,6 @@ Global
8482
{B95CE2E4-BE17-4E29-ACE7-BDE309B34B26}.Debug|Any CPU.Build.0 = Debug|Any CPU
8583
{B95CE2E4-BE17-4E29-ACE7-BDE309B34B26}.Release|Any CPU.ActiveCfg = Release|Any CPU
8684
{B95CE2E4-BE17-4E29-ACE7-BDE309B34B26}.Release|Any CPU.Build.0 = Release|Any CPU
87-
{4B38CE7D-C548-4106-AAC4-4216A1E7F62C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
88-
{4B38CE7D-C548-4106-AAC4-4216A1E7F62C}.Debug|Any CPU.Build.0 = Debug|Any CPU
89-
{4B38CE7D-C548-4106-AAC4-4216A1E7F62C}.Release|Any CPU.ActiveCfg = Release|Any CPU
90-
{4B38CE7D-C548-4106-AAC4-4216A1E7F62C}.Release|Any CPU.Build.0 = Release|Any CPU
91-
{F94B620B-7A26-4EC8-952C-12583063802A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
92-
{F94B620B-7A26-4EC8-952C-12583063802A}.Debug|Any CPU.Build.0 = Debug|Any CPU
93-
{F94B620B-7A26-4EC8-952C-12583063802A}.Release|Any CPU.ActiveCfg = Release|Any CPU
94-
{F94B620B-7A26-4EC8-952C-12583063802A}.Release|Any CPU.Build.0 = Release|Any CPU
9585
{85E281A8-944D-4303-9D9A-28B4F5AEF69F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
9686
{85E281A8-944D-4303-9D9A-28B4F5AEF69F}.Debug|Any CPU.Build.0 = Debug|Any CPU
9787
{85E281A8-944D-4303-9D9A-28B4F5AEF69F}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -108,6 +98,10 @@ Global
10898
{96396A08-6FB9-49C2-A923-1AF1C97087EF}.Debug|Any CPU.Build.0 = Debug|Any CPU
10999
{96396A08-6FB9-49C2-A923-1AF1C97087EF}.Release|Any CPU.ActiveCfg = Release|Any CPU
110100
{96396A08-6FB9-49C2-A923-1AF1C97087EF}.Release|Any CPU.Build.0 = Release|Any CPU
101+
{4CE69424-50B4-1D2F-EA87-E9FC81C4BEA6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
102+
{4CE69424-50B4-1D2F-EA87-E9FC81C4BEA6}.Debug|Any CPU.Build.0 = Debug|Any CPU
103+
{4CE69424-50B4-1D2F-EA87-E9FC81C4BEA6}.Release|Any CPU.ActiveCfg = Release|Any CPU
104+
{4CE69424-50B4-1D2F-EA87-E9FC81C4BEA6}.Release|Any CPU.Build.0 = Release|Any CPU
111105
EndGlobalSection
112106
GlobalSection(SolutionProperties) = preSolution
113107
HideSolutionNode = FALSE
@@ -123,12 +117,11 @@ Global
123117
{C3C0B096-DB7C-4D1B-B8A0-91631B32B4DE} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
124118
{5CFF5B55-50C2-4689-AE89-95C1F676F608} = {C3C0B096-DB7C-4D1B-B8A0-91631B32B4DE}
125119
{B95CE2E4-BE17-4E29-ACE7-BDE309B34B26} = {C3C0B096-DB7C-4D1B-B8A0-91631B32B4DE}
126-
{4B38CE7D-C548-4106-AAC4-4216A1E7F62C} = {C3C0B096-DB7C-4D1B-B8A0-91631B32B4DE}
127-
{F94B620B-7A26-4EC8-952C-12583063802A} = {C3C0B096-DB7C-4D1B-B8A0-91631B32B4DE}
128120
{85E281A8-944D-4303-9D9A-28B4F5AEF69F} = {7F5F26A8-F41A-4B16-83F0-8A11EE396FAC}
129121
{FCAF3F64-BD16-4901-8D07-80049844B0A4} = {C3C0B096-DB7C-4D1B-B8A0-91631B32B4DE}
130122
{A2750C2D-1F82-47CB-9EAB-B819E3EBDD74} = {C3C0B096-DB7C-4D1B-B8A0-91631B32B4DE}
131123
{96396A08-6FB9-49C2-A923-1AF1C97087EF} = {C3C0B096-DB7C-4D1B-B8A0-91631B32B4DE}
124+
{4CE69424-50B4-1D2F-EA87-E9FC81C4BEA6} = {C3C0B096-DB7C-4D1B-B8A0-91631B32B4DE}
132125
EndGlobalSection
133126
GlobalSection(ExtensibilityGlobals) = postSolution
134127
SolutionGuid = {FBA55172-92F1-4495-A082-E0ABE4F4AF09}

playground/Lambda/Lambda.AppHost/Lambda.AppHost.csproj

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,9 @@
1212
<ProjectReference Include="..\..\..\src\Aspire.Hosting.AWS\Aspire.Hosting.AWS.csproj" IsAspireProjectResource="false" />
1313
<PackageReference Include="Aspire.Hosting.AppHost" />
1414
<ProjectReference Include="..\ToUpperLambdaFunctionExecutable\ToUpperLambdaFunctionExecutable.csproj" />
15-
<ProjectReference Include="..\WebAddLambdaFunction\WebAddLambdaFunction.csproj" />
1615
<ProjectReference Include="..\WebAWSCallsLambdaFunction\WebAWSCallsLambdaFunction.csproj" />
16+
<ProjectReference Include="..\WebCalculatorFunctions\WebCalculatorFunctions.csproj" />
1717
<ProjectReference Include="..\WebDefaultLambdaFunction\WebDefaultLambdaFunction.csproj" />
18-
<ProjectReference Include="..\WebMinusLambdaFunction\WebMinusLambdaFunction.csproj" />
1918
</ItemGroup>
2019

2120
</Project>

playground/Lambda/Lambda.AppHost/Program.cs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,24 @@
1111
builder.AddAWSLambdaFunction<Projects.ToUpperLambdaFunctionExecutable>("ToUpperFunction", lambdaHandler: "ToUpperLambdaFunctionExecutable", new LambdaFunctionOptions { ApplicationLogLevel = ApplicationLogLevel.DEBUG, LogFormat = LogFormat.JSON});
1212

1313
var defaultRouteLambda = builder.AddAWSLambdaFunction<Projects.WebDefaultLambdaFunction>("LambdaDefaultRoute", lambdaHandler: "WebDefaultLambdaFunction");
14-
var addRouteLambda = builder.AddAWSLambdaFunction<Projects.WebAddLambdaFunction>("AddDefaultRoute", lambdaHandler: "WebAddLambdaFunction");
15-
var minusRouteLambda = builder.AddAWSLambdaFunction<Projects.WebMinusLambdaFunction>("MinusDefaultRoute", lambdaHandler: "WebMinusLambdaFunction");
16-
var listAwsResourcesRouteLambda = builder.AddAWSLambdaFunction<Projects.WebAWSCallsLambdaFunction>("ListAwsResourcesRoute", lambdaHandler: "WebAWSCallsLambdaFunction")
17-
.WithReference(awsSdkConfig);
14+
var listAwsResourcesRouteLambda = builder.AddAWSLambdaFunction<Projects.WebAWSCallsLambdaFunction>("ListAwsResourcesRoute", lambdaHandler: "WebAWSCallsLambdaFunction");
15+
16+
var addFunction = builder.AddAWSLambdaFunction<Projects.WebCalculatorFunctions>("AddFunction", lambdaHandler: "WebCalculatorFunctions::WebCalculatorFunctions.Functions::AddFunctionHandler");
17+
var minusFunction = builder.AddAWSLambdaFunction<Projects.WebCalculatorFunctions>("MinusFunction", lambdaHandler: "WebCalculatorFunctions::WebCalculatorFunctions.Functions::MinusFunctionHandler");
18+
var multiplyFunction = builder.AddAWSLambdaFunction<Projects.WebCalculatorFunctions>("MultiplyFunction", lambdaHandler: "WebCalculatorFunctions::WebCalculatorFunctions.Functions::MultiplyFunctionHandler");
19+
var divideFunction = builder.AddAWSLambdaFunction<Projects.WebCalculatorFunctions>("DivideFunction", lambdaHandler: "WebCalculatorFunctions::WebCalculatorFunctions.Functions::DivideFunctionHandler");
20+
21+
1822

1923
builder.AddAWSAPIGatewayEmulator("APIGatewayEmulator", Aspire.Hosting.AWS.Lambda.APIGatewayType.HttpV2)
2024
.WithReference(defaultRouteLambda, Method.Get, "/")
21-
.WithReference(addRouteLambda, Method.Get, "/add/{x}/{y}")
22-
.WithReference(minusRouteLambda, Method.Get, "/minus/{x}/{y}")
23-
.WithReference(listAwsResourcesRouteLambda, Method.Get, "/aws/{service}");
25+
// Add route demonstrating making AWS servic calls
26+
.WithReference(listAwsResourcesRouteLambda, Method.Get, "/aws/{service}")
27+
// Add the Web API calculator routes
28+
.WithReference(addFunction, Method.Get, "/add/{x}/{y}")
29+
.WithReference(minusFunction, Method.Get, "/minus/{x}/{y}")
30+
.WithReference(multiplyFunction, Method.Get, "/multiply/{x}/{y}")
31+
.WithReference(divideFunction, Method.Get, "/divide/{x}/{y}");
2432

2533
builder.Build().Run();
2634

playground/Lambda/Lambda.sln

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
Microsoft Visual Studio Solution File, Format Version 12.00
2+
# Visual Studio Version 17
3+
VisualStudioVersion = 17.5.2.0
4+
MinimumVisualStudioVersion = 10.0.40219.1
5+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebAWSCallsLambdaFunction", "WebAWSCallsLambdaFunction\WebAWSCallsLambdaFunction.csproj", "{7D6DF6C9-3010-1B56-4593-3511D3E337A4}"
6+
EndProject
7+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ToUpperLambdaFunctionExecutable", "ToUpperLambdaFunctionExecutable\ToUpperLambdaFunctionExecutable.csproj", "{8CC5EAD7-1D76-A496-6939-6D609978B884}"
8+
EndProject
9+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebCalculatorFunctions", "WebCalculatorFunctions\WebCalculatorFunctions.csproj", "{2F2B6BEE-5138-9BE9-0BAD-FDB9D4DD2BC7}"
10+
EndProject
11+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lambda.ServiceDefaults", "Lambda.ServiceDefaults\Lambda.ServiceDefaults.csproj", "{D641A02E-7E2E-E14D-F66A-DF9A98D6D892}"
12+
EndProject
13+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebDefaultLambdaFunction", "WebDefaultLambdaFunction\WebDefaultLambdaFunction.csproj", "{5E6E80E0-7711-9D2C-A8F3-7DE7636B28DB}"
14+
EndProject
15+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lambda.AppHost", "Lambda.AppHost\Lambda.AppHost.csproj", "{7E7B4F87-5691-9C98-3D3D-CD536CF30F5A}"
16+
EndProject
17+
Global
18+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
19+
Debug|Any CPU = Debug|Any CPU
20+
Release|Any CPU = Release|Any CPU
21+
EndGlobalSection
22+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
23+
{7D6DF6C9-3010-1B56-4593-3511D3E337A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
24+
{7D6DF6C9-3010-1B56-4593-3511D3E337A4}.Debug|Any CPU.Build.0 = Debug|Any CPU
25+
{7D6DF6C9-3010-1B56-4593-3511D3E337A4}.Release|Any CPU.ActiveCfg = Release|Any CPU
26+
{7D6DF6C9-3010-1B56-4593-3511D3E337A4}.Release|Any CPU.Build.0 = Release|Any CPU
27+
{8CC5EAD7-1D76-A496-6939-6D609978B884}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
28+
{8CC5EAD7-1D76-A496-6939-6D609978B884}.Debug|Any CPU.Build.0 = Debug|Any CPU
29+
{8CC5EAD7-1D76-A496-6939-6D609978B884}.Release|Any CPU.ActiveCfg = Release|Any CPU
30+
{8CC5EAD7-1D76-A496-6939-6D609978B884}.Release|Any CPU.Build.0 = Release|Any CPU
31+
{2F2B6BEE-5138-9BE9-0BAD-FDB9D4DD2BC7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
32+
{2F2B6BEE-5138-9BE9-0BAD-FDB9D4DD2BC7}.Debug|Any CPU.Build.0 = Debug|Any CPU
33+
{2F2B6BEE-5138-9BE9-0BAD-FDB9D4DD2BC7}.Release|Any CPU.ActiveCfg = Release|Any CPU
34+
{2F2B6BEE-5138-9BE9-0BAD-FDB9D4DD2BC7}.Release|Any CPU.Build.0 = Release|Any CPU
35+
{D641A02E-7E2E-E14D-F66A-DF9A98D6D892}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
36+
{D641A02E-7E2E-E14D-F66A-DF9A98D6D892}.Debug|Any CPU.Build.0 = Debug|Any CPU
37+
{D641A02E-7E2E-E14D-F66A-DF9A98D6D892}.Release|Any CPU.ActiveCfg = Release|Any CPU
38+
{D641A02E-7E2E-E14D-F66A-DF9A98D6D892}.Release|Any CPU.Build.0 = Release|Any CPU
39+
{5E6E80E0-7711-9D2C-A8F3-7DE7636B28DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
40+
{5E6E80E0-7711-9D2C-A8F3-7DE7636B28DB}.Debug|Any CPU.Build.0 = Debug|Any CPU
41+
{5E6E80E0-7711-9D2C-A8F3-7DE7636B28DB}.Release|Any CPU.ActiveCfg = Release|Any CPU
42+
{5E6E80E0-7711-9D2C-A8F3-7DE7636B28DB}.Release|Any CPU.Build.0 = Release|Any CPU
43+
{7E7B4F87-5691-9C98-3D3D-CD536CF30F5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
44+
{7E7B4F87-5691-9C98-3D3D-CD536CF30F5A}.Debug|Any CPU.Build.0 = Debug|Any CPU
45+
{7E7B4F87-5691-9C98-3D3D-CD536CF30F5A}.Release|Any CPU.ActiveCfg = Release|Any CPU
46+
{7E7B4F87-5691-9C98-3D3D-CD536CF30F5A}.Release|Any CPU.Build.0 = Release|Any CPU
47+
EndGlobalSection
48+
GlobalSection(SolutionProperties) = preSolution
49+
HideSolutionNode = FALSE
50+
EndGlobalSection
51+
GlobalSection(ExtensibilityGlobals) = postSolution
52+
SolutionGuid = {3C4B1AC4-465B-44E6-B1DB-91BF726D48B2}
53+
EndGlobalSection
54+
EndGlobal

playground/Lambda/WebAWSCallsLambdaFunction/LambdaFunction.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@
88
using Microsoft.Extensions.Hosting;
99
using OpenTelemetry.Instrumentation.AWSLambda;
1010
using OpenTelemetry.Trace;
11-
using System.Reflection.Metadata.Ecma335;
1211
using System.Text.Json;
12+
using Amazon.SecurityToken;
13+
using Amazon.SecurityToken.Model;
1314

1415
namespace WebAWSCallsLambdaFunction;
1516

16-
internal class LambdaFunction(TracerProvider traceProvider, IAmazonSQS sqsClient, IAmazonDynamoDB ddbClient) : BackgroundService
17+
internal class LambdaFunction(TracerProvider traceProvider, IAmazonSQS sqsClient, IAmazonDynamoDB ddbClient, IAmazonSecurityTokenService stsClient) : BackgroundService
1718
{
1819
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
1920
{
@@ -41,7 +42,10 @@ private async Task<APIGatewayHttpApiV2ProxyResponse> LambdaHandler(APIGatewayHtt
4142
var ddbResponse = await ddbClient.ListTablesAsync();
4243
resources = ddbResponse.TableNames;
4344
break;
44-
45+
case "STS":
46+
var iamResponse = await stsClient.GetCallerIdentityAsync(new GetCallerIdentityRequest());
47+
resources = new(){ "Found caller identity" };
48+
break;
4549
}
4650

4751
if (resources == null)

playground/Lambda/WebAWSCallsLambdaFunction/Program.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
builder.AddServiceDefaults();
88
builder.Services.AddAWSService<Amazon.DynamoDBv2.IAmazonDynamoDB>();
99
builder.Services.AddAWSService<Amazon.SQS.IAmazonSQS>();
10+
builder.Services.AddAWSService<Amazon.SecurityToken.IAmazonSecurityTokenService>();
1011
builder.Services.AddHostedService<LambdaFunction>();
1112

1213
builder.Build().Run();

0 commit comments

Comments
 (0)