echo("備忘録");

IT技術やプログラミング関連など、技術系の事を備忘録的にまとめています。

【AWS CDK】Lambda定義でCloudFormationリソース数を削減するTips

今回のお題

タイトル通り、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拡張機能を扱ってみた感想」という内容でお話しさせて頂きます。

vscode.connpass.com

それでは、今回はこの辺で。