2017-05-22 15 views
1

lambda(@edge)を呼び出すCloudFrontディストリビューションを作成したいとします。私はAWSコンソールを使ってそれを行うことができました。私は今、Terraformを使って同じことを達成しようとしています。私の構成は以下の通りです。Terraform経由でCloudFrontディストリビューションを作成するときにInvalidLambdaFunctionAssociation

まず、ラムダの役割を作成しました。

resource "aws_iam_role" "my_edge_lambda_iam_role" { 
    name = "my_edge_lambda_iam_role" 

    assume_role_policy = <<EOF 
{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Action": "sts:AssumeRole", 
     "Principal": { 
     "Service": "lambda.amazonaws.com" 
     }, 
     "Effect": "Allow", 
     "Sid": "" 
    } 
    ] 
} 
EOF 
} 

次に、ラムダを作成しました。

resource "aws_lambda_function" "redirect_lambda" { 
    filename   = "myscript.js.zip" 
    function_name = "my_js_script" 
    role    = "arn:aws:iam::123456789:role/my_edge_lambda_iam_role" 
    handler   = "index.handler" 
    runtime   = "nodejs4.3-edge" 
} 

最後に、私は(しようと)上記ラムダ関数のARNを使用CloudFrontの分布を作成しました。定義は以下の通りです。

resource "aws_cloudfront_distribution" "s3_distribution" { 
    origin { 
    domain_name = "my-bucket.s3.amazonaws.com" 
    origin_id = "<my S3 path>" 
    } 

    enabled    = true 
    is_ipv6_enabled  = true 

    default_cache_behavior { 
    allowed_methods = ["GET", "HEAD"] 
    cached_methods = ["GET", "HEAD"] 
    target_origin_id = "<my target origin>" 

    forwarded_values { 
     query_string = false 

     cookies { 
     forward = "none" 
     } 
    } 

    lambda_function_association { 
     event_type = "viewer-request" 
     lambda_arn = "<arn of the lambda function denerated above>" 
    } 

    viewer_protocol_policy = "allow-all" 
    min_ttl    = 0 
    default_ttl   = 86400 
    max_ttl    = 31536000 
    } 

    price_class = "PriceClass_All" 

    viewer_certificate { 
    cloudfront_default_certificate = true 
} 

    restrictions { 
    geo_restriction { 
     restriction_type = "none" 
    } 
    } 
} 

配布を作成しようとすると、次の例外が発生します。

Error applying plan: 

1 error(s) occurred: 

* aws_cloudfront_distribution.s3_distribution: 1 error(s) occurred: 

* aws_cloudfront_distribution.s3_distribution: InvalidLambdaFunctionAssociation: Failed to retrieve the function from Lambda. ErrorCode: AccessDeniedException Function: arn:aws:lambda:us-east-2:12345678:function:my_js_script 
    status code: 400, request id: 65579sd33-3f2d5-181e7-9140-79c1ff79fbdd 

私はどのように役割を定義したのであろうか?

+2

それは、これがテラフォームでどのように動作するかは明らかではないのですが、それにそこに表示されます"edgelambda"が関数をフェッチすることが許されていることを "lambda"に伝える必要があります...関数自体(役割ではない)に対するアクセス権です(おそらく)... http://docs.aws .amazon.com/lambda/latest/dg/lambda-edge.html#lambda-edge-permissions –

+0

@ Michael-sqlbot:ラムダに権限を追加する方法の例はありますか? – Nik

答えて

3

commentsに記載されているMichaelには、aws_lambda_permissionリソースを追加して、AWSサービスがラムダ機能を呼び出せるようにする必要があります。

resource "aws_lambda_permission" "allow_cloudfront" { 
    statement_id = "AllowExecutionFromCloudFront" 
    action   = "lambda:GetFunction" 
    function_name = "${aws_lambda_function.redirect_lambda.function_name}" 
    principal  = "edgelambda.amazonaws.com" 
} 

AWS docs、この場合にはCLIを使用して、テラフォームのこの外側を許可する方法について少しより多くの情報を持っている:

aws lambda add-permission \    
--function-name arn \ 
--statement-id statement-id \ 
--action lambda:GetFunction \ 
--principal edgelambda.amazonaws.com 
関連する問題