Skip to content

Commit d5c6783

Browse files
Add [DynamoDBEvent] annotation attribute and source generator support (#2320)
* Add [DynamoDBEvent] annotation attribute and source generator support - DynamoDBEventAttribute with Stream, ResourceName, BatchSize, StartingPosition, MaximumBatchingWindowInSeconds, Filters, Enabled - DynamoDBEventAttributeBuilder for Roslyn AttributeData parsing - Source generator wiring (TypeFullNames, SyntaxReceiver, EventTypeBuilder, AttributeModelBuilder) - CloudFormationWriter ProcessDynamoDBAttribute (SAM DynamoDB event source mapping) - LambdaFunctionValidator ValidateDynamoDBEvents - DiagnosticDescriptors InvalidDynamoDBEventAttribute (AWSLambda0132) - DynamoDBEventAttributeTests (attribute unit tests) - DynamoDBEventsTests (CloudFormation writer tests) - E2E source generator snapshot tests - Integration test (DynamoDBEventSourceMapping) - Sample function (DynamoDbStreamProcessing) - .autover change file - README documentation pr comments * update * add tests * update tests * update skill * pr comments * revert runtime support change * use enum
1 parent 1829286 commit d5c6783

41 files changed

Lines changed: 2475 additions & 39 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
---
2+
name: new-event-source
3+
description: Add a new AWS event source attribute (e.g., Kinesis, Kafka, MQ) to the Lambda .NET Annotations framework, including the attribute class, source generator integration, CloudFormation writer, unit tests, writer tests, source generator tests, and integration tests
4+
---
5+
6+
# Adding a New Event Source to Lambda Annotations
7+
8+
This skill guides you through adding a complete new event source attribute to the AWS Lambda .NET Annotations framework. Use this when a user asks to add support for a new AWS event source like Kinesis, Kafka, MQ, etc.
9+
10+
## Prerequisites
11+
12+
Before starting, gather from the user:
13+
1. **Service name** (e.g., "Kinesis", "Kafka", "MQ")
14+
2. **Primary resource identifier** (e.g., stream ARN, topic ARN, broker ARN)
15+
3. **CloudFormation event type string** (e.g., "Kinesis", "MSK", "MQ")
16+
4. **Event class name** from the corresponding `Amazon.Lambda.*Events` NuGet package (e.g., `KinesisEvent`)
17+
5. **Optional properties** the attribute should support (e.g., BatchSize, StartingPosition, Filters)
18+
6. **Whether `@` references use `Fn::GetAtt` or `Ref`** — event source mappings use `Fn::GetAtt`, subscriptions use `Ref`
19+
20+
## Reference Examples
21+
22+
Read these files to understand existing patterns before creating new ones:
23+
- **SNS (simplest, subscription-based)**: `Libraries/src/Amazon.Lambda.Annotations/SNS/SNSEventAttribute.cs`
24+
- **SQS (event source mapping with batching)**: `Libraries/src/Amazon.Lambda.Annotations/SQS/SQSEventAttribute.cs`
25+
- **DynamoDB (stream-based)**: `Libraries/src/Amazon.Lambda.Annotations/DynamoDB/DynamoDBEventAttribute.cs`
26+
- **S3 (notification-based)**: `Libraries/src/Amazon.Lambda.Annotations/S3/S3EventAttribute.cs`
27+
28+
## Steps
29+
30+
### Step 1: Create the Event Attribute Class
31+
32+
**Create**: `Libraries/src/Amazon.Lambda.Annotations/{ServiceName}/{ServiceName}EventAttribute.cs`
33+
34+
Key patterns:
35+
- Add copyright header: `// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.` + `// SPDX-License-Identifier: Apache-2.0`
36+
- Inherit from `Attribute` with `[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]`
37+
- Constructor takes the primary resource identifier as a required `string` parameter
38+
- All optional properties use nullable backing fields with `Is<PropertyName>Set` internal properties
39+
- Include auto-derived `ResourceName` property (strips `@` prefix or extracts name from ARN)
40+
- Include `internal List<string> Validate()` method with all validation rules
41+
- Use `Regex("^[a-zA-Z0-9]+$")` for ResourceName validation
42+
43+
### Step 2: Register Type Full Names
44+
45+
**Modify**: `Libraries/src/Amazon.Lambda.Annotations.SourceGenerator/TypeFullNames.cs`
46+
47+
Add constants:
48+
```csharp
49+
public const string {ServiceName}EventAttribute = "Amazon.Lambda.Annotations.{ServiceName}.{ServiceName}EventAttribute";
50+
public const string {ServiceName}Event = "Amazon.Lambda.{ServiceName}Events.{ServiceName}Event";
51+
```
52+
53+
Also add to `EventType` enum if needed in `Libraries/src/Amazon.Lambda.Annotations.SourceGenerator/Models/EventType.cs`.
54+
55+
### Step 3: Create the Attribute Builder
56+
57+
**Create**: `Libraries/src/Amazon.Lambda.Annotations.SourceGenerator/Models/Attributes/{ServiceName}EventAttributeBuilder.cs`
58+
59+
Extracts attribute data from Roslyn `AttributeData`. Use consistent `else if` chaining. Reference: `SNSEventAttributeBuilder.cs`.
60+
61+
### Step 4: Register in AttributeModelBuilder
62+
63+
**Modify**: `Libraries/src/Amazon.Lambda.Annotations.SourceGenerator/Models/Attributes/AttributeModelBuilder.cs`
64+
65+
Add `else if` block for the new attribute type after the existing event attribute blocks.
66+
67+
### Step 5: Register in EventTypeBuilder
68+
69+
**Modify**: `Libraries/src/Amazon.Lambda.Annotations.SourceGenerator/Models/EventTypeBuilder.cs`
70+
71+
Add `else if` block mapping the attribute to the `EventType` enum value.
72+
73+
### Step 6: Add DiagnosticDescriptor
74+
75+
**Modify**: `Libraries/src/Amazon.Lambda.Annotations.SourceGenerator/Diagnostics/DiagnosticDescriptors.cs`
76+
77+
Add descriptor with the next available `AWSLambda0XXX` ID for invalid attribute validation errors.
78+
79+
**Modify**: `Libraries/src/Amazon.Lambda.Annotations.SourceGenerator/Diagnostics/AnalyzerReleases.Unshipped.md` — add the new diagnostic ID.
80+
81+
### Step 7: Add Validation in LambdaFunctionValidator
82+
83+
**Modify**: `Libraries/src/Amazon.Lambda.Annotations.SourceGenerator/Validation/LambdaFunctionValidator.cs`
84+
85+
1. Add `Validate{ServiceName}Events()` call in `ValidateFunction` method
86+
2. Create private `Validate{ServiceName}Events()` method that validates:
87+
- Attribute properties via `Validate()` method
88+
- Method parameters (first must be event type, optional second is `ILambdaContext`)
89+
- Return type (usually `void` or `Task`)
90+
91+
### Step 8: Add Dependency Check
92+
93+
**Modify**: `Libraries/src/Amazon.Lambda.Annotations.SourceGenerator/Validation/LambdaFunctionValidator.cs`
94+
95+
In `ValidateDependencies`, add check for `Amazon.Lambda.{ServiceName}Events` NuGet package.
96+
97+
### Step 9: Check SyntaxReceiver
98+
99+
**Check**: `Libraries/src/Amazon.Lambda.Annotations.SourceGenerator/SyntaxReceiver.cs`
100+
101+
Add the new attribute name if the SyntaxReceiver filters by attribute name strings.
102+
103+
### Step 10: Add CloudFormation Writer Logic
104+
105+
**Modify**: `Libraries/src/Amazon.Lambda.Annotations.SourceGenerator/Writers/CloudFormationWriter.cs`
106+
107+
1. Add `case AttributeModel<{ServiceName}EventAttribute>` in the event processing switch
108+
2. Create `Process{ServiceName}Attribute()` method that writes CF template properties
109+
- Event source mappings (SQS, DynamoDB, Kinesis): use `Fn::GetAtt` for `@` references
110+
- Subscription events (SNS): use `Ref` for `@` references
111+
- Track synced properties in metadata
112+
113+
### Step 11: Create Attribute Unit Tests
114+
115+
**Create**: `Libraries/test/Amazon.Lambda.Annotations.SourceGenerators.Tests/{ServiceName}EventAttributeTests.cs`
116+
117+
Cover: constructor, defaults, property tracking, ResourceName derivation, all validation paths. Reference: `SQSEventAttributeTests.cs`, `DynamoDBEventAttributeTests.cs`, `SNSEventAttributeTests.cs`.
118+
119+
### Step 12: Create CloudFormation Writer Tests
120+
121+
**Create**: `Libraries/test/Amazon.Lambda.Annotations.SourceGenerators.Tests/WriterTests/{ServiceName}EventsTests.cs`
122+
123+
This is a `partial class CloudFormationWriterTests`. Include tests for:
124+
1. `Verify{ServiceName}EventAttributes_AreCorrectlyApplied` — Theory with JSON/YAML and property combinations
125+
2. `Verify{ServiceName}EventProperties_AreSyncedCorrectly` — Synced properties update when attributes change
126+
3. `SwitchBetweenArnAndRef_For{Resource}` — ARN to `@` reference switching
127+
4. `Verify{Resource}CanBeSet_FromCloudFormationParameter` — CF Parameters handling
128+
5. `VerifyManuallySet{ServiceName}EventProperties_ArePreserved` — Hand-edited template preservation
129+
130+
Reference: `SQSEventsTests.cs`, `DynamoDBEventsTests.cs`, `SNSEventsTests.cs`.
131+
132+
### Step 13: Create Valid Event Examples + Source Generator Test
133+
134+
**Create**: `Libraries/test/TestServerlessApp/{ServiceName}EventExamples/Valid{ServiceName}Events.cs.txt`
135+
**Create**: `Libraries/test/Amazon.Lambda.Annotations.SourceGenerators.Tests/Snapshots/{ServiceName}/` (generated handler snapshots)
136+
**Create**: `Libraries/test/Amazon.Lambda.Annotations.SourceGenerators.Tests/Snapshots/ServerlessTemplates/{serviceName}Events.template`
137+
**Modify**: `Libraries/test/Amazon.Lambda.Annotations.SourceGenerators.Tests/SourceGeneratorTests.cs` — add `VerifyValid{ServiceName}Events()` test
138+
139+
### Step 14: Create Invalid Event Examples + Source Generator Test
140+
141+
**Create**: `Libraries/test/TestServerlessApp/{ServiceName}EventExamples/Invalid{ServiceName}Events.cs.error`
142+
143+
Cover: invalid property values, invalid params, invalid return type, multiple events, invalid ARN, invalid resource name.
144+
145+
**Modify**: `Libraries/test/Amazon.Lambda.Annotations.SourceGenerators.Tests/SourceGeneratorTests.cs` — add `VerifyInvalid{ServiceName}Events_ThrowsCompilationErrors()` test with diagnostic assertions including line spans.
146+
147+
### Step 15: Create Generated Code Snapshots
148+
149+
**Create**: `Libraries/test/Amazon.Lambda.Annotations.SourceGenerators.Tests/Snapshots/{ServiceName}/`
150+
151+
Tip: Run the source generator once to get actual output, then use as snapshot.
152+
153+
### Step 16: Create Integration Test
154+
155+
**Create**: `Libraries/test/TestServerlessApp.IntegrationTests/{ServiceName}EventSourceMapping.cs`
156+
**Modify**: `Libraries/test/TestServerlessApp.IntegrationTests/IntegrationTestContextFixture.cs` — resource lookup
157+
**Modify**: `Libraries/test/TestServerlessApp.IntegrationTests/DeploymentScript.ps1` — if needed
158+
159+
### Step 17: Update AnalyzerReleases.Unshipped.md
160+
161+
**Modify**: `Libraries/src/Amazon.Lambda.Annotations.SourceGenerator/Diagnostics/AnalyzerReleases.Unshipped.md`
162+
163+
## File Map Summary
164+
165+
| Action | File Path |
166+
|--------|-----------|
167+
| Create | `src/Amazon.Lambda.Annotations/{ServiceName}/{ServiceName}EventAttribute.cs` |
168+
| Modify | `src/Amazon.Lambda.Annotations.SourceGenerator/TypeFullNames.cs` |
169+
| Create | `src/Amazon.Lambda.Annotations.SourceGenerator/Models/Attributes/{ServiceName}EventAttributeBuilder.cs` |
170+
| Modify | `src/Amazon.Lambda.Annotations.SourceGenerator/Models/Attributes/AttributeModelBuilder.cs` |
171+
| Modify | `src/Amazon.Lambda.Annotations.SourceGenerator/Models/EventTypeBuilder.cs` |
172+
| Modify | `src/Amazon.Lambda.Annotations.SourceGenerator/Diagnostics/DiagnosticDescriptors.cs` |
173+
| Modify | `src/Amazon.Lambda.Annotations.SourceGenerator/Validation/LambdaFunctionValidator.cs` |
174+
| Modify | `src/Amazon.Lambda.Annotations.SourceGenerator/SyntaxReceiver.cs` |
175+
| Modify | `src/Amazon.Lambda.Annotations.SourceGenerator/Writers/CloudFormationWriter.cs` |
176+
| Modify | `src/Amazon.Lambda.Annotations.SourceGenerator/Diagnostics/AnalyzerReleases.Unshipped.md` |
177+
| Create | `test/Amazon.Lambda.Annotations.SourceGenerators.Tests/{ServiceName}EventAttributeTests.cs` |
178+
| Create | `test/Amazon.Lambda.Annotations.SourceGenerators.Tests/WriterTests/{ServiceName}EventsTests.cs` |
179+
| Create | `test/TestServerlessApp/{ServiceName}EventExamples/Valid{ServiceName}Events.cs.txt` |
180+
| Create | `test/TestServerlessApp/{ServiceName}EventExamples/Invalid{ServiceName}Events.cs.error` |
181+
| Create | `test/Amazon.Lambda.Annotations.SourceGenerators.Tests/Snapshots/{ServiceName}/` |
182+
| Create | `test/Amazon.Lambda.Annotations.SourceGenerators.Tests/Snapshots/ServerlessTemplates/{serviceName}Events.template` |
183+
| Modify | `test/Amazon.Lambda.Annotations.SourceGenerators.Tests/SourceGeneratorTests.cs` |
184+
| Create | `test/TestServerlessApp.IntegrationTests/{ServiceName}EventSourceMapping.cs` |
185+
| Modify | `test/TestServerlessApp.IntegrationTests/IntegrationTestContextFixture.cs` |
186+
187+
## Important Conventions
188+
189+
- **Copyright header** on every new `.cs` file
190+
- **Consistent `else if` chaining** in attribute builders (never `if` then `if` for the same loop)
191+
- **Both JSON and YAML** template formats must be tested in writer tests
192+
- **Invalid event test spans** must reference exact line numbers in the `.cs.error` file
193+
- **`.cs.txt` extension** for valid test files (prevents deployment)
194+
- **`.cs.error` extension** for invalid test files (prevents compilation)
195+
- **Use enums instead of strings** when you need to represent a fixed, known set of constants that do not change frequently (e.g., `StartingPosition`, `AuthType`, `HttpApiVersion`). Enums provide compile-time type safety, eliminate the need for manual string validation in the `Validate()` method, and prevent invalid values from being set. In attribute builders, enum values come through Roslyn's `AttributeData` as their underlying `int` value and must be cast accordingly (e.g., `(MyEnum)(int)pair.Value.Value`). When writing enum values to CloudFormation templates, use `.ToString()` to convert back to the string representation.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"Projects": [
3+
{
4+
"Name": "Amazon.Lambda.Annotations",
5+
"Type": "Minor",
6+
"ChangelogMessages": [
7+
"Added [DynamoDBEvent] annotation attribute for declaratively configuring DynamoDB stream-triggered Lambda functions with support for stream reference, batch size, starting position, batching window, filters, and enabled state."
8+
]
9+
}
10+
]
11+
}

Libraries/src/Amazon.Lambda.Annotations.SourceGenerator/Diagnostics/AnalyzerReleases.Unshipped.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,5 @@ AWSLambda0133 | AWSLambdaCSharpGenerator | Error | ALB Listener Reference Not Fo
2121
AWSLambda0134 | AWSLambdaCSharpGenerator | Error | FromRoute not supported on ALB functions
2222
AWSLambda0135 | AWSLambdaCSharpGenerator | Error | Unmapped parameter on ALB function
2323
AWSLambda0136 | AWSLambdaCSharpGenerator | Error | Invalid S3EventAttribute
24+
AWSLambda0137 | AWSLambdaCSharpGenerator | Error | Invalid DynamoDBEventAttribute
2425
AWSLambda0138 | AWSLambdaCSharpGenerator | Error | Invalid SNSEventAttribute

Libraries/src/Amazon.Lambda.Annotations.SourceGenerator/Diagnostics/DiagnosticDescriptors.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,13 @@ public static class DiagnosticDescriptors
282282
DiagnosticSeverity.Error,
283283
isEnabledByDefault: true);
284284

285+
public static readonly DiagnosticDescriptor InvalidDynamoDBEventAttribute = new DiagnosticDescriptor(id: "AWSLambda0137",
286+
title: "Invalid DynamoDBEventAttribute",
287+
messageFormat: "Invalid DynamoDBEventAttribute encountered: {0}",
288+
category: "AWSLambdaCSharpGenerator",
289+
DiagnosticSeverity.Error,
290+
isEnabledByDefault: true);
291+
285292
public static readonly DiagnosticDescriptor InvalidSnsEventAttribute = new DiagnosticDescriptor(id: "AWSLambda0138",
286293
title: "Invalid SNSEventAttribute",
287294
messageFormat: "Invalid SNSEventAttribute encountered: {0}",

Libraries/src/Amazon.Lambda.Annotations.SourceGenerator/Models/Attributes/AttributeModelBuilder.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System;
55
using Amazon.Lambda.Annotations.ALB;
66
using Amazon.Lambda.Annotations.APIGateway;
7+
using Amazon.Lambda.Annotations.DynamoDB;
78
using Amazon.Lambda.Annotations.S3;
89
using Amazon.Lambda.Annotations.SQS;
910
using Microsoft.CodeAnalysis;
@@ -113,6 +114,15 @@ public static AttributeModel Build(AttributeData att, GeneratorExecutionContext
113114
Type = TypeModelBuilder.Build(att.AttributeClass, context)
114115
};
115116
}
117+
else if (att.AttributeClass.Equals(context.Compilation.GetTypeByMetadataName(TypeFullNames.DynamoDBEventAttribute), SymbolEqualityComparer.Default))
118+
{
119+
var data = DynamoDBEventAttributeBuilder.Build(att);
120+
model = new AttributeModel<DynamoDBEventAttribute>
121+
{
122+
Data = data,
123+
Type = TypeModelBuilder.Build(att.AttributeClass, context)
124+
};
125+
}
116126
else if (att.AttributeClass.Equals(context.Compilation.GetTypeByMetadataName(TypeFullNames.SNSEventAttribute), SymbolEqualityComparer.Default))
117127
{
118128
var data = SNSEventAttributeBuilder.Build(att);
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
using Amazon.Lambda.Annotations.DynamoDB;
5+
using Microsoft.CodeAnalysis;
6+
using System;
7+
8+
namespace Amazon.Lambda.Annotations.SourceGenerator.Models.Attributes
9+
{
10+
/// <summary>
11+
/// Builder for <see cref="DynamoDBEventAttribute"/>.
12+
/// </summary>
13+
public class DynamoDBEventAttributeBuilder
14+
{
15+
public static DynamoDBEventAttribute Build(AttributeData att)
16+
{
17+
if (att.ConstructorArguments.Length != 1)
18+
{
19+
throw new NotSupportedException($"{TypeFullNames.DynamoDBEventAttribute} must have constructor with 1 argument.");
20+
}
21+
var stream = att.ConstructorArguments[0].Value as string;
22+
var data = new DynamoDBEventAttribute(stream);
23+
24+
foreach (var pair in att.NamedArguments)
25+
{
26+
if (pair.Key == nameof(data.ResourceName) && pair.Value.Value is string resourceName)
27+
{
28+
data.ResourceName = resourceName;
29+
}
30+
else if (pair.Key == nameof(data.BatchSize) && pair.Value.Value is uint batchSize)
31+
{
32+
data.BatchSize = batchSize;
33+
}
34+
else if (pair.Key == nameof(data.StartingPosition) && pair.Value.Value is int startingPosition)
35+
{
36+
data.StartingPosition = (StartingPosition)startingPosition;
37+
}
38+
else if (pair.Key == nameof(data.Enabled) && pair.Value.Value is bool enabled)
39+
{
40+
data.Enabled = enabled;
41+
}
42+
else if (pair.Key == nameof(data.MaximumBatchingWindowInSeconds) && pair.Value.Value is uint maximumBatchingWindowInSeconds)
43+
{
44+
data.MaximumBatchingWindowInSeconds = maximumBatchingWindowInSeconds;
45+
}
46+
else if (pair.Key == nameof(data.Filters) && pair.Value.Value is string filters)
47+
{
48+
data.Filters = filters;
49+
}
50+
}
51+
52+
return data;
53+
}
54+
}
55+
}

Libraries/src/Amazon.Lambda.Annotations.SourceGenerator/Models/Attributes/SQSEventAttributeBuilder.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
using Amazon.Lambda.Annotations.SQS;
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
using Amazon.Lambda.Annotations.SQS;
25
using Microsoft.CodeAnalysis;
36
using System;
47

@@ -24,7 +27,7 @@ public static SQSEventAttribute Build(AttributeData att)
2427
{
2528
data.ResourceName = resourceName;
2629
}
27-
if (pair.Key == nameof(data.BatchSize) && pair.Value.Value is uint batchSize)
30+
else if (pair.Key == nameof(data.BatchSize) && pair.Value.Value is uint batchSize)
2831
{
2932
data.BatchSize = batchSize;
3033
}

Libraries/src/Amazon.Lambda.Annotations.SourceGenerator/Models/EventTypeBuilder.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ public static HashSet<EventType> Build(IMethodSymbol lambdaMethodSymbol,
3434
{
3535
events.Add(EventType.S3);
3636
}
37+
else if (attribute.AttributeClass.ToDisplayString() == TypeFullNames.DynamoDBEventAttribute)
38+
{
39+
events.Add(EventType.DynamoDB);
40+
}
3741
else if (attribute.AttributeClass.ToDisplayString() == TypeFullNames.SNSEventAttribute)
3842
{
3943
events.Add(EventType.SNS);

Libraries/src/Amazon.Lambda.Annotations.SourceGenerator/SyntaxReceiver.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ internal class SyntaxReceiver : ISyntaxContextReceiver
2828
{ "SQSEventAttribute", "SQSEvent" },
2929
{ "ALBApiAttribute", "ALBApi" },
3030
{ "S3EventAttribute", "S3Event" },
31+
{ "DynamoDBEventAttribute", "DynamoDBEvent" },
3132
{ "SNSEventAttribute", "SNSEvent" }
3233
};
3334

Libraries/src/Amazon.Lambda.Annotations.SourceGenerator/TypeFullNames.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ public static class TypeFullNames
6262
public const string S3Event = "Amazon.Lambda.S3Events.S3Event";
6363
public const string S3EventAttribute = "Amazon.Lambda.Annotations.S3.S3EventAttribute";
6464

65+
public const string DynamoDBEvent = "Amazon.Lambda.DynamoDBEvents.DynamoDBEvent";
66+
public const string DynamoDBEventAttribute = "Amazon.Lambda.Annotations.DynamoDB.DynamoDBEventAttribute";
67+
6568
public const string SNSEvent = "Amazon.Lambda.SNSEvents.SNSEvent";
6669
public const string SNSEventAttribute = "Amazon.Lambda.Annotations.SNS.SNSEventAttribute";
6770

@@ -95,6 +98,7 @@ public static class TypeFullNames
9598
SQSEventAttribute,
9699
ALBApiAttribute,
97100
S3EventAttribute,
101+
DynamoDBEventAttribute,
98102
SNSEventAttribute
99103
};
100104
}

0 commit comments

Comments
 (0)