以前、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での実装の参考になれば幸いです。

