it-swarm.dev

Cara memeriksa apakah sumber daya tertentu sudah ada dalam skrip CloudFormation

Saya menggunakan cloudformation untuk membuat stack yang menyertakan instance EC2 autoscaled dan bucket S3. Untuk bucket S3, saya memiliki DeletionPolicy yang diatur ke Retain, yang berfungsi dengan baik, hingga saya ingin menjalankan kembali skrip cloudformation saya lagi. Karena pada menjalankan sebelumnya, skrip menciptakan ember S3, gagal pada berjalan berikutnya mengatakan ember S3 saya sudah ada. Tak satu pun dari sumber daya lain tentu saja bisa dibuat juga. Pertanyaan saya adalah bagaimana cara memeriksa apakah bucket S3 saya ada pertama kali di dalam skrip cloudformation, dan jika ada, lewati pembuatan sumber daya itu. Saya telah melihat dalam kondisi di AWS, tetapi tampaknya semua berdasarkan parameter, saya belum menemukan fungsi yang memeriksa dari sumber yang ada.

24
alexfvolk

Tidak ada cara yang jelas untuk melakukan ini, kecuali jika Anda membuat template secara dinamis dengan pemeriksaan eksplisit. Tumpukan yang dibuat dari templat yang sama adalah entitas independen, dan jika Anda membuat tumpukan yang berisi ember, hapus tumpukan sambil mempertahankan ember, dan kemudian buat tumpukan baru (bahkan yang dengan nama yang sama), tidak ada hubungan antara ini tumpukan baru dan ember dibuat sebagai bagian dari tumpukan sebelumnya.

Jika Anda ingin menggunakan ember S3 yang sama untuk beberapa tumpukan (bahkan jika hanya ada satu ember pada satu waktu), ember itu tidak benar-benar termasuk dalam tumpukan - akan lebih masuk akal untuk membuat ember dalam tumpukan yang terpisah, menggunakan templat terpisah (meletakkan URL ember di bagian "Keluaran"), dan kemudian merujuknya dari tumpukan asli Anda menggunakan parameter.

19
bsvingen

Cukup tambahkan parameter input ke template CloudFormation untuk menunjukkan bahwa bucket yang ada harus digunakan .... kecuali Anda belum tahu kapan Anda akan menggunakan template itu? Kemudian Anda bisa menambahkan sumber daya baru atau tidak berdasarkan nilai parameter.

6
linuxfreakus

Jika Anda melakukan pembaruan, (berpotensi tumpukan di dalam tumpukan alias Nested Stacks), bagian yang tidak berubah tidak diperbarui . https://docs.aws.Amazon.com/AWSCloudFormation/latest/UserGuide/aws- properties-stack.html? icmpid = docs_cfn_console_designer

Anda kemudian dapat menetapkan kebijakan seperti yang disebutkan untuk mencegah penghapusan. [ingat izin 'batalkan pembaruan' untuk kembalikan] https://docs.aws.Amazon.com/AWSCloudFormation/latest/UserGuide/protect-stack-resources.html

Ada juga Output Cross-Stack yang harus diperhatikan dengan menambahkan Nama Ekspor ke Output Stack . http://docs.aws.Amazon.com/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html Panduan ... http://docs.aws.Amazon.com/AWSCloudFormation/latest/UserGuide/walkthrough-crossstackref.html

Maka Anda perlu menggunakan Fn :: ImportValue ... http://docs.aws.Amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html

Ini menyiratkan seseorang dapat menggunakan parameter nama tumpukan jaringan.

Sayangnya Anda mendapatkan kesalahan seperti ini ketika Anda mencobanya di Ketentuan.

Kesalahan validasi template: Kesalahan template: Tidak bisa menggunakan Fn :: ImportValue dalam Ketentuan.

Atau dalam Parameter?

Kesalahan validasi template: Kesalahan format template: Setiap anggota Default harus berupa string.

Juga ini dapat terjadi saat mencoba ...

Kesalahan format templat: Output ExportOut salah format. Bidang Nama Ekspor tidak boleh bergantung pada sumber daya apa pun, nilai yang diimpor, atau Fn :: GetAZs.

Jadi Anda tidak bisa menghentikannya membuat sumber daya yang ada lagi dari file yang sama. Hanya ketika meletakkannya di tumpukan lain dan menggunakan referensi ekspor impor.

Tetapi jika Anda memisahkan keduanya maka ada ketergantungan yang akan berhenti dan kembalikan misalnya penghapusan ketergantungan, berkat referensi melalui fungsi ImportValue.

Contoh yang diberikan di sini adalah: 

Pertama Buat Template Grup

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Metadata": {
    "AWS::CloudFormation::Designer": {
      "6927bf3d-85ec-449d-8ee1-f3e1804d78f7": {
        "size": {
          "width": 60,
          "height": 60
        },
        "position": {
          "x": -390,
          "y": 130
        },
        "z": 0,
        "embeds": []
      },
      "6fe3a2b8-16a1-4ce0-b412-4d4f87e9c54c": {
        "source": {
          "id": "ac295134-9e38-4425-8d20-2c50ef0d51b3"
        },
        "target": {
          "id": "6927bf3d-85ec-449d-8ee1-f3e1804d78f7"
        },
        "z": 1
      }
    }
  },
  "Resources": {
    "TestGroup": {
      "Type": "AWS::IAM::Group",
      "Properties": {},
      "Metadata": {
        "AWS::CloudFormation::Designer": {
          "id": "6927bf3d-85ec-449d-8ee1-f3e1804d78f7"
        }
      },
      "Condition": ""
    }
  },
  "Parameters": {},
  "Outputs": {
    "GroupNameOut": {
      "Description": "The Group Name",
      "Value": {
        "Ref": "TestGroup"
      },
      "Export": {
        "Name": "Exported-GroupName"
      }
    }
  }
}

Kemudian buat Template Pengguna yang membutuhkan grup.

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Metadata": {
    "AWS::CloudFormation::Designer": {
      "ac295134-9e38-4425-8d20-2c50ef0d51b3": {
        "size": {
          "width": 60,
          "height": 60
        },
        "position": {
          "x": -450,
          "y": 130
        },
        "z": 0,
        "embeds": [],
        "isrelatedto": [
          "6927bf3d-85ec-449d-8ee1-f3e1804d78f7"
        ]
      },
      "6fe3a2b8-16a1-4ce0-b412-4d4f87e9c54c": {
        "source": {
          "id": "ac295134-9e38-4425-8d20-2c50ef0d51b3"
        },
        "target": {
          "id": "6927bf3d-85ec-449d-8ee1-f3e1804d78f7"
        },
        "z": 1
      }
    }
  },
  "Resources": {
    "TestUser": {
      "Type": "AWS::IAM::User",
      "Properties": {
        "UserName": {
          "Ref": "UserNameParam"
        },
        "Groups": [
          {
            "Fn::ImportValue": "Exported-GroupName"
          }
        ]
      },
      "Metadata": {
        "AWS::CloudFormation::Designer": {
          "id": "ac295134-9e38-4425-8d20-2c50ef0d51b3"
        }
      }
    }
  },
  "Parameters": {
    "UserNameParam": {
      "Default": "testerUser",
      "Description": "Username For Test",
      "Type": "String",
      "MinLength": "1",
      "MaxLength": "16",
      "AllowedPattern": "[a-zA-Z][a-zA-Z0-9]*",
      "ConstraintDescription": "must begin with a letter and contain only alphanumeric characters."
    }
  },
  "Outputs": {
    "UserNameOut": {
      "Description": "The User Name",
      "Value": {
        "Ref": "TestUser"
      }
    }
  }
}

Kamu akan mendapatkan 

Tidak ditemukan ekspor bernama Exported-GroupName. Kembalikan diminta oleh pengguna.

jika menjalankan Pengguna tanpa Grup yang ditemukan Diekspor.

Anda kemudian bisa menggunakan pendekatan tumpukan bersarang.

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Metadata": {
    "AWS::CloudFormation::Designer": {
      "66470873-b2bd-4a5a-af19-5d54b11f48ef": {
        "size": {
          "width": 60,
          "height": 60
        },
        "position": {
          "x": -815,
          "y": 169
        },
        "z": 0,
        "embeds": []
      },
      "ed1de011-f1bb-4788-b63e-dcf5494d10d1": {
        "size": {
          "width": 60,
          "height": 60
        },
        "position": {
          "x": -710,
          "y": 170
        },
        "z": 0,
        "dependson": [
          "66470873-b2bd-4a5a-af19-5d54b11f48ef"
        ]
      },
      "c978f2d9-3fb2-4420-b255-74941f10a28a": {
        "source": {
          "id": "ed1de011-f1bb-4788-b63e-dcf5494d10d1"
        },
        "target": {
          "id": "66470873-b2bd-4a5a-af19-5d54b11f48ef"
        },
        "z": 1
      }
    }
  },
  "Resources": {
    "GroupStack": {
      "Type": "AWS::CloudFormation::Stack",
      "Properties": {
        "TemplateURL": "https://s3-us-west-2.amazonaws.com/cf-templates-x-TestGroup.json"
      },
      "Metadata": {
        "AWS::CloudFormation::Designer": {
          "id": "66470873-b2bd-4a5a-af19-5d54b11f48ef"
        }
      }
    },
    "UserStack": {
      "Type": "AWS::CloudFormation::Stack",
      "Properties": {
        "TemplateURL": "https://s3-us-west-2.amazonaws.com/cf-templates-x-TestUserFindsGroup.json"
      },
      "Metadata": {
        "AWS::CloudFormation::Designer": {
          "id": "ed1de011-f1bb-4788-b63e-dcf5494d10d1"
        }
      },
      "DependsOn": [
        "GroupStack"
      ]
    }
  }
}

Sayangnya Anda masih dapat menghapus tumpukan Pengguna meskipun itu dibuat oleh MultiStack dalam contoh ini tetapi dengan kebijakan penghapusan dan hal-hal lain mungkin hanya membantu.

Maka Anda hanya Memperbarui berbagai tumpukan yang dibuatnya, dan Anda tidak akan melakukan Multi Stack jika Anda misalnya menggunakan kembali Bucket.

Kalau tidak, Anda akan melihat API dan skrip dalam berbagai rasa.

0
Master James