+++
title = "HitCounter テーブルを公開"
weight = 400
+++
## HitCounter にテーブルのプロパティを追加
`src/CdkWorkshop/HitCounter.cs` を編集し、`table` が `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);
}
}
}
{{}}
## これでスタックからテーブルにアクセスできるようになりました
`CdkWorkshopStack.cs` に戻り、 `Table` プロパティを指定します。
{{}}
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
});
}
}
}
{{}}
コードの変更が完了したので、このファイルを保存し、`Ctrl-C` で `npm run watch` を終了します。