以前、AWS CDK で Application Load Balancer (ALB) の作成時にアクセスログを Amazon S3 バケットに出力する設定で躓いたので、設定方法を備忘として執筆します。
モジュールはこちらを利用しています。
aws-cdk-lib.aws_elasticloadbalancingv2 module · AWS CDK
やってみよう
スタックファイルにてALB の作成を定義した後に、以下のように logAccessLogs メソッドを使用して ALB のアクセスログを有効化できます。
第一引数に S3 バケットオブジェクト、第二引数にログを保存する S3 バケット内のプレフィックス(フォルダパス)を指定します。
ALBのアクセスログ配信はAWS管理のELBログ配信アカウントから配信されるので、S3バケットには適切なバケットポリシーを事前に付与してください。
設定は以下のリンクを参照してください。
Application Load Balancer のアクセスログを有効にする – エラスティックロードバランシング
// ALBの作成 const alb = new elasticloadbalancingv2.ApplicationLoadBalancer(this, 'ALB', { vpc: tokyoVpc, // ALBを配置するVPCを指定 internetFacing: true, // インターネット向けALBとして設定 securityGroup: albSg, // ALB用のセキュリティグループを指定 vpcSubnets: { subnets: vpcPublicSubnets }, // ALBをパブリックサブネットに配置 loadBalancerName: 'tokyo-alb', // ALBの名前を指定 }); // アクセスログをS3バケットに保存する設定 alb.logAccessLogs(albAccessLogsBucket, 'alb-accesslogs');
bin配下のappは以下のように定義してデプロイしてみます。
const app = new cdk.App(); new AlbStack(app, 'AlbStack', { });
そうすると、以下のリージョン指定が不足しているというエラーが発生してデプロイが失敗します。
ValidationError: Region is required to enable ELBv2 access logging at path [AlbStack/ALB] in aws-cdk-lib.aws_elasticloadbalancingv2.ApplicationLoadBalancer
logAccessLogsメソッドを確認していきましょう。
確認するとリージョンを明示的に指定する旨の説明文と実装方法が記載されたURLがありました。
class ApplicationLoadBalancer (construct) · AWS CDK
logAccessLogs(bucket: s3.IBucket, prefix?: string): void; /** * Enable connection logging for this load balancer. * * A region must be specified on the stack containing the load balancer; you cannot enable logging on * environment-agnostic stacks. * * @see https://docs.aws.amazon.com/cdk/latest/guide/environments.html */
解決方法
解決方法として一例ですが、appファイルにenvとしてリージョン名を明示的に指定することでデプロイが可能になります。
const app = new cdk.App(); new AlbStack(app, 'AlbStack', { env: { region: 'ap-northeast-1' } // 東京リージョンを指定する例 });
設定を追加するとデプロイが成功し、ALBにアクセスログが設定されました。
以上となります、CDKでの実装の参考になれば幸いです。