AWS CDK(TypeScript)でリソース毎にファイルを作る

AWS CDK(TypeScript)でリソース毎にファイルを作る:

$ cdk --version 
0.23.0 (build 1d705e7) 


やりたいこと

AppSyncなど、いろんなリソースを作る必要がある場合、lib/aws-cdk-stack.tsファイルが冗長になる。

リソース毎に別ファイルで管理して、見通しを良くしたい。


やったこと

こんな感じのクラスを作る。

import cdk = require('@aws-cdk/cdk'); 
import IAM = require('@aws-cdk/aws-iam') 
 
class IAMRole { 
  static create(stack: cdk.Stack, name: string) { 
    const servicePolicy = new IAM.Policy( 
      stack, 
      'AppSyncInlinePolicy', { 
        policyName: `${name}InlinePolicy`, 
        statements: [ 
          new IAM.PolicyStatement() 
            .allow() 
            .addActions( 
              "dynamodb:GetItem", 
              "dynamodb:Query", 
              "dynamodb:Scan", 
            ) 
            .addResources( 
              "arn:aws:dynamodb:us-east-1:*:table/MyTable" 
            ) 
        ] 
      } 
    ) 
 
    const serviceRole = new IAM.Role(stack, `${name}DynamoDBRole`, { 
      assumedBy: new IAM.ServicePrincipal('appsync.amazonaws.com'), 
      path: '/service-role/' 
    }) 
    serviceRole.attachInlinePolicy(servicePolicy) 
    return serviceRole 
  } 
} 
 
export default IAMRole 
元ファイルでは以下のように呼び出す。

import cdk = require('@aws-cdk/cdk'); 
import IAMRole from './iam' 
 
export class AwsCdkStack extends cdk.Stack { 
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) { 
    const serviceRole: IAM.Role = IAMRole.create(stack, id) 
  } 
} 


雑多なこと


クラスにする必要ある?

IAMRole.createって書きたかったからそうした。特に意味はなく、関数にしても良いと思う。

const createIAMRole = (stack: cdk.Stack, name: string): IAM.Role => { 
    const servicePolicy = new IAM.Policy( 
      stack, 
      'AppSyncInlinePolicy', { 
        policyName: `${name}InlinePolicy`, 
        statements: [ 
          new IAM.PolicyStatement() 
            .allow() 
            .addActions( 
              "dynamodb:GetItem", 
              "dynamodb:Query", 
              "dynamodb:Scan", 
            ) 
            .addResources( 
              "arn:aws:dynamodb:us-east-1:*:table/MyTable" 
            ) 
        ] 
      } 
    ) 
 
    const serviceRole = new IAM.Role(stack, `${name}DynamoDBRole`, { 
      assumedBy: new IAM.ServicePrincipal('appsync.amazonaws.com'), 
      path: '/service-role/' 
    }) 
    serviceRole.attachInlinePolicy(servicePolicy) 
    return serviceRole 
  } 
このあたりは好みでしょう。

コメント

このブログの人気の投稿

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2020-12-01 09:41:49 RSSフィード2020-12-01 09:00 分まとめ(69件)