1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

AWS CDKで「Error: ARNs must have at least 6 components: undefined」になる時の解決策

Last updated at Posted at 2020-12-24

エラー

AWS CDKで以下のようなエラーが出る事があります。

Error: ARNs must have at least 6 components: undefined

意味としては、lambdaVersionArnundefinedで、少なくとも6つのブロックをもつARNの形式が必要だと言っています。

発生個所

ここではARNでバージョン指定のLambdaを取得しています。

sample-stack.ts
const lambdaVersionArn = props.lambdaVersionArn;
const lambdaVersion = lambda.Version.fromVersionArn(this, 'LambdaFunc', lambdaVersionArn);

ARNを外部から受け取っているStackで、Bootstrapや該当Stackではない処理を実行する時に、lambdaVersionArnを指定しないのでundefinedになってしまいます。

対応方法

lambdaVersionArnの値は実際には実行時にしか使われないのでダミーを指定する事で回避ができます。

arn:aws:lambda:dummyAccount:function:dummyFunc:dummyVersion

ARNのフォーマットでダミーの値を作成します。

指定方法1:引数

cdk bootstrap -c lambda-version-arn=arn:aws:lambda:dummyAccount:function:dummyFunc:dummyVersion

-cをつけて指定する方法は簡単ですが、bootstrapに関係ない引数が必要になるので、避けたい所です。

指定方法2:Stack内

sample-stack.ts
const lambdaVersionArn = props.lambdaVersionArn ?? 'arn:aws:lambda:dummyAccount:function:dummyFunc:dummyVersion';
const lambdaVersion = lambda.Version.fromVersionArn(this, 'LambdaFunc', lambdaVersionArn);

分かりやすくはありますが、環境要因をStack内に書きたくないですね。

指定方法3:Stack呼び出し

sample.ts
const lambdaVersionArn = app.node.tryGetContext('lambda-version-arn') ?? 'arn:aws:lambda:dummyAccount:function:dummyFunc:dummyVersion';
new SampleStack(app, `sample-stack`, {
    lambdaVersionArn : lambdaVersionArn,
});

引数を取る部分と近くなり、環境要因が纏まって、スッキリしました。

余談

CDKは非常に便利ですが、結構癖があるので、対応方法を考える時に悩む事が多い気がします。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?