Terraform-provider-aws: data.aws_ecs_task_definition: Gagal mendapatkan definisi tugas

Dibuat pada 28 Jul 2017  ·  25Komentar  ·  Sumber: hashicorp/terraform-provider-aws

Versi Terraform

0.9.11.

  • aws_ecs_task_definition

File Konfigurasi Terraform

data "aws_ecs_task_definition" "my-service" {
  task_definition = "${aws_ecs_task_definition.my-service.family}"
}

resource "aws_ecs_task_definition" "my-service" {
  family                = "${var.environment_name}-${var.service_name}-${var.instance_name}"
  network_mode          = "bridge"
  container_definitions = "${data.template_file.my-service.rendered}"
}

resource "aws_ecs_service" "my-service" {
 ...
  #Track the latest ACTIVE revision
  task_definition = "${aws_ecs_task_definition.my-services.family}:${max("${aws_ecs_task_definition.my-service.revision}", "${data.aws_ecs_task_definition.my-service.revision}")}"
...
}

Perilaku yang Diharapkan

jika sumber daya tidak ada buat aws_ecs_task_definition lain gunakan versi aws_ecs_task_definition terbaru

kode ini baik-baik saja di Terraform v0.9.2

Perilaku Sebenarnya

: Gagal mendapatkan definisi tugas ClientException: Tidak dapat menjelaskan definisi tugas.
kode status: 400, id permintaan: "layanan-saya"

Langkah-langkah untuk Mereproduksi

  1. terraform apply
bug servicecs

Komentar yang paling membantu

Saya dapat mengatasi masalah ini dengan menambahkan "depend_on" ke sumber data:

resource "aws_ecs_task_definition" "task" {
...
}
data "aws_ecs_task_definition" "task" {
  depends_on = [ "aws_ecs_task_definition.task" ]
  ...
}

Semoga membantu.

Semua 25 komentar

juga direproduksi di terraform 1.0

Saya juga mengalami masalah yang sama! Yang membuat penasaran adalah ketika mencoba pencarian menggunakan keadaan vanilla (benar-benar kosong), rencanakan dan terapkan berfungsi seperti yang diharapkan. Hanya ketika saya memiliki file status yang ada yang tidak berfungsi.

Yang lebih penasaran, bagaimanapun, sumber daya tidak ada di file negara, namun gagal? 🤔

Menyelam ke debugging ... Saya memperhatikan bahwa func dataSourceAwsEcsTaskDefinitionRead tidak dipanggil dalam proyek vanilla, tetapi dipanggil dalam proyek yang sudah ada. Ini tampaknya merupakan pola terraform. Saya dapat mereproduksi ini dengan membuat sumber daya sederhana terlebih dahulu (grup keamanan) kemudian mencoba melakukan pencarian. Rencana gagal ketika sumber daya sudah ada di statefile (grup keamanan dalam kasus ini). Saya memverifikasi hipotesis saya dengan juga membuat sumber data berbeda yang mencari grup keamanan yang tidak ada. Rencana untuk ini juga gagal.

Jika argumen contoh data tidak berisi referensi ke nilai yang dihitung, seperti atribut sumber daya yang belum dibuat, maka contoh data akan dibaca dan statusnya diperbarui selama fase "penyegaran" Terraform, yang secara default berjalan sebelum membuat rencana. Ini memastikan bahwa data yang diambil tersedia untuk digunakan selama perencanaan dan perbedaan akan menunjukkan nilai nyata yang diperoleh.

Argumen contoh data dapat merujuk ke nilai yang dihitung, dalam hal ini atribut dari contoh itu sendiri tidak dapat diselesaikan hingga semua argumennya ditentukan. Dalam kasus ini, memuat ulang instance data akan ditangguhkan hingga fase "terapkan", dan semua interpolasi atribut instance data akan ditampilkan sebagai "dihitung" di rencana karena nilainya belum diketahui.

Ini sangat menarik bagi saya. Berdasarkan dokumen di atas , konfigurasi OP seharusnya tidak gagal karena data.aws_ecs_task_definition.my-service bergantung pada aws_ecs_task_definition.my-service.family , tetapi gagal dalam fase rencana * (masalah saya juga). Mungkin ini bug tingkat terraform dan bukan tingkat penyedia?

  • Sunting: salah mengatakan itu gagal dalam fase menerapkan alih-alih fase rencana.

