Mengapa formasi awan aws tidak menginstal paket yang saya tentukan?

14

Saya sangat baru dalam layanan AWS. Saya mencoba menggunakan formasi awan AWS dan saya membuat templat. Templat bebas kesalahan dan saya dapat membuat mesin menggunakan itu.

Tetapi saya telah menambahkan beberapa konfigurasi dalam template sehingga menginstal tomcat, git dan hal-hal lain selama startup. Tetapi itu tidak terjadi pada saya.

Ini adalah bagian dari kode yang saya gunakan untuk menginstal kucing jantan:

"Resources": {
    "Tomcat": {
        "Type": "AWS::EC2::Instance",
        "Metadata": {
            "AWS::CloudFormation::Init": {
                "config": {
                    "packages": {
                        "apt": {
                            "tomcat6": [],
                            "git": [],
                        }
                    }
                }
            }
        },

Tetapi ketika saya masuk ke mesin tidak tomcatjuga gitbelum diinstal!

Terima kasih sebelumnya.

batman
sumber
Saya berasumsi dari tag Anda bahwa ini adalah AMI Ubuntu?
mattdm
Sudahkah Anda mencoba menghapus "," setelah "git": []? Secara sintaksis tidak benar.
Edwin

Jawaban:

23

Saya percaya masalah Anda di sini adalah kebingungan tentang cloud-init yang tidak sama dengan cfn-init.

  • cloud-init adalah alat yang dimulai sebagai bagian dari AMI AWS Ubuntu yang memungkinkan interpretasi komponen data pengguna EC2 dari contoh meta-data. Amazon Linux juga mengadopsi alat ini dan membuatnya menjadi AMI mereka.

  • cfn-init adalah bagian dari rangkaian alat yang disebut CloudFormation Helper Scripts yang dibuat oleh AWS untuk Amazon Linux yang dapat membaca bagian tambahan yang disebutkan Metadatadalam templat CloudFormation Anda.

Jadi, Ubuntu dan Amazon Linux AMI keduanya memiliki alat cloud-init yang sudah diinstal untuk mengakses data pengguna, tetapi hanya Amazon Linux yang memiliki CloudFormation Helper Script yang sudah diinstal misalnya cfn-init untuk mengakses CloudFormation Metadata.

Namun, AWS mendistribusikan paket yang dapat Anda gunakan untuk membaca CloudFormation Metadata. Secara khusus, lihat template ini untuk bagaimana Anda dapat menggunakan skrip data pengguna cloud-init untuk menginstal python-setuptools, unduh CloudFormation Helper Scripts, instal dengan menggunakan easy_install dan aktifkan cfn-init.

Catatan: Ada distribusi atau AMI lain yang mungkin mendukung cloud-init atau cfn-init, tapi saya hanya membahas kasus-kasus umum di sini.

dialt0ne
sumber
12

Anda perlu memanggil cfn-init ( http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-init.html ) di dalam properti UserData dari instance:

{
    "Resources": {
        "Tomcat": {
            "Type": "AWS::EC2::Instance",
            "Metadata": {
                "AWS::CloudFormation::Init": {
                    "config": {
                        "packages": {
                            "apt": {
                                "tomcat6": [],
                                "git": []
                            }
                        }
                    }
                }
            },
            "Properties": {
                "UserData": {
                    "Fn::Base64": {
                        "Fn::Join": ["", [
                            "#!/bin/bash\n",
                            "/opt/aws/bin/cfn-init -s ", {
                                "Ref": "AWS::StackName"
                            },
                            "    -r Tomcat",
                            "    --region ", {
                                "Ref": "AWS::Region"
                            }, "\n"
                        ]]
                    }
                }
            }
        }
    }
}

Properti UserData dikodekan Base64, dan memungkinkan Anda untuk menentukan skrip yang harus dijalankan pada saat peluncuran. Di sini Anda dapat memanggil cfn-init yang akan membaca CloudFormation :: Init Metadata dan mengatur semua yang ditentukan di sana.

Juga saat membuat CF Stack Anda mungkin ingin masuk ke pengaturan lanjutan di halaman kedua (setelah memberikan parameter) dan pastikan Rollback on error diatur ke "Tidak". Dengan cara itu jika skrip cfn-init gagal karena alasan apa pun Anda dapat ssh ke instance dan memeriksa file /var/log/cfn-init.log untuk info lebih lanjut.

Andrei Fierbinteanu
sumber
Saya pikir ini harus menjadi jawaban yang diterima.
Erik van Brakel
-3
    "UserData"       : { "Fn::Base64" : { "Fn::Join" : ["", [
      "#!/bin/bash\n",
      "export DEBIAN_FRONTEND=noninteractive\n",
      "apt-get update && apt-get upgrade -y\n",
      "apt-get -y install python-setuptools\n",
      "easy_install https://s3.amazonaws.com/cloudformation-examples/aws-cfn-bootstrap-latest.tar.gz\n",
      "/usr/local/bin/cfn-init --stack ", { "Ref":"AWS::StackName" }, " --resource <REPLACE_WITH_RESOURCENAME>", " --region ", { "Ref": "AWS::Region" }, "\n",
Nic
sumber
4
Saya tidak mengerti ...
Pierre.Vriens