2017-06-26 2 views
0

すべて、オートスケーリング:最小2インスタンスとそれ以降のラムダ

実際にスタックされ、ほぼすべてを試しました。いくらか助けてもらえますか?

私は自動スケーリンググループを作成する際に2つのインスタンスを提供します。インスタンス名を一意の名前に変更するLambda(タグを操作する)をトリガーします。

私はラムダの最初のインスタンスは、最初のインスタンスに名前を付けたい望ましい状態 「ウェブ-1」 次にラムダの2番目のインスタンスは、名前を割り当てるにはちゃんと実行します「ウェブ-2」

現在の状態 "web-1"が存在するかどうかを調べるために、実行中のインスタンスの検索から始めます。 この場合、私のラムダは2回実行され、同じ名前(web-1、web-1)の両方のインスタンスを作成します。

どうすればこの問題を回避できますか?問題はラムダがクラウドウォッチのイベントを聞いていることによると分かっています。 ASGの立ち上げは、私の場合、同時に2つのイベントを作成して、私の問題につながります。

ありがとうございました。

+0

ラムダ関数で利用可能なデータに開始インデックス値はありますか?私はAutoscalingグループでこれをチェックしていませんが、一般に、単一のAPIコマンドで複数のEC2インスタンスを起動すると、達成しようとしている一意の名前付けの種類に使用できる異なる起動インデックス値が取得されます。 –

+0

Mark、ASGは残念ながら、作成するインスタンスのインデックスを作成することはできません。したがって、私は選択肢が残っていますが、両方のインスタンスをタグ "web-0"で開始する必要があります。後で私のラムダを使って名前を変更します。私の2つのインスタンスの間に2分の遅延を追加することができれば、そのトリックもやります。現在、すべてのオプションが利用できないようです。 – rashcuva

+0

'web-1'が後で終了し、別のインスタンスが起動されたときに何をしたいですか?新しいインスタンスが 'web-1'になるか、' web-3'になるべきか? –

答えて

0

古典的なマルチスレッドの問題が発生しています。両方のラムダ関数は同時に実行され、同じ「未使用」のweb-1を参照し、両方を同じ関数でマークします。

あなたが必要とするのは、各ラムダの実行に「許可」を与えるアトミックな操作です。 helper DynamoDBテーブルを使用して、タグの試行をシリアル化することができます。

  1. あなたのラムダ関数は、(ウェブ-1、ウェブ-2など)を設定したタグを決めていることがタグは、最後の30秒に設定されているかどうかを確認するためにDynamoDBのテーブルをチェックしてください。そうであれば、他の誰かが最初にそれにアクセスしたので、ステップ1に戻ります。
  2. 探しているタグの "所有権"を現在のタイムスタンプと共にDynamoDBに書き込もうとします。 attribute_not_existsまたはその他のDynamoDB条件を使用して、このような書き込みが1回だけ確実に成功するようにしてください。
  3. 書き込みに失敗した場合は、手順1に戻ります。
  4. 書き込みに成功すると、タグを自由に設定できます。

タイムスタンプの理由は、「web-1」を終了させ、新しいEC2インスタンスを起動して「web-1」というラベルを付けることです。

上記のロジックは動作することは証明されていませんが、うまくいけば、作業上の解決策を開発するのに十分な指針を与えるべきです。

+0

マットありがとう。私は確かにこれを試してみる。その間、私はラムダがハンドラの冒頭にtime.sleep(ランダム)を追加することで作業している。両方のランダムな数字が(非常にまれである)同じ数字を返さない限り、私はうまくいくはずです。重要なのは、スケーリングポリシーでは常に1つのインスタンスが追加されるということです。 ASGのプロビジョニング中に直面するマルチスレッドの課題に遭遇することはありません。あなたと他の人がこのアプローチについてコメントしてもらえますか? – rashcuva

関連する問題