@radeksimko, bisakah kami memperhatikan hal ini? Saya tidak ingin mengirim spam ke repo utama jika itu bukan masalah terraform.

Saya melihat masalah ini juga.

Saya sebenarnya tidak membutuhkan data dan resource untuk hal yang sama di file yang sama. Saya mengomentari data dan sekarang tampaknya berfungsi lebih baik.

Saya dapat mengatasi masalah ini dengan menambahkan "depend_on" ke sumber data:

resource "aws_ecs_task_definition" "task" {
...
}
data "aws_ecs_task_definition" "task" {
  depends_on = [ "aws_ecs_task_definition.task" ]
  ...
}

Semoga membantu.

Bukan bug banget, solusi dari @parruda sudah benar. resource aws_ecs_service dan data aws_ecs_task_definition keduanya mengharapkan resource aws_ecs_task_definition harus sudah dibuat.

@KIVagant itu masuk akal, karena saya juga mengalami masalah yang sama.

Meskipun saya akan mengatakan dokumen Terraform untuk itu menunjukkan objek data dan resource yang digunakan bersama harus diperbarui untuk mencerminkan hal ini. seperti yang ada sekarang, dokumen tersebut menyiratkan bahwa jika sumber daya tidak ada maka tidak ada yang gagal.

Jika tidak, solusi @parruda masuk akal bagi saya

Ya, saya mungkin harus mencoba memperbaikinya sebelum menjawab, itu berhasil tetapi itu menyebabkan deteksi perubahan terus menerus terjadi.
Yang bukan merupakan hasil yang diharapkan / diinginkan

Perbaikan @parruda berhasil untuk saya, tetapi sekarang depends_on eksplisit memicu pembaruan definisi tugas saya pada setiap tf run. Apakah ada praktik terbaik untuk mencegahnya? Saya menggunakan Terraform v0.11.5
dan provider.aws v1.10.0.

@dendrochronology , saya menggunakan sesuatu seperti ini:

data "aws_ecs_task_definition" "blabla" {
  task_definition = "${aws_ecs_task_definition.blabla.family}"
  depends_on = [ "aws_ecs_task_definition.blabla" ]
}


resource "aws_ecs_task_definition" "..." {
  family                = "..."
  task_role_arn         = "${aws_iam_role.blabla.arn}"

  container_definitions = "${data.template_file.task_definition.rendered}"

  depends_on = [
    "data.template_file.task_definition",
  ]

  lifecycle {
    ignore_changes = [
      "container_definitions" # if template file changed, do nothing, believe that human's changes are source of truth
    ]
  }
}


resource "aws_ecs_service" "blabla" {
  name            = "blabla"
  cluster         = "${aws_ecs_cluster.cluster_name.id}"
  task_definition = "${aws_ecs_task_definition.blabla.family}:${max("${aws_ecs_task_definition.blabla.revision}", "${data.aws_ecs_task_definition.blabla.revision}")}"
  desired_count   = 1
  iam_role        = "${aws_iam_role.ecs_service.name}"

// Not compatible with placement_constraints:distinctInstance, commented
//  placement_strategy {
//    type  = "binpack"
//    field = "cpu"
//  }

  placement_constraints {
    type  = "distinctInstance"
  }

  load_balancer {
    elb_name       = "${aws_elb.blabla.name}"
    container_name = "internal"
    container_port = "${var.blabla_port}"
  }

  depends_on = [
    "aws_iam_role.ecs_service",
    "aws_elb.blabla",
    "aws_iam_role.blabla",
    "aws_ecs_task_definition.blabla"
  ]

  lifecycle {
    ignore_changes = ["task_definition"] # the same here, do nothing if it was already installed
  }
}

@KIVagant ah , saya akan bermain dengan pengait siklus hidup ignore_changes !

Ah, bagus, aku akan bermain dengan itu juga. Apakah itu berarti saya harus secara manual taint itu ketika saya membuat perubahan pada file template definisi tugas?

Itu tergantung pada tujuan Anda. Dalam kasus kami, templat berisi tempat kosong untuk rahasia yang terisi setelah instalasi pertama oleh Terraform dan kami tidak ingin mengizinkannya mengubah definisi tugas yang ada. Dan kami mengontrolnya secara manual setelah pemasangan pertama.

@dendrochronology mohon maaf atas kurangnya respon. Saya sebenarnya tidak pernah memperhatikan masalah karena kami memang ingin memperbarui definisi tugas di setiap proses. Saya harap Anda menemukan solusi.

Ini sepertinya masih menjadi masalah, jika Anda hanya menggunakan apa yang ada di dokumen Anda akan mendapatkan ini:

Error: Error running plan: 1 error(s) occurred:

* module.frontshop_staging.data.aws_ecs_task_definition.frontshop: 1 error(s) occurred:

* module.frontshop_staging.data.aws_ecs_task_definition.frontshop: Resource 'aws_ecs_task_definition.frontshop' not found for variable 'aws_ecs_task_definition.frontshop.family'

Satu-satunya hal yang berubah adalah bahwa ini ada di dalam modul dan namanya frontshop. Mungkinkah itu terkait dengan modul?
Saya juga mencoba dengan depend_on dan tidak akan berhasil. Saya berpikir untuk menerapkan versi pertama untuk membuat sumber daya dan kemudian menggunakan data dengan max untuk mendapatkan revisi terbaru.

Sebenarnya apa yang saya katakan adalah bohong, sepertinya ada masalah ketika Anda memiliki JSON yang tidak valid untuk definisi kontainer dan milik saya tidak menggunakan sintaks heredoc tetapi file json dengan templat dan itu harus berupa array kontainer dan saya punya hanya satu objek utama.
Di sini saya mengetahuinya https://github.com/terraform-providers/terraform-provider-aws/issues/2026

yang bagus @jaysonsantos. Dalam kasus saya, kesalahan keluar karena kesalahan sintaks json

Dengan peningkatan penyedia ke 1.59 dan terraform 11.11, saya masih melihat kesalahan ini.

Jika terraform menghancurkan selesai tanpa kesalahan, itu berfungsi dengan baik tanpa depend_on.

Namun, jika terraform menghancurkan gagal pada hal lain misalnya:

 Error removing user, role, or group list from IAM Policy Detach bootstrap-iam-group-attach1:
– NoSuchEntity

Tidak terkait dengan layanan ecs. Sesuatu yang menjalankan terraform menghancurkan untuk kedua kalinya akan diselesaikan. Pada umpan kedua

Failed getting task definition ClientException: Unable to describe task definition.

kesalahan muncul kembali dan file negara rusak.

Masalah ini tidak terlalu jelas bagi saya. Sepertinya beberapa orang mengklaim bahwa kita TIDAK boleh menggunakan depend_on di sumber data untuk definisi tugas tetapi saat dijalankan pertama kali selalu gagal karena sumber daya tidak ada.

FYI untuk semua orang yang tersandung masalah ini: @skorfmann diilustrasikan dalam MR ini https://github.com/terraform-providers/terraform-provider-aws/pull/10247 solusi yang lebih baik menggunakan aws_ecs_task_definition.self.revision dan menjelaskan mengapa membahas depends_on pendekatan bukanlah yang Anda inginkan!

Ini mengatasi masalah tidak memiliki definisi tugas saat sumber daya awalnya diluncurkan. Contoh dokumentasi dari langsung merujuk "task_family" tidak bekerja dan keluar dengan kesalahan saat pertama kali menerapkannya. Lihat juga masalah # 1274 ini

Alasannya, sumber data tidak menangani data yang hilang dengan baik. Sayangnya, itu tidak akan dibahas, seperti yang dinyatakan di sini: hashicorp / terraform # 16380 (komentar). Salah satu solusi yang disarankan adalah, menambahkan penjelasan depends_on . Namun, hal ini menyebabkan potensi perubahan pada keluaran terraform plan, meskipun sebenarnya tidak akan berubah. Selain itu, tidak disarankan oleh dokumentasi Terraform itu sendiri.

Utas ini menyebutkan beberapa solusi lain, tetapi tampaknya tidak ada solusi yang sesuai hashicorp / terraform # 16380

aws_ecs_task_definition.self.revision hanya dapat direferensikan, setelah sumber daya dibuat (berbeda dengan keluarga, yang sudah ada dalam kode). Rupanya, ini memungkinkan Terraform menyelesaikan dependensi dengan benar dan membuat sumber data berperilaku seperti yang diharapkan.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

gazoakley picture gazoakley  ·  40Komentar

hashibot picture hashibot  ·  38Komentar

oarmstrong picture oarmstrong  ·  44Komentar

hashibot picture hashibot  ·  58Komentar

jckuester picture jckuester  ·  53Komentar