2016-07-16 4 views
12

クラウドウォッチログをログ分析サービスに送る必要があります。Terraform:クラウドウォッチログのサブスクリプション配信をラムダに設定しますか?

私はこれらの記事herehereと一緒に従ってきました。

私はこのすべてをTerraform(役割/ポリシー、セキュリティグループ、クラウドウォッチロググループ、ラムダ、およびロググループからのラムダのトリガー)で自動化しようとしています。

しかし、TFを使ってAWSを設定して、クラウドウォッチログからラムダをトリガする方法を理解できません。

私は(ラムダWebコンソールのUIで)次のようにして手で2つのTFのリソースをリンクすることができます。

  • クリックは、「トリガーを追加」ラムダ関数の「トリガー」セクションに入ります
  • フィルタ名
  • を入力し、私はラムダ
  • をトリガーするログ・グループを選択し、トリガータイプ
  • のリストから「CloudWatchのログ」を選択
  • 「トリガーを有効にする」ことを確認してください
  • (すべてのログ・ストリーム上のトリガを意味している)空のフィルタパターンを残すことはそれが終わっています一度送信ボタン

をクリックし

  • 選択され、ラムダはCloudWatchのログに現れますサブスクリプション列のコンソール - "Lambda(cloudwatch-sumologic-lambda)"と表示されます。

    私は、次のTFのリソースとサブスクリプションを作成しようとしました:

    resource "aws_cloudwatch_log_subscription_filter" "cloudwatch-sumologic-lambda-subscription" { 
        name = "cloudwatch-sumologic-lambda-subscription" 
        role_arn = "${aws_iam_role.jordi-waf-cloudwatch-lambda-role.arn}" 
        log_group_name = "${aws_cloudwatch_log_group.jordi-waf-int-app-loggroup.name}" 
        filter_pattern = "logtype test" 
        destination_arn = "${aws_lambda_function.cloudwatch-sumologic-lambda.arn}" 
    } 
    

    しかし、それはで失敗します。

    * aws_cloudwatch_log_subscription_filter.cloudwatch-sumologic-lambda-subscription: InvalidParameterException: destinationArn for vendor lambda cannot be used with roleArn 
    

    私はスケジュールされたイベントのために同じようなことの設定についてthis answerを見つけましたが、それは私が上で説明したコンソールアクション(コンソールUIメソッドは私が見ることができるイベント/ルールを作成しない)と同じではないようです。

    私が間違っていることを誰かに教えてもらえますか?

  • +0

    それは正確に確認するのは難しいが、AWSはそれを言っているように見えますPutSubscriptionFilterに与えた役割はラムダにアクセスできません。 'aws_iam_role.jordi-waf-cloudwatch-lambda-role.arn'リソースの定義を投稿できますか? – ydaetskcoR

    答えて

    18

    "aws_cloudwatch_log_subscription_filter"リソースが正しく定義されていませんでした。この状況では "role_arn"引数を指定しないでください。

    また、aws_lambda_permissionリソースを追加する必要があります(フィルタに「depends_on」関係が定義されているか、TFが間違った順序でそれを行う可能性があります)。 AWSラムダコンソールUIは、目に見えないあなたのためのラムダ許可を追加しますので、あなたは、コンソールUIにする前に、同じアクションを行っているために起こる場合は、「aws_cloudwatch_log_subscription_filterは」許可リソースなしで動作することを注意していること

    注意。

    必要なTFの設定は、この(最後の2つのリソースが実際cloudwatch->ラムダトリガーを設定するための関連するものです)のようになります。

    // intended for application logs (access logs, modsec, etc.) 
    resource "aws_cloudwatch_log_group" "test-app-loggroup" { 
        name = "test-app" 
        retention_in_days = 90 
    } 
    
    
    resource "aws_security_group" "cloudwatch-sumologic-lambda-sg" { 
        name = "cloudwatch-sumologic-lambda-sg" 
        tags { 
        Name = "cloudwatch-sumologic-lambda-sg" 
        } 
        description = "Security group for lambda to move logs from CWL to SumoLogic" 
        vpc_id = "${aws_vpc.dev-vpc.id}" 
    } 
    
    resource "aws_security_group_rule" "https-egress-cloudwatch-sumologic-to-internet" { 
        type = "egress" 
        from_port = 443 
        to_port = 443 
        protocol = "tcp" 
        security_group_id = "${aws_security_group.cloudwatch-sumologic-lambda-sg.id}" 
        cidr_blocks = ["0.0.0.0/0"] 
    } 
    
    resource "aws_iam_role" "test-cloudwatch-lambda-role" { 
        name = "test-cloudwatch-lambda-role" 
        assume_role_policy = <<EOF 
    { 
        "Version": "2012-10-17", 
        "Statement": [ 
        { 
         "Action": "sts:AssumeRole", 
         "Principal": { 
         "Service": "lambda.amazonaws.com" 
         }, 
         "Effect": "Allow" 
        } 
        ] 
    } 
    EOF 
    } 
    
    resource "aws_iam_role_policy" "test-cloudwatch-lambda-policy" { 
        name = "test-cloudwatch-lambda-policy" 
        role = "${aws_iam_role.test-cloudwatch-lambda-role.id}" 
        policy = <<EOF 
    { 
        "Version": "2012-10-17", 
        "Statement": [ 
        { 
         "Sid": "CopiedFromTemplateAWSLambdaVPCAccessExecutionRole1", 
         "Effect": "Allow", 
         "Action": [ 
         "ec2:CreateNetworkInterface" 
         ], 
         "Resource": "*" 
        }, 
        { 
         "Sid": "CopiedFromTemplateAWSLambdaVPCAccessExecutionRole2", 
         "Effect": "Allow", 
         "Action": [ 
         "ec2:DescribeNetworkInterfaces", 
         "ec2:DeleteNetworkInterface" 
         ], 
         "Resource": "arn:aws:ec2:ap-southeast-2:${var.dev_vpc_account_id}:network-interface/*" 
        }, 
    
        { 
         "Sid": "CopiedFromTemplateAWSLambdaBasicExecutionRole1", 
         "Effect": "Allow", 
         "Action": "logs:CreateLogGroup", 
         "Resource": "arn:aws:logs:ap-southeast-2:${var.dev_vpc_account_id}:*" 
        }, 
        { 
         "Sid": "CopiedFromTemplateAWSLambdaBasicExecutionRole2", 
         "Effect": "Allow", 
         "Action": [ 
         "logs:CreateLogStream", 
         "logs:PutLogEvents" 
         ], 
         "Resource": [ 
        "arn:aws:logs:ap-southeast-2:${var.dev_vpc_account_id}:log-group:/aws/lambda/*" 
         ] 
        }, 
    
        { 
         "Sid": "CopiedFromTemplateAWSLambdaAMIExecutionRole", 
         "Effect": "Allow", 
         "Action": [ 
         "ec2:DescribeImages" 
         ], 
         "Resource": "*" 
        } 
    
    
        ] 
    } 
    EOF 
    } 
    
    resource "aws_lambda_function" "cloudwatch-sumologic-lambda" { 
        function_name = "cloudwatch-sumologic-lambda" 
        filename = "${var.lambda_dir}/cloudwatchSumologicLambda.zip" 
        source_code_hash = "${base64sha256(file("${var.lambda_dir}/cloudwatchSumologicLambda.zip"))}" 
        handler = "cloudwatchSumologic.handler" 
    
        role = "${aws_iam_role.test-cloudwatch-lambda-role.arn}" 
        memory_size = "128" 
        runtime = "nodejs4.3" 
        // set low because I'm concerned about cost-blowout in the case of mis-configuration 
        timeout = "15" 
        vpc_config = { 
        subnet_ids = ["${aws_subnet.dev-private-subnet.id}"] 
        security_group_ids = ["${aws_security_group.cloudwatch-sumologic-lambda-sg.id}"] 
        } 
    } 
    
    resource "aws_lambda_permission" "test-app-allow-cloudwatch" { 
        statement_id = "test-app-allow-cloudwatch" 
        action = "lambda:InvokeFunction" 
        function_name = "${aws_lambda_function.cloudwatch-sumologic-lambda.arn}" 
        principal = "logs.ap-southeast-2.amazonaws.com" 
        source_arn = "${aws_cloudwatch_log_group.test-app-loggroup.arn}" 
    } 
    
    resource "aws_cloudwatch_log_subscription_filter" "test-app-cloudwatch-sumologic-lambda-subscription" { 
        depends_on = ["aws_lambda_permission.test-app-allow-cloudwatch"] 
        name = "cloudwatch-sumologic-lambda-subscription" 
        log_group_name = "${aws_cloudwatch_log_group.test-app-loggroup.name}" 
        filter_pattern = "" 
        destination_arn = "${aws_lambda_function.cloudwatch-sumologic-lambda.arn}" 
    } 
    
    +0

    ありがとう! –

    関連する問題