VPC LambdaのVPCフローログを記録しようとしてつまづいたこと

2023.12.20

はじめに

VPC Lambdaを作成して、そのVPCフローログをCloudWatch Logsに記録したいという場面がありました。そこで少しつまづいたので備忘録として記事に残しておきます。

やりたいこと

  • VPCにLambda関数を配置する
  • Lambda関数でインターネットアクセスを行う
  • VPCフローログとして記録し、CloudWatch Logsに送信する

つまづいたこと

VPCフローログを作成しても「アクセスエラー」となる

VPCフローログを作成すると、作成直後は画像のようにステータス「アクティブ」と表示されます。

しかし、他の設定を行っていたら、いつの間にかステータスが「アクセスエラー」となっていました。

公式ドキュメントによると、アクセスエラーが発生するときはIAMロールに問題があるようです。

Access error: このエラーは、次のいずれかの原因で発生することがあります。

  • フローログの IAM ロールに、CloudWatch Logs ロググループにフローログレコードを発行するための十分なアクセス許可がありません。
  • IAM ロールにフローログサービスとの信頼関係がない
  • 信頼関係によりフローログサービスがプリンシパルとして指定されていない

VPC フローログのトラブルシューティング - Amazon Virtual Private Cloud

IAMロール画面で「許可」と「信頼関係」をチェックします。

それぞれ、以下のポリシーが含まれているかを確認します。

  • 許可
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents",
        "logs:DescribeLogGroups",
        "logs:DescribeLogStreams"
      ],
      "Resource": "*"
    }
  ]
}
  • 信頼関係
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "vpc-flow-logs.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

CloudWatch Logs へのフローログの発行 - Amazon Virtual Private Cloud

許可ポリシーは正しく設定されていることを確認していましたが、信頼関係ポリシーのプリンシパルが誤っていたことがアクセスエラーの原因でした。

Lambdaからインターネットにアクセスできない

Lambda関数にはインターネットアクセスのテストとしてこのようなコードを書いていましたが、インターネットに接続できずタイムアウトエラーになってしまいました。

import https from 'https';

export const handler = (event, context) => {
    const options = {
      hostname: 'aws.amazon.com',
      port: 443,
      path: '/',
      method: 'GET',
    };
    
    console.log(options)

    const req = https.request(options, (res) => {
      
      let data = '';
      res.on('data', (chunk) => {
        data += chunk;
      });

      res.on('end', () => {
        console.log('Response:', data);
      });
    });

    req.end()
};

原因はLambda関数をパブリックサブネットに配置していたことでした。

こちらの記事にある通り、VPC Lambdaでインターネットアクセスさせるにはプライベートサブネットに配置する必要があります。

VPC Lambdaをパブリックサブネットで構成してもパブリックIPが付与されずインターネットアクセスできない | DevelopersIO

Lambdaをプライベートサブネットに配置したところ、正常終了するようになりました。

パブリックサブネットからプライベートサブネットに配置し直すには、「設定」⇒「VPC」⇒「編集」から設定します。このときセキュリティグループも必要があれば変更します。

VPCフローログの確認

Lambda関数を実行して、VPCフローログを確認します。

ロググループの中には2つのログストリームが作成されていました。

これらはそれぞれNATゲートウェイとLambdaのENIです。

フローログもちゃんと記録されていました。

  • NATゲートウェイ

  • Lambda

おわりに

VPC LambdaとVPCフローログの設定を行っていて少しつまづいたので記事にしてみました。特にIAMロールは自分では正しく設定できていたと思い込んでいたので、公式ドキュメントを参照しながら改めて一つ一つチェックすることは大事だと思いました。