+++
title = "Exposing our hit counter table"
weight = 400
+++
## Add a table property to our hit counter
Edit `hitcounter.go` and modify it so that `table` is exposed as a public property.
{{}}
package hitcounter
import (
"github.com/aws/aws-cdk-go/awscdk/v2/awsdynamodb"
"github.com/aws/aws-cdk-go/awscdk/v2/awslambda"
"github.com/aws/constructs-go/constructs/v10"
"github.com/aws/jsii-runtime-go"
)
type HitCounterProps struct {
Downstream awslambda.IFunction
}
type hitCounter struct {
constructs.Construct
handler awslambda.IFunction
table awsdynamodb.Table
}
type HitCounter interface {
constructs.Construct
Handler() awslambda.IFunction
Table() awsdynamodb.Table
}
func NewHitCounter(scope constructs.Construct, id string, props *HitCounterProps) HitCounter {
this := constructs.NewConstruct(scope, &id)
table := awsdynamodb.NewTable(this, jsii.String("Hits"), &awsdynamodb.TableProps{
PartitionKey: &awsdynamodb.Attribute{Name: jsii.String("path"), Type: awsdynamodb.AttributeType_STRING},
})
handler := awslambda.NewFunction(this, jsii.String("HitCounterHandler"), &awslambda.FunctionProps{
Runtime: awslambda.Runtime_NODEJS_16_X(),
Handler: jsii.String("hitcounter.handler"),
Code: awslambda.Code_FromAsset(jsii.String("lambda"), nil),
Environment: &map[string]*string{
"DOWNSTREAM_FUNCTION_NAME": props.Downstream.FunctionName(),
"HITS_TABLE_NAME": table.TableName(),
},
})
table.GrantReadWriteData(handler)
props.Downstream.GrantInvoke(handler)
return &hitCounter{this, handler, table}
}
func (h *hitCounter) Handler() awslambda.IFunction {
return h.handler
}
func (h *hitCounter) Table() awsdynamodb.Table {
return h.table
}
{{}}
## Now we can access the table from our stack
Go back to `cdk-workshop.go` and assign the `Table` property of the table viewer:
{{}}
package main
import (
"github.com/aws/aws-cdk-go/awscdk/v2"
"github.com/aws/aws-cdk-go/awscdk/v2/awslambda"
"github.com/aws/aws-cdk-go/awscdk/v2/awsapigateway"
"github.com/aws/constructs-go/constructs/v10"
"github.com/aws/jsii-runtime-go"
"cdk-workshop/hitcounter"
"github.com/cdklabs/cdk-dynamo-table-viewer-go/dynamotableviewer"
)
type CdkWorkshopStackProps struct {
awscdk.StackProps
}
func NewCdkWorkshopStack(scope constructs.Construct, id string, props *CdkWorkshopStackProps) awscdk.Stack {
var sprops awscdk.StackProps
if props != nil {
sprops = props.StackProps
}
stack := awscdk.NewStack(scope, &id, &sprops)
helloHandler := awslambda.NewFunction(stack, jsii.String("HelloHandler"), &awslambda.FunctionProps{
Code: awslambda.Code_FromAsset(jsii.String("lambda"), nil),
Runtime: awslambda.Runtime_NODEJS_16_X(),
Handler: jsii.String("hello.handler"),
})
hitcounter := hitcounter.NewHitCounter(stack, "HelloHitCounter", &hitcounter.HitCounterProps{
Downstream: helloHandler,
})
awsapigateway.NewLambdaRestApi(stack, jsii.String("Endpoint"), &awsapigateway.LambdaRestApiProps{
Handler: hitcounter.Handler(),
})
dynamotableviewer.NewTableViewer(stack, jsii.String("ViewHitCounter"), &dynamotableviewer.TableViewerProps{
Title: jsii.String("Hello Hits"),
Table: hitcounter.Table()
})
return stack
}
func main() {
defer jsii.Close()
app := awscdk.NewApp(nil)
NewCdkWorkshopStack(app, "CdkWorkshopStack", &CdkWorkshopStackProps{})
app.Synth(nil)
}
{{}}