+++
title = "Exposing our hit counter table"
weight = 400
+++
## Add a table property to our hit counter
Edit `src/CdkWorkshop/HitCounter.cs` and modify it so that `table` is exposed as a public property called `MyTable`.
{{}}
using Amazon.CDK;
using Amazon.CDK.AWS.DynamoDB;
using Amazon.CDK.AWS.Lambda;
using Constructs;
using System.Collections.Generic;
namespace CdkWorkshop
{
public class HitCounterProps
{
// The function for which we want to count url hits
public IFunction Downstream { get; set; }
}
public class HitCounter : Construct
{
public readonly Function Handler;
public readonly Table MyTable;
public HitCounter(Construct scope, string id, HitCounterProps props) : base(scope, id)
{
var table = new Table(this, "Hits", new TableProps
{
PartitionKey = new Attribute
{
Name = "path",
Type = AttributeType.STRING
}
});
MyTable = table;
Handler = new Function(this, "HitCounterHandler", new FunctionProps
{
Runtime = Runtime.NODEJS_14_X,
Handler = "hitcounter.handler",
Code = Code.FromAsset("lambda"),
Environment = new Dictionary
{
["DOWNSTREAM_FUNCTION_NAME"] = props.Downstream.FunctionName,
["HITS_TABLE_NAME"] = table.TableName
}
});
// Grant the lambda role read/write permissions to our table
table.GrantReadWriteData(Handler);
// Grant the lambda role invoke permissions to the downstream function
props.Downstream.GrantInvoke(Handler);
}
}
}
{{}}
## Now we can access the table from our stack
Go back to `CdkWorkshopStack.cs` and assign the `Table` property of the table viewer:
{{}}
using Amazon.CDK;
using Amazon.CDK.AWS.APIGateway;
using Amazon.CDK.AWS.Lambda;
using Cdklabs.DynamoTableViewer;
using Constructs;
namespace CdkWorkshop
{
public class CdkWorkshopStack : Stack
{
public CdkWorkshopStack(Construct scope, string id) : base(scope, id)
{
// Defines a new lambda resource
var hello = new Function(this, "HelloHandler", new FunctionProps
{
Runtime = Runtime.NODEJS_14_X, // execution environment
Code = Code.FromAsset("lambda"), // Code loaded from the "lambda" directory
Handler = "hello.handler" // file is "hello", function is "handler"
});
// Defines out HitCounter resource
var helloWithCounter = new HitCounter(this, "HelloHitCounter", new HitCounterProps
{
Downstream = hello
});
// Defines an API Gateway REST API resource backed by our "hello" function.
new LambdaRestApi(this, "Endpoint", new LambdaRestApiProps
{
Handler = helloWithCounter.Handler
});
// Defines a new TableViewer resource
new TableViewer(this, "ViewerHitCount", new TableViewerProps
{
Title = "Hello Hits",
Table = helloWithCounter.MyTable
});
}
}
}
{{}}
We're finished making code changes, congratulations!
You can now save and exit out of your code editor if you want.