自動スケーリンググループでEC2インスタンスのインデックス/位置を決定するにはどうすればよいですか?


1

私はアプリケーションをブートストラップするためにいくつかの自動化スクリプトに取り組んでおり、AWSの自動スケーリンググループを使用して、アプリケーションのEC2インスタンスをスピンアップ/ダウンします。

:私は、パターンは以下のマシンのための一貫性のある名前を再作成できるようにする必要がありMYAPP001MYAPP002、をMYAPP003

質問

ユーザーデータのブートストラップフェーズ中にメタデータを照会して、起動したばかりのこのマシンが002グループ内にあることを確認する方法はありますか?

これを判別できれば、マシンの名前をに変更できMYAPP002ます。

説明に役立つシナリオ

マシンが命名されることを想定して、サードパーティのサービスを想像してみてMYAPP001MYAPP002MYAPP003。このソフトウェアでは、マシンがオフラインになり、後で別のIPアドレスでオンラインに戻ることは問題ありません。ただし、2つの異なるマシンが同じホスト名で同時にこのソフトウェアと通信することはできません。

回答:


0

この情報はAPIを介しても利用可能であると確信していますか?私が考えることができる最良の方法は、実行中のすべてのインスタンスの起動時間を照会し、「最新」であるかどうかを調べることです。

あなたはに依存している場合、私はあなたはそれが間違ってやっていること、しかし、言っている任意のあなたの自動スケーリンググループにマシン固有の状態。デプロイメント方法とアプリケーションは、ASGインスタンスがすべてホスト名も含めてまったく同じになるように構築する必要があります。いくつかの技術的な理由で特定のホスト名を割り当てることが必要としてます、あなたを悩ませ戻ってきます。

これを、あなたがこれをする必要がないように、リファクタリングする機会として見てください。ASGが必要に応じてインスタンスを作成および破棄できるようにアプリを構築します。各ホストと呼ばれるものを心配する必要はありません。


思考実験として、これを少し考えてみましょう。次の3つのインスタンスでASGをインスタンス化するとします:ASG [01,02,03]。将来のある時点で、ASG02に問題が発生し、終了します。ASGは、それを置き換える新しいインスタンスを作成します。現在はASG04です。これで、ASG [01,03,04]ができました。それはあなたが意図していることですか?なぜこの情報が必要なのですか?前述したように、あなたが正しいことをやっている場合、あなたはしていない、この情報が必要か、とにかくべきではありません。人間が読めるようにするためだけに、または物事をよりよく追跡できるようにするためにそれを行っている場合は、そのままにして、ASGに任せてください。


APIがこの情報を提供しているかどうかはわかりません。したがって、私の質問です。その情報を知っていれば、私は尋ねなかっただろう:) 2番目の部分は少し素朴ですが、一意の名前を必要とするサードパーティのシステム、アーキテクチャなどがいくつかあります。たとえば(例に巻き込まれないでください)-同じActive Directoryドメインに重複したコンピューター名で参加することはできません... Chefサーバーには一意のノード名が必要です...など-繰り返しますが、取得しないでください例に追いついた-質問が残ります:これはAWSで可能ですか?
ティモシーコウリー

1
これを解決するには、各ホストの名前をそのインスタンスIDに設定します。アカウント内で一意であることが保証されています。
EEAA

ホスト名はAWSによってすでにランダムになっていますが、特定のパターンに従う必要があります。私は質問のシナリオをより明確に説明する必要があることを理解しています。これまでのフィードバックに感謝します。
ティモシーコウリー

インスタンスには意味のある名前を付ける必要があるため、わかりにくいIPアドレスに頼らずにインスタンスにログインするための合理的で直感的な方法が必要です。なぜこれに対して多くのプッシュバックがあるのですか?自動スケールグループ内のインスタンスにログインする必要があったのは私だけですか?月に男を置くことができます。インスタンスに動的に名前を付ける方法を理解できます。
セリン

-1

OK、いくつかのグーグルを使用し、AWSでいくつかのインスタンスをスピンアップし、リモーティングとテストを行いました。以下は、AWSのおかげで(非常に簡単な)答えです。

http://169.254.169.254/latest/meta-data/ami-launch-index

それでおしまい。これは、起動順序の「ゼロベース」インデックスを返します。Amazonのドキュメントを以下に示します。これらのドキュメントは、なぜこれが必要なのかについての良いユースケースを提供します。

http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html#AMI-launch-index-examples

マシン名を取得するために使用しているPowerShellスクリプトは次のとおりです。

$index = (Invoke-WebRequest "http://169.254.169.254/latest/meta-data/ami-launch-index").Content

$name = "MYAPP" + ([Int]::Parse($index) + 1).ToString("000")

悲しいことに、私の自動スケールグループは2つのインスタンスを作成し、どちらも「インデックス#0」であると言っているので、これは大成功ではありません。


1
あなたはこれで正しい軌道に乗っていると思いますが、インスタンスが失敗して置き換えられた場合、起動インデックスで何が起こるかを確認したいと思うでしょう。
マイケル-sqlbot

これに対する回避策を見つけたかどうかはわかりませんが、自動スケーリンググループはすべてのノードに対して常に起動インデックス0を返します。それは仕様です。
ブルーベン

Stackoverflowのプライベートダイナミックインスタンスにリンクすることは不適切です。
セリン

うん、ami-launch-indexはCloudFormationスタックなどでのみ機能します。すべてのASGインスタンスは完全に同一であると想定されているため、ハッキングのない実行可能なアプローチはないかもしれません。@Cerinその特定のIPは、EC2インスタンス内からインスタンスメタデータにアクセスするためのリンクローカルアドレスです。無能であると仮定するのではなく、疑いの恩恵をユーザーに与えてください。
バックギャモン

-1

「appserver」などの共通タグ名を保持し、実行時にこの文字列に数字を追加することにより、サーバーの名前を変更できます。

!Sub '$Env=''${Environment}'''
                - '    $instanceid = Get-EC2InstanceMetadata -Category InstanceId'
                - !Sub '$tag_Name=''${Name}'''
                - '    $Dev=901'
                - '    $Test=801'
                - '    $Prod=101'
                - '    if($Env -eq "dev"){$StartVal = $Dev}'
                - '    if($Env -eq "test"){$StartVal = $Test}'
                - '    if($Env -eq "prod"){$StartVal = $Prod}'
                - '    Start-Sleep -s ((Get-Random -Minimum 1 -Maximum 10) + (Get-Random -Minimum 1 -Maximum 10))'
                - '    Start-Sleep -s ((Get-Random -Minimum 1 -Maximum 10) + (Get-Random -Minimum 1 -Maximum 10))'
                - '    Start-Sleep -s ((Get-Random -Minimum 1 -Maximum 10) + (Get-Random -Minimum 1 -Maximum 10))'
                - '    Start-Sleep -s ((Get-Random -Minimum 1 -Maximum 10) + (Get-Random -Minimum 1 -Maximum 10))'
                - '    Start-Sleep -s ((Get-Random -Minimum 1 -Maximum 10) + (Get-Random -Minimum 1 -Maximum 10))'
                - '    Start-Sleep -s ((Get-Random -Minimum 1 -Maximum 10) + (Get-Random -Minimum 1 -Maximum 10))'
                - '    Start-Sleep -s ((Get-Random -Minimum 1 -Maximum 10) + (Get-Random -Minimum 1 -Maximum 10))'
                - '    $a=@(Get-EC2Tag -Filter @{Name="key";Value="Name"},@{Name="resource-type";Value="instance"})'
                - '    $b = @()'
                - '    foreach( $item in $a){'
                - '      if($item.Value -match $tag_Name){'
                - '        $item.Value=$item.Value.substring($item.Value.length - 3, 3)'
                - '        $b += $item.Value'
                - '      }'
                - '    }'
                - '    Write-Host $b'
                - '    if($b -eq $null){'
                - '      $StartVal=$StartVal'
                - '    }'
                - '    else {'
                - '      foreach( $item in $b){'
                - '        if($b -contains $StartVal){'
                - '            $StartVal = $StartVal+1  '
                - '        }'
                - '        else {$StartVal=$StartVal}'
                - '      }'
                - '    }'
                - '    Write-Host $StartVal'
                - '    $tag_Name += $StartVal'
                - '    Write-Host $tag_Name'
                - '    $tag = New-Object Amazon.EC2.Model.Tag'
                - '    $tag.Key = "Name"'
                - '    $tag.Value = $tag_Name'
                - '    New-EC2Tag -Resource $instanceid -Tag $tag'
                - '    $newcomputername = $tag_Name'

あなたが投稿したコードは何ですか?
セリン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.