2016-08-12 5 views
0

terraform을 사용하여 API 게이트웨이 끝점을 만들려고했습니다. 무대 설치의 마지막 부분을 제외하고는 모두 작동하는 것 같습니다.Terraform이 API 게이트웨이 단계를 구현하지 않음

terraform을 적용한 후 콘솔에 들어가서 배포가 수행되지 않았 음을 알았습니다. Api 배포를 수동으로 클릭하여 작동하도록해야합니다.

다음은 api 게이트웨이의 terraform 파일입니다.

variable "region" {} 
variable "account_id" {} 

resource "aws_api_gateway_rest_api" "online_tax_test_client_report_endpoint_api" { 
    name = "online_tax_test_client_report_endpoint_api" 
    description = "The endpoint that test has to hit when new client reports are available." 
    depends_on = ["aws_lambda_function.onlinetax_test_endpoint_lambda"] 
} 

resource "aws_api_gateway_resource" "test_client_report_resource" { 
    rest_api_id = "${aws_api_gateway_rest_api.online_tax_test_client_report_endpoint_api.id}" 
    parent_id = "${aws_api_gateway_rest_api.online_tax_test_client_report_endpoint_api.root_resource_id}" 
    path_part = "test_client_report" 
} 

resource "aws_api_gateway_method" "test_client_report_method" { 
    rest_api_id = "${aws_api_gateway_rest_api.online_tax_test_client_report_endpoint_api.id}" 
    resource_id = "${aws_api_gateway_resource.test_client_report_resource.id}" 
    http_method = "POST" 
    authorization = "NONE" 
} 

resource "aws_api_gateway_integration" "test_client_report_resource_integration" { 
    rest_api_id = "${aws_api_gateway_rest_api.online_tax_test_client_report_endpoint_api.id}" 
    resource_id = "${aws_api_gateway_resource.test_client_report_resource.id}" 
    http_method = "${aws_api_gateway_method.test_client_report_method.http_method}" 
    type = "AWS" 
    integration_http_method = "${aws_api_gateway_method.test_client_report_method.http_method}" 
    uri = "arn:aws:apigateway:${var.region}:lambda:path/2015-03-31/functions/${aws_lambda_function.onlinetax_test_endpoint_lambda.arn}/invocations" 
    request_templates = { 
    "application/json" = "${file("${path.module}/generic_request_mapping_template.vm")}" 
    } 
} 

resource "aws_api_gateway_method_response" "200" { 
    rest_api_id = "${aws_api_gateway_rest_api.online_tax_test_client_report_endpoint_api.id}" 
    resource_id = "${aws_api_gateway_resource.test_client_report_resource.id}" 
    http_method = "${aws_api_gateway_method.test_client_report_method.http_method}" 
    status_code = "200" 
} 

resource "aws_api_gateway_integration_response" "test_client_report_resource_integration_default_response" { 
    rest_api_id = "${aws_api_gateway_rest_api.online_tax_test_client_report_endpoint_api.id}" 
    resource_id = "${aws_api_gateway_resource.test_client_report_resource.id}" 
    http_method = "${aws_api_gateway_method.test_client_report_method.http_method}" 
    status_code = "${aws_api_gateway_method_response.200.status_code}" 
    selection_pattern = "" 
    depends_on = ["aws_api_gateway_integration.test_client_report_resource_integration"] 
} 

resource "aws_api_gateway_method_response" "500" { 
    rest_api_id = "${aws_api_gateway_rest_api.online_tax_test_client_report_endpoint_api.id}" 
    resource_id = "${aws_api_gateway_resource.test_client_report_resource.id}" 
    http_method = "${aws_api_gateway_method.test_client_report_method.http_method}" 
    status_code = "500" 
} 

resource "aws_api_gateway_integration_response" "test_client_report_resource_integration_error_response" { 
    rest_api_id = "${aws_api_gateway_rest_api.online_tax_test_client_report_endpoint_api.id}" 
    resource_id = "${aws_api_gateway_resource.test_client_report_resource.id}" 
    http_method = "${aws_api_gateway_method.test_client_report_method.http_method}" 
    status_code = "${aws_api_gateway_method_response.500.status_code}" 
    selection_pattern = ".*?Error.*" 
    depends_on = ["aws_api_gateway_integration.test_client_report_resource_integration"] 
} 

resource "aws_lambda_permission" "allow_api_gateway" { 
    statement_id = "AllowExecutionFromAPIGateway" 
    action = "lambda:InvokeFunction" 
    function_name = "${aws_lambda_function.onlinetax_test_endpoint_lambda.arn}" 
    principal = "apigateway.amazonaws.com" 
    source_arn = "arn:aws:execute-api:${var.region}:${var.account_id}:${aws_api_gateway_rest_api.online_tax_test_client_report_endpoint_api.id}/*/${aws_api_gateway_integration.test_client_report_resource_integration.integration_http_method}${aws_api_gateway_resource.test_client_report_resource.path}" 
    depends_on = ["aws_api_gateway_rest_api.online_tax_test_client_report_endpoint_api"] 
} 

#This is the part that doesn't seem to work. 
resource "aws_api_gateway_deployment" "qa5" { 
    rest_api_id = "${aws_api_gateway_rest_api.online_tax_test_client_report_endpoint_api.id}" 
    stage_name = "qa5" 
    depends_on = ["aws_api_gateway_method.test_client_report_method"] 
} 

편집

추가 그래프에 :

digraph { 
     compound = "true" 
     newrank = "true" 
     subgraph "root" { 
      "[root] module.lambda.aws_api_gateway_deployment.qa5" [label = "aws_api_gateway_deployment.qa5", shape = "box"] 
      "[root] module.lambda.aws_api_gateway_integration.sbr_client_report_resource_integration" [label = "aws_api_gateway_integration.sbr_client_report_resource_integration", shape = "box"] 
      "[root] module.lambda.aws_api_gateway_integration_response.sbr_client_report_resource_integration_default_response" [label = "aws_api_gateway_integration_response.sbr_client_report_resource_integration_default_response", shape = "box"] 
      "[root] module.lambda.aws_api_gateway_integration_response.sbr_client_report_resource_integration_error_response" [label = "aws_api_gateway_integration_response.sbr_client_report_resource_integration_error_response", shape = "box"] 
      "[root] module.lambda.aws_api_gateway_method.sbr_client_report_method" [label = "aws_api_gateway_method.sbr_client_report_method", shape = "box"] 
      "[root] module.lambda.aws_api_gateway_method_response.200" [label = "aws_api_gateway_method_response.200", shape = "box"] 
      "[root] module.lambda.aws_api_gateway_method_response.500" [label = "aws_api_gateway_method_response.500", shape = "box"] 
      "[root] module.lambda.aws_api_gateway_resource.sbr_client_report_resource" [label = "aws_api_gateway_resource.sbr_client_report_resource", shape = "box"] 
      "[root] module.lambda.aws_api_gateway_rest_api.online_tax_sbr_client_report_endpoint_api" [label = "aws_api_gateway_rest_api.online_tax_sbr_client_report_endpoint_api", shape = "box"] 
      "[root] module.lambda.aws_iam_role.onlinetax_sbr_endpoint_role" [label = "aws_iam_role.onlinetax_sbr_endpoint_role", shape = "box"] 
      "[root] module.lambda.aws_iam_role_policy.publish_to_sns_policy" [label = "aws_iam_role_policy.publish_to_sns_policy", shape = "box"] 
      "[root] module.lambda.aws_iam_role_policy.write_to_cloudwatch_policy" [label = "aws_iam_role_policy.write_to_cloudwatch_policy", shape = "box"] 
      "[root] module.lambda.aws_lambda_function.onlinetax_sbr_endpoint_lambda" [label = "aws_lambda_function.onlinetax_sbr_endpoint_lambda", shape = "box"] 
      "[root] module.lambda.aws_lambda_permission.allow_api_gateway" [label = "aws_lambda_permission.allow_api_gateway", shape = "box"] 
      "[root] module.lambda.provider.aws" [label = "provider.aws", shape = "diamond"] 
      "[root] module.sns.aws_sns_topic.online_tax_qa5_sbr_client_report" [label = "aws_sns_topic.online_tax_qa5_sbr_client_report", shape = "box"] 
      "[root] module.sns.provider.aws" [label = "provider.aws", shape = "diamond"] 
      "[root] provider.aws (disabled)" [label = "provider.aws (disabled)", shape = "diamond"] 
      "[root] module.lambda.aws_api_gateway_deployment.qa5" -> "[root] module.lambda.aws_api_gateway_method.sbr_client_report_method" 
      "[root] module.lambda.aws_api_gateway_deployment.qa5" -> "[root] module.lambda.aws_api_gateway_rest_api.online_tax_sbr_client_report_endpoint_api" 
      "[root] module.lambda.aws_api_gateway_deployment.qa5" -> "[root] module.lambda.provider.aws" 
      "[root] module.lambda.aws_api_gateway_integration.sbr_client_report_resource_integration" -> "[root] module.lambda.aws_api_gateway_method.sbr_client_report_method" 
      "[root] module.lambda.aws_api_gateway_integration.sbr_client_report_resource_integration" -> "[root] module.lambda.aws_api_gateway_resource.sbr_client_report_resource" 
      "[root] module.lambda.aws_api_gateway_integration.sbr_client_report_resource_integration" -> "[root] module.lambda.aws_api_gateway_rest_api.online_tax_sbr_client_report_endpoint_api" 
      "[root] module.lambda.aws_api_gateway_integration.sbr_client_report_resource_integration" -> "[root] module.lambda.aws_lambda_function.onlinetax_sbr_endpoint_lambda" 
      "[root] module.lambda.aws_api_gateway_integration.sbr_client_report_resource_integration" -> "[root] module.lambda.provider.aws" 
      "[root] module.lambda.aws_api_gateway_integration_response.sbr_client_report_resource_integration_default_response" -> "[root] module.lambda.aws_api_gateway_integration.sbr_client_report_resource_integration" 
      "[root] module.lambda.aws_api_gateway_integration_response.sbr_client_report_resource_integration_default_response" -> "[root] module.lambda.aws_api_gateway_method.sbr_client_report_method" 
      "[root] module.lambda.aws_api_gateway_integration_response.sbr_client_report_resource_integration_default_response" -> "[root] module.lambda.aws_api_gateway_method_response.200" 
      "[root] module.lambda.aws_api_gateway_integration_response.sbr_client_report_resource_integration_default_response" -> "[root] module.lambda.aws_api_gateway_resource.sbr_client_report_resource" 
      "[root] module.lambda.aws_api_gateway_integration_response.sbr_client_report_resource_integration_default_response" -> "[root] module.lambda.aws_api_gateway_rest_api.online_tax_sbr_client_report_endpoint_api" 
      "[root] module.lambda.aws_api_gateway_integration_response.sbr_client_report_resource_integration_default_response" -> "[root] module.lambda.provider.aws" 
      "[root] module.lambda.aws_api_gateway_integration_response.sbr_client_report_resource_integration_error_response" -> "[root] module.lambda.aws_api_gateway_integration.sbr_client_report_resource_integration" 
      "[root] module.lambda.aws_api_gateway_integration_response.sbr_client_report_resource_integration_error_response" -> "[root] module.lambda.aws_api_gateway_method.sbr_client_report_method" 
      "[root] module.lambda.aws_api_gateway_integration_response.sbr_client_report_resource_integration_error_response" -> "[root] module.lambda.aws_api_gateway_method_response.500" 
      "[root] module.lambda.aws_api_gateway_integration_response.sbr_client_report_resource_integration_error_response" -> "[root] module.lambda.aws_api_gateway_resource.sbr_client_report_resource" 
      "[root] module.lambda.aws_api_gateway_integration_response.sbr_client_report_resource_integration_error_response" -> "[root] module.lambda.aws_api_gateway_rest_api.online_tax_sbr_client_report_endpoint_api" 
      "[root] module.lambda.aws_api_gateway_integration_response.sbr_client_report_resource_integration_error_response" -> "[root] module.lambda.provider.aws" 
      "[root] module.lambda.aws_api_gateway_method.sbr_client_report_method" -> "[root] module.lambda.aws_api_gateway_resource.sbr_client_report_resource" 
      "[root] module.lambda.aws_api_gateway_method.sbr_client_report_method" -> "[root] module.lambda.aws_api_gateway_rest_api.online_tax_sbr_client_report_endpoint_api" 
      "[root] module.lambda.aws_api_gateway_method.sbr_client_report_method" -> "[root] module.lambda.provider.aws" 
      "[root] module.lambda.aws_api_gateway_method_response.200" -> "[root] module.lambda.aws_api_gateway_method.sbr_client_report_method" 
      "[root] module.lambda.aws_api_gateway_method_response.200" -> "[root] module.lambda.aws_api_gateway_resource.sbr_client_report_resource" 
      "[root] module.lambda.aws_api_gateway_method_response.200" -> "[root] module.lambda.aws_api_gateway_rest_api.online_tax_sbr_client_report_endpoint_api" 
      "[root] module.lambda.aws_api_gateway_method_response.200" -> "[root] module.lambda.provider.aws" 
      "[root] module.lambda.aws_api_gateway_method_response.500" -> "[root] module.lambda.aws_api_gateway_method.sbr_client_report_method" 
      "[root] module.lambda.aws_api_gateway_method_response.500" -> "[root] module.lambda.aws_api_gateway_resource.sbr_client_report_resource" 
      "[root] module.lambda.aws_api_gateway_method_response.500" -> "[root] module.lambda.aws_api_gateway_rest_api.online_tax_sbr_client_report_endpoint_api" 
      "[root] module.lambda.aws_api_gateway_method_response.500" -> "[root] module.lambda.provider.aws" 
      "[root] module.lambda.aws_api_gateway_resource.sbr_client_report_resource" -> "[root] module.lambda.aws_api_gateway_rest_api.online_tax_sbr_client_report_endpoint_api" 
      "[root] module.lambda.aws_api_gateway_resource.sbr_client_report_resource" -> "[root] module.lambda.provider.aws" 
      "[root] module.lambda.aws_api_gateway_rest_api.online_tax_sbr_client_report_endpoint_api" -> "[root] module.lambda.aws_lambda_function.onlinetax_sbr_endpoint_lambda" 
      "[root] module.lambda.aws_api_gateway_rest_api.online_tax_sbr_client_report_endpoint_api" -> "[root] module.lambda.provider.aws" 
      "[root] module.lambda.aws_iam_role.onlinetax_sbr_endpoint_role" -> "[root] module.lambda.provider.aws" 
      "[root] module.lambda.aws_iam_role_policy.publish_to_sns_policy" -> "[root] module.lambda.aws_iam_role.onlinetax_sbr_endpoint_role" 
      "[root] module.lambda.aws_iam_role_policy.publish_to_sns_policy" -> "[root] module.lambda.provider.aws" 
      "[root] module.lambda.aws_iam_role_policy.publish_to_sns_policy" -> "[root] module.sns.aws_sns_topic.online_tax_qa5_sbr_client_report" 
      "[root] module.lambda.aws_iam_role_policy.write_to_cloudwatch_policy" -> "[root] module.lambda.aws_iam_role.onlinetax_sbr_endpoint_role" 
      "[root] module.lambda.aws_iam_role_policy.write_to_cloudwatch_policy" -> "[root] module.lambda.provider.aws" 
      "[root] module.lambda.aws_lambda_function.onlinetax_sbr_endpoint_lambda" -> "[root] module.lambda.aws_iam_role.onlinetax_sbr_endpoint_role" 
      "[root] module.lambda.aws_lambda_function.onlinetax_sbr_endpoint_lambda" -> "[root] module.lambda.provider.aws" 
      "[root] module.lambda.aws_lambda_permission.allow_api_gateway" -> "[root] module.lambda.aws_api_gateway_integration.sbr_client_report_resource_integration" 
      "[root] module.lambda.aws_lambda_permission.allow_api_gateway" -> "[root] module.lambda.aws_api_gateway_resource.sbr_client_report_resource" 
      "[root] module.lambda.aws_lambda_permission.allow_api_gateway" -> "[root] module.lambda.aws_api_gateway_rest_api.online_tax_sbr_client_report_endpoint_api" 
      "[root] module.lambda.aws_lambda_permission.allow_api_gateway" -> "[root] module.lambda.aws_lambda_function.onlinetax_sbr_endpoint_lambda" 
      "[root] module.lambda.aws_lambda_permission.allow_api_gateway" -> "[root] module.lambda.provider.aws" 
      "[root] module.lambda.provider.aws" -> "[root] provider.aws (disabled)" 
      "[root] module.sns.aws_sns_topic.online_tax_qa5_sbr_client_report" -> "[root] module.sns.provider.aws" 
      "[root] module.sns.provider.aws" -> "[root] provider.aws (disabled)" 
     } 
} 

그래프 내가 위의 TF 파일에서 제공하지 않은 다른 리소스가 있습니다. 문제가있는 유일한 API GW입니다. 그건 그렇고, 콘솔에서 API를 테스트 할 수 있고 그것은 잘 작동합니다. 내 localbox 또는 우편 배달부에서 실행할 수 없습니다.

내가 잘못하고있는 것에 대한 아이디어가 있습니까?

+0

첫 번째 배포의 경우 또는 변경 될 때의 향후 배포의 경우입니까? 후자에 대한 GH에 대한 공개 문제가 있습니다 : https://github.com/hashicorp/terraform/issues/6613 – ydaetskcoR

+0

심지어 첫 배포가 작동하지 않습니다. 나는 전체 스택을 파괴하고 다시 적용했다. 아직 배포가 표시되지 않습니다. terraform 계획에 적용해야하는 모든 변경 사항이 나열되면 배포 리소스가 맨 위에 나열됩니다. 그게 먼저 배포되는 것을 의미합니까? – sethu

+0

최소한 2 개의 리소스 ('aws_api_gateway_rest_api'와'aws_api_gateway_method')에 의존하기 때문에 절대적으로 먼저 실행되지 않을 것입니다. 이것은 다른 것들에 의존적 일 수 있습니다. 보고 싶은 TF를 실행해야하지만, 불행히도 오늘 밤까지 기다려야합니다. 질문을 편집 할 수 있다면'terraform graph'의 출력을 보는 것이 흥미로울 것입니다. 자원 "aws_api_gateway_deployment" "기본"{ ... stage_description = " – ydaetskcoR

답변

3

TF는 API를 배포 할 수 없습니다,이 링크는 당신을 도울 수 있습니다 https://medium.com/coryodaniel/til-forcing-terraform-to-deploy-a-aws-api-gateway-deployment-ed36a9f60c1a

내가 해결 한 내 변수 deployed_at를 추가하여 :

resource "aws_api_gateway_deployment" "api_ingest_deployment" { 
    depends_on = ["aws_api_gateway_method.xxx", 
       "aws_api_gateway_integration.yyy", 
       "aws_api_gateway_integration.zzz", 
       "aws_api_gateway_integration.www", 
    ] 
    rest_api_id = "${aws_api_gateway_rest_api.foo.id}" 
    stage_name = "${var.environment}" 

    variables { 
    deployed_at = "${timestamp()}" 
    } 
} 

단점입니다 이런 식으로하는 경우에 그 것이다 변경 사항이없는 경우에도 항상 배포

+3

사실, 난 그냥 또한이 방법을하는이 GitHub의 문제 https://github.com/hashicorp/terraform/issues/6613 을 확인 $ {md5 (file ("api_gateway.tf"))} " ... } 은 더 영리하며 배포 빈도를 줄입니다. –

관련 문제