今回のお題
タイトル通り、AWS CDKでLambda定義を書く際にちょっとした工夫でCloudFormationリソース数を削減する方法を紹介します。
普段はそこまで神経質になる必要はありませんが、業務などで多数のリソースをAWS CDKで管理している場合に役に立つかもしれません。
なお今回触れるのは、Lambdaのロール&ポリシー関連の書き方です。
TL;DR
- ロールは事前に定義したものをアタッチする
- ポリシーはinitialPolicyではなく、上記ロールにaddToPrincipalPolicyでアタッチする
- ロールやポリシーを重複して定義しない
- ただし、普段はそこまで神経質になる必要はない
リソースが多くなる書き方
無意識にLambda関数を定義すると、こんな書き方をするかもしれません。
// デフォルトポリシーの定義 const initialPolicy = new iam.PolicyStatement({ ...(なんか定義) }); // Lambdaの定義 // roleを設定せず、initialPolicyでデフォルトポリシーを埋め込む const nodejsLambda = new NodejsFunction(this, 'HogeFunction', { entry: path.resolve(__dirname, '../../lambda', 'index.ts'), handler: 'handler', functionName: 'HogeFunction', initialPolicy: [initialPolicy], });
ただしこの書き方でデプロイすると、各Lambdaに対してロール&ポリシーが一つずつ作成されてしまいます。
つまりLambda関数の総数 * 2のリソースが追加で作成されることになります。
例えばLambdaを10個作成したら、20個のリソースが追加で作成されます。
各LambdaでRoleやPolicyが違う場合は別ですが、共通で問題ない場合、これだと無駄にリソース数を消費してしまいます。
リソースが少なくなる書き方
そこでどういう書き方をするかというと「事前作成したRoleをLambda関数にアタッチする(Roleを自動生成させない)」というもので、具体的には下記になります。
ちなみにRoleの内容は、自動生成されるRoleと全く同じ内容です。(AWSLambdaBasicExecutionRole
のみが割り当てられている)
またAWS管理ポリシーをfromAwsManagedPolicyName
する場合、service-role
などのプレフィックスも引数に含めないとエラーになるので、そこは注意です。
// デフォルトポリシーの定義(これは変更なし) const initialPolicy = new iam.PolicyStatement({ ...(なんか定義) }); // Lambdaに割り当てるロールの定義 const role = new Role(this, 'LambdaRole', { assumedBy: new ServicePrincipal('lambda.amazonaws.com'), managedPolicies: [ ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicExecutionRole'), ] }); // 上記ロールにデフォルトポリシーをアタッチする role.addToPrincipalPolicy(initialPolicy); // Lambdaの定義 // initialPolicyは設定せず、代わりにroleに事前作成したロールを割り当てる const nodejsLambda = new NodejsFunction(this, 'HogeFunction', { entry: path.resolve(__dirname, '../../lambda', 'index.ts'), handler: 'handler', functionName: 'HogeFunction', role, });
この定義でデプロイすると、どれだけLambda関数を作成しても、作成されるロール&ポリシーはそれぞれ1つのみです。
つまり「(Lambda関数の総数 - 1) * 2」個のリソースが削減できるので、Lambda関数の数が多くなるほど、削減効果が大きくなります。
先程の「Lambdaを10個作成」で言うと、18個のリソースが削減できることになり、結構馬鹿になりません。
まとめ
以上、Lambda定義でCloudFormationリソース数を削減する小ネタでした。
最初に記載した通り、普段はそこまで神経質になる必要はありませんが、多数のリソースをAWS CDKで管理している場合、リソース削減に役に立つかもしれません。
なお今回はLambdaで説明しましたが、もちろんLambda以外のリソースでも有用ですし、「ロールやポリシーを重複して定義しない」ことがリソース削減の第一歩になるかと思います。(その他、設計を見直す...とか)
告知
明日 2023/11/28(火) 19時~開催の「VS Code Meetup #26 - with Postman! @LODGE」にて、LTをさせて頂くことになりました。
今回はPostmanフィーチャー回ということで、「Rest Clientユーザーの自分がPostman の VS Code拡張機能を扱ってみた感想」という内容でお話しさせて頂きます。
それでは、今回はこの辺で。