概要
AWS Cloud Development Kit (以下、CDK) は、どの言語を使用していますか。私はTypeScriptを使用しています。TypeScriptを使用していると型のチェックをしてくれるので色々便利ですが、undefinedを考慮する必要があるので困ることがあります。
そういったときに強制的にエラーを発生させる方法について調べました。
困ったこと
別のスタックあるいは手動作成したDynamoDBテーブルに対してDynamoDB Streams => Lambdaといったアーキテクチャを持つスタックを新規で作成したいとします。
DynamoDBテーブルの情報を取得するためにTable.fromTableAttributes()
を使用することでtableStreamArn
へアクセスすることができます。
// 作成されているTable情報を取得
const dynamoDBTable:ITable = Table.fromTableAttributes(this, "hogehoge", {
tableName: "hogehoge_table"
});
// IAMポリシーの作成
new Iam.PolicyStatement({
actions: dynamoActions, // 事前に必要なアクションを定義しています。
resources: [dynamoDB.tableStreamArn]
});
tableStreamArn
はStreamが有効でない場合undefined
が返ってくるのでもしDynamoDBのStreamsが有効でない場合はポリシー作成がおかしなことになりますし、resources
はstringのみ許容しているため型チェックでエラーになってしまいます。
そもそもこの場合はundefined
で返ってきた場合はデプロイするべきではないですし、Streamsを有効化するのを促す必要があります。
どうやって解決したか
throw new Error()
を使いました。次のようにすることでundefined
が来た時にはメッセージと共にエラーが発生します。
// 作成されているTable情報を取得
const dynamoDBTable:ITable = Table.fromTableAttributes(this, "hogehoge", {
tableName: "hogehoge_table"
});
// Stream情報が取得できるか確認。undefinedの場合はエラーを発生させる。
if (!dynamoDB.tableStreamArn) {
throw new Error(
"I cannot get an ARN for DynamoDB Streams. Please activate DynamoDB Streams from the console for manual creation or from the CDK for CDK creation."
);
} else {
// undefinedのケースは除外されるため型制約に引っ掛からずに処理できる。
new Iam.PolicyStatement({
actions: dynamoActions,
resources: [dynamoDB.tableStreamArn]
});
}
/Users/hoge/Document/.../s3_stack.ts:68
throw new Error(
^
Error: I cannot get an ARN for DynamoDB Streams. Please activate DynamoDB Streams from the console for manual creation or from the CDK for CDK creation.
at new S3Stack
....
また、Annotationsを使うとinfoやwarning, errorを見やすく出力できます。
if (!dynamoDB.tableStreamArn) {
Annotations.of(dynamoDB).addError(
"I cannot get an ARN for DynamoDB Streams. Please activate DynamoDB Streams from the console for manual creation or from the CDK for CDK creation."
);
} else {
new Iam.PolicyStatement({
actions: dynamoActions,
resources: [dynamoDB.tableStreamArn]
});
}
CDKでログを出すこと自体あまりないので正直使うことはないですが、逆にユーザが設定したエラーだとわかるのでそう言う意味ではこちらを採用する価値があるかもしれません。
[Error at /S3Stack/StreamArnFromTableName] I cannot get an ARN for DynamoDB Streams. Please activate DynamoDB Streams from the console for manual creation or from the CDK for CDK creation.
参考