Skip to content

Commit 3156a46

Browse files
authored
Merge pull request #1986 from irina-herciu/issues/1654_ConvertDynamoDBEvent
Add DynamoDBEvents SDK Convertor package
2 parents 1e125b6 + 54d2ca9 commit 3156a46

13 files changed

+547
-0
lines changed

.autover/autover.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@
5050
{
5151
"Name": "Amazon.Lambda.DynamoDBEvents",
5252
"Path": "Libraries/src/Amazon.Lambda.DynamoDBEvents/Amazon.Lambda.DynamoDBEvents.csproj"
53+
},
54+
{
55+
"Name": "Amazon.Lambda.DynamoDBEvents.SDK.Convertor",
56+
"Path": "Libraries/src/Amazon.Lambda.DynamoDBEvents.SDK.Convertor/Amazon.Lambda.DynamoDBEvents.SDK.Convertor.csproj"
5357
},
5458
{
5559
"Name": "Amazon.Lambda.KafkaEvents",
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.DynamoDBEvents.SDK.Convertor",
5+
"Type": "Major",
6+
"ChangelogMessages": [
7+
"Implement DynamoDBEvents SDK Convertor package for DynamoDBEvent images to DynamoDBv2.Document"
8+
]
9+
}
10+
]
11+
}

CONTRIBUTING.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ The available projects are:
8686
* Amazon.Lambda.ConnectEvents
8787
* Amazon.Lambda.Core
8888
* Amazon.Lambda.DynamoDBEvents
89+
* Amazon.Lambda.DynamoDBEvents.SDK.Convertor
8990
* Amazon.Lambda.KafkaEvents
9091
* Amazon.Lambda.KinesisAnalyticsEvents
9192
* Amazon.Lambda.KinesisEvents

Libraries/Libraries.sln

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SnapshotRestore.Registry",
135135
EndProject
136136
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SnapshotRestore.Registry.Tests", "test\SnapshotRestore.Registry.Tests\SnapshotRestore.Registry.Tests.csproj", "{A699E183-D0D4-4F26-A0A7-88DA5607F455}"
137137
EndProject
138+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Amazon.Lambda.DynamoDBEvents.SDK.Convertor", "src\Amazon.Lambda.DynamoDBEvents.SDK.Convertor\Amazon.Lambda.DynamoDBEvents.SDK.Convertor.csproj", "{3400F4E9-BA12-4D3D-9BA1-2798AA8D0AFC}"
139+
EndProject
140+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Amazon.Lambda.DynamoDBEvents.SDK.Convertor.Tests", "test\Amazon.Lambda.DynamoDBEvents.SDK.Convertor.Tests\Amazon.Lambda.DynamoDBEvents.SDK.Convertor.Tests.csproj", "{074DB940-82BA-47D4-B888-C213D4220A82}"
141+
EndProject
138142
Global
139143
GlobalSection(SolutionConfigurationPlatforms) = preSolution
140144
Debug|Any CPU = Debug|Any CPU
@@ -369,6 +373,14 @@ Global
369373
{A699E183-D0D4-4F26-A0A7-88DA5607F455}.Debug|Any CPU.Build.0 = Debug|Any CPU
370374
{A699E183-D0D4-4F26-A0A7-88DA5607F455}.Release|Any CPU.ActiveCfg = Release|Any CPU
371375
{A699E183-D0D4-4F26-A0A7-88DA5607F455}.Release|Any CPU.Build.0 = Release|Any CPU
376+
{3400F4E9-BA12-4D3D-9BA1-2798AA8D0AFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
377+
{3400F4E9-BA12-4D3D-9BA1-2798AA8D0AFC}.Debug|Any CPU.Build.0 = Debug|Any CPU
378+
{3400F4E9-BA12-4D3D-9BA1-2798AA8D0AFC}.Release|Any CPU.ActiveCfg = Release|Any CPU
379+
{3400F4E9-BA12-4D3D-9BA1-2798AA8D0AFC}.Release|Any CPU.Build.0 = Release|Any CPU
380+
{074DB940-82BA-47D4-B888-C213D4220A82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
381+
{074DB940-82BA-47D4-B888-C213D4220A82}.Debug|Any CPU.Build.0 = Debug|Any CPU
382+
{074DB940-82BA-47D4-B888-C213D4220A82}.Release|Any CPU.ActiveCfg = Release|Any CPU
383+
{074DB940-82BA-47D4-B888-C213D4220A82}.Release|Any CPU.Build.0 = Release|Any CPU
372384
EndGlobalSection
373385
GlobalSection(SolutionProperties) = preSolution
374386
HideSolutionNode = FALSE
@@ -435,6 +447,8 @@ Global
435447
{7300983D-8FCE-42EA-9B9E-B1C5347D15D8} = {1DE4EE60-45BA-4EF7-BE00-B9EB861E4C69}
436448
{7261A438-8C1D-47AD-98B0-7678F72E4382} = {AAB54E74-20B1-42ED-BC3D-CE9F7BC7FD12}
437449
{A699E183-D0D4-4F26-A0A7-88DA5607F455} = {1DE4EE60-45BA-4EF7-BE00-B9EB861E4C69}
450+
{3400F4E9-BA12-4D3D-9BA1-2798AA8D0AFC} = {AAB54E74-20B1-42ED-BC3D-CE9F7BC7FD12}
451+
{074DB940-82BA-47D4-B888-C213D4220A82} = {1DE4EE60-45BA-4EF7-BE00-B9EB861E4C69}
438452
EndGlobalSection
439453
GlobalSection(ExtensibilityGlobals) = postSolution
440454
SolutionGuid = {503678A4-B8D1-4486-8915-405A3E9CF0EB}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<Import Project="..\..\..\buildtools\common.props" />
4+
5+
<PropertyGroup>
6+
<Description>Amazon Lambda .NET Core support - DynamoDBEvents SDK Convertor package.</Description>
7+
<TargetFrameworks>net8.0</TargetFrameworks>
8+
<AssemblyTitle>Amazon.Lambda.DynamoDBEvents.SDK.Convertor</AssemblyTitle>
9+
<AssemblyName>Amazon.Lambda.DynamoDBEvents.SDK.Convertor</AssemblyName>
10+
<PackageId>Amazon.Lambda.DynamoDBEvents.SDK.Convertor</PackageId>
11+
<PackageTags>AWS;Amazon;Lambda</PackageTags>
12+
<Version>0.0.1</Version>
13+
</PropertyGroup>
14+
<ItemGroup>
15+
<None Include="README.md" Pack="true" PackagePath="\" />
16+
</ItemGroup>
17+
18+
<ItemGroup>
19+
<PackageReference Include="AWSSDK.DynamoDBv2" Version="3.7.405.23" />
20+
</ItemGroup>
21+
22+
<ItemGroup>
23+
<ProjectReference Include="..\Amazon.Lambda.DynamoDBEvents\Amazon.Lambda.DynamoDBEvents.csproj" />
24+
</ItemGroup>
25+
26+
</Project>
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
namespace Amazon.Lambda.DynamoDBEvents.SDK.Convertor
2+
{
3+
using System.Collections.Generic;
4+
5+
/// <summary>
6+
/// Convert DynamoDB Event AttributeValue to SDK AttributeValue
7+
/// </summary>
8+
public static class DynamodbAttributeValueConvertor
9+
{
10+
/// <summary>
11+
/// Convert Lambda AttributeValue to SDK AttributeValue
12+
/// </summary>
13+
/// <param name="lambdaAttribute">The Lambda AttributeValue to convert.</param>
14+
/// <returns>The converted SDK AttributeValue.</returns>
15+
public static Amazon.DynamoDBv2.Model.AttributeValue ConvertToSdkAttribute(this
16+
DynamoDBEvent.AttributeValue lambdaAttribute)
17+
{
18+
if (lambdaAttribute == null)
19+
return null;
20+
21+
var sdkAttribute = new Amazon.DynamoDBv2.Model.AttributeValue();
22+
23+
// String
24+
if (!string.IsNullOrEmpty(lambdaAttribute.S))
25+
sdkAttribute.S = lambdaAttribute.S;
26+
27+
// Number
28+
else if (!string.IsNullOrEmpty(lambdaAttribute.N))
29+
sdkAttribute.N = lambdaAttribute.N;
30+
31+
// Boolean
32+
else if (lambdaAttribute.BOOL.HasValue)
33+
{
34+
sdkAttribute.BOOL = lambdaAttribute.BOOL.Value;
35+
}
36+
37+
// Null
38+
else if (lambdaAttribute.NULL.HasValue)
39+
sdkAttribute.NULL = lambdaAttribute.NULL.Value;
40+
41+
// Binary
42+
else if (lambdaAttribute.B != null)
43+
sdkAttribute.B = lambdaAttribute.B;
44+
45+
// String Set
46+
else if (lambdaAttribute.SS != null)
47+
sdkAttribute.SS = new List<string>(lambdaAttribute.SS);
48+
49+
// Number Set
50+
else if (lambdaAttribute.NS != null)
51+
sdkAttribute.NS = new List<string>(lambdaAttribute.NS);
52+
53+
// Binary Set
54+
else if (lambdaAttribute.BS != null)
55+
sdkAttribute.BS = lambdaAttribute.BS;
56+
57+
// List
58+
else if (lambdaAttribute.L != null)
59+
{
60+
sdkAttribute.L = new List<Amazon.DynamoDBv2.Model.AttributeValue>();
61+
foreach (var item in lambdaAttribute.L)
62+
{
63+
sdkAttribute.L.Add(item.ConvertToSdkAttribute());
64+
}
65+
}
66+
67+
// Map
68+
else if (lambdaAttribute.M != null)
69+
{
70+
sdkAttribute.M = new Dictionary<string, Amazon.DynamoDBv2.Model.AttributeValue>();
71+
foreach (var kvp in lambdaAttribute.M)
72+
{
73+
sdkAttribute.M[kvp.Key] = kvp.Value.ConvertToSdkAttribute();
74+
}
75+
}
76+
77+
return sdkAttribute;
78+
}
79+
80+
/// <summary>
81+
/// Convert Dictionary of Lambda AttributeValue to SDK Dictionary of AttributeValue
82+
/// </summary>
83+
/// <param name="lambdaAttributes">The dictionary of Lambda AttributeValue to convert.</param>
84+
/// <returns>The converted dictionary of SDK AttributeValue.</returns>
85+
public static Dictionary<string, Amazon.DynamoDBv2.Model.AttributeValue> ConvertToSdkAttributeValueDictionary(
86+
this Dictionary<string, DynamoDBEvent.AttributeValue> lambdaAttributes)
87+
{
88+
var sdkDictionary = new Dictionary<string, Amazon.DynamoDBv2.Model.AttributeValue>();
89+
90+
if (lambdaAttributes == null)
91+
return sdkDictionary;
92+
93+
foreach (var kvp in lambdaAttributes)
94+
{
95+
sdkDictionary[kvp.Key] = ConvertToSdkAttribute(kvp.Value);
96+
}
97+
98+
return sdkDictionary;
99+
}
100+
}
101+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
namespace Amazon.Lambda.DynamoDBEvents.SDK.Convertor
2+
{
3+
4+
/// <summary>
5+
/// Convert DynamoDB Event Identity to SDK Identity
6+
/// </summary>
7+
public static class DynamodbIdentityConvertor
8+
{
9+
/// <summary>
10+
/// Convert Lambda Identity to SDK Identity
11+
/// </summary>
12+
/// <param name="lambdaIdentity">The Lambda Identity to convert.</param>
13+
/// <returns>The converted SDK Identity.</returns>
14+
public static Amazon.DynamoDBv2.Model.Identity ConvertToSdkIdentity(this DynamoDBEvent.Identity lambdaIdentity)
15+
{
16+
if (lambdaIdentity == null)
17+
return null;
18+
19+
var sdkIdentity = new Amazon.DynamoDBv2.Model.Identity
20+
{
21+
PrincipalId = lambdaIdentity.PrincipalId,
22+
Type = lambdaIdentity.Type
23+
};
24+
25+
return sdkIdentity;
26+
}
27+
}
28+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
namespace Amazon.Lambda.DynamoDBEvents.SDK.Convertor
2+
{
3+
/// <summary>
4+
/// Convert DynamoDB Event StreamRecord to SDK StreamRecord
5+
/// </summary>
6+
public static class DynamodbStreamRecordConvertor
7+
{
8+
9+
/// <summary>
10+
/// Convert Lambda StreamRecord to SDK StreamRecord
11+
/// </summary>
12+
/// <param name="lambdaStreamRecord">The Lambda StreamRecord to convert.</param>
13+
/// <returns>The converted SDK StreamRecord.</returns>
14+
public static Amazon.DynamoDBv2.Model.StreamRecord ConvertToSdkStreamRecord(this DynamoDBEvent.StreamRecord lambdaStreamRecord)
15+
{
16+
if (lambdaStreamRecord == null)
17+
return null;
18+
19+
var sdkStreamRecord = new Amazon.DynamoDBv2.Model.StreamRecord
20+
{
21+
ApproximateCreationDateTime = lambdaStreamRecord.ApproximateCreationDateTime,
22+
Keys = lambdaStreamRecord.Keys?.ConvertToSdkAttributeValueDictionary(),
23+
NewImage = lambdaStreamRecord.NewImage?.ConvertToSdkAttributeValueDictionary(),
24+
OldImage = lambdaStreamRecord.OldImage?.ConvertToSdkAttributeValueDictionary(),
25+
SequenceNumber = lambdaStreamRecord.SequenceNumber,
26+
SizeBytes = lambdaStreamRecord.SizeBytes,
27+
StreamViewType = lambdaStreamRecord.StreamViewType
28+
};
29+
30+
return sdkStreamRecord;
31+
}
32+
33+
}
34+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# Amazon.Lambda.DynamoDBEvents.SDK.Convertor
2+
3+
This package provides helper extension methods to use alongside Amazon.Lambda.DynamoDBEvents in order to transform Lambda input event model objects into SDK-compatible output model objects (eg. DynamodbEvent to a List of records writable back to DynamoDB through the AWS DynamoDB SDK for .NET).
4+
5+
## Overview
6+
7+
The `DynamodbAttributeValueConvertor` and `DynamodbStreamRecordConvertor` classes provide methods to convert DynamoDB event data from the Lambda format to the SDK format. This is useful when you need to process DynamoDB events in a Lambda function and interact with the AWS SDK for .NET.
8+
9+
## Usage
10+
11+
### Converting AttributeValue
12+
13+
The following example demonstrates how to convert a `DynamoDBEvent.AttributeValue` to an `Amazon.DynamoDBv2.Model.AttributeValue`:
14+
15+
16+
The following is a sample class and Lambda function that receives Amazon DynamoDB event record data as an input and writes some of the incoming event data to CloudWatch Logs. (Note that by default anything written to Console will be logged as CloudWatch Logs events.)
17+
18+
```csharp
19+
public class Function
20+
{
21+
public void Handler(DynamoDBEvent ddbEvent)
22+
{
23+
foreach (var record in ddbEvent.Records)
24+
{
25+
var ddbRecord = record.Dynamodb;
26+
var sdkAttributeValue = ddbRecord.NewImage["exampleKey"].ConvertToSdkAttribute();
27+
Console.WriteLine($"Converted AttributeValue: {sdkAttributeValue.S}");
28+
}
29+
}
30+
}
31+
```
32+
33+
34+
### Converting StreamRecord
35+
36+
The following example demonstrates how to convert a `DynamoDBEvent.StreamRecord` to an `Amazon.DynamoDBv2.Model.StreamRecord`:
37+
38+
```csharp
39+
40+
public class Function
41+
{
42+
public void Handler(DynamoDBEvent ddbEvent)
43+
{
44+
foreach (var record in ddbEvent.Records)
45+
{
46+
var sdkStreamRecord = record.Dynamodb.ConvertToSdkStreamRecord();
47+
Console.WriteLine($"Converted StreamRecord: {sdkStreamRecord.SequenceNumber}");
48+
}
49+
}
50+
}
51+
```
52+
53+
### Converting Identity
54+
55+
The following example demonstrates how to convert a `DynamoDBEvent.Identity` to an `Amazon.DynamoDBv2.Model.Identity`:
56+
57+
```csharp
58+
public class Function
59+
{
60+
public void Handler(DynamoDBEvent ddbEvent)
61+
{
62+
foreach (var record in ddbEvent.Records)
63+
{
64+
var sdkIdentity = record.UserIdentity.ConvertToSdkIdentity();
65+
Console.WriteLine($"Converted Identity: {sdkIdentity.PrincipalId}");
66+
}
67+
}
68+
}
69+
```
70+
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net8.0</TargetFramework>
5+
<ImplicitUsings>enable</ImplicitUsings>
6+
<Nullable>enable</Nullable>
7+
8+
<IsPackable>false</IsPackable>
9+
<IsTestProject>true</IsTestProject>
10+
</PropertyGroup>
11+
12+
<ItemGroup>
13+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
14+
<PackageReference Include="xunit" Version="2.5.3" />
15+
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.3" />
16+
</ItemGroup>
17+
18+
<ItemGroup>
19+
<ProjectReference Include="..\..\src\Amazon.Lambda.DynamoDBEvents.SDK.Convertor\Amazon.Lambda.DynamoDBEvents.SDK.Convertor.csproj" />
20+
</ItemGroup>
21+
22+
<ItemGroup>
23+
<Using Include="Xunit" />
24+
</ItemGroup>
25+
26+
</Project>

0 commit comments

Comments
 (0)