web-dev-qa-db-ja.com

AWSのLambdaからシェルスクリプトを起動します

EC2インスタンスにbashスクリプトが存在する場合、ラムダがそれをトリガーする方法はありますか?

ラムダのトリガーはRDSから取得されます。したがって、mysqlのテーブルが更新され、そのテーブルの特定の列が「Ready」に更新されると、Lambdaは「Ready」ステータスのその行のIDをプルし、そのIDをbashスクリプトに送信する必要があります。

9
lightweight

Amazon EC2 Simple Systems Manager を使用すると、インスタンスでスクリプトを実行するようにSSMドキュメントを設定し、そのスクリプトにパラメーターを渡すことができます。 Lambdaインスタンスは、インスタンスIDでインスタンスをターゲットにして、SSMsendコマンドを実行する必要があります。

サンプルSSMドキュメント:run_my_example.json:

{
  "schemaVersion": "1.2",
  "description": "Run Shell script to launch.",
  "parameters": {
         "taskId":{
            "type":"String",
            "default":"",
            "description":"(Required) the Id of the task to run",
            "maxChars":16
        }
  },
  "runtimeConfig": {
    "aws:runShellScript": {
      "properties": [
        {
          "id": "0.aws:runShellScript",
          "runCommand": ["run_my_example.sh"]
        }
      ]
    }
  }
}

上記のSSMドキュメントは、taskIdをパラメーターとして受け入れます。

このドキュメントをJSONファイルとして保存し、AWSCLIを使用してcreate-documentを呼び出します。

aws ssm create-document --content file:///tmp/run_my_example.json --name  "run_my_example"

describe-documentを呼び出すと、SSMドキュメントの説明を確認できます。

aws ssm describe-document --name "run_my_example"

TaskIdパラメーターを指定し、send-commandでドキュメント名を使用してコマンドを実行できます。

aws ssm send-command --instance-ids i-12345678 --document-name "run_my_example" --parameters --taskid=123456

[〜#〜] notes [〜#〜]

  • インスタンスは SSMエージェントの最新バージョン を実行している必要があります。

  • サーバーEGのインスタンスIDを識別するために、Lambdaスクリプトにいくつかのロジックが必要です。具体的にタグ付けされたインスタンスのインスタンスIDを検索します。

5
Rodrigo M

いくつかのことを仮定しましょう。まず、snsを使用して「トリガー」を設定する方法( ここ を参照)と、ラムダスクリプトをそのトリガーからハングアップする方法を知っています。次に、この例はPythonであるため、python(Lambdaの構文オファリングはNode、Java、およびPython)について少し知っています。さらに、mysqlを使用してデータベースをクエリする方法については説明しません。 。RDSインスタンスがMySQL、Postgress、その他のいずれであるかについては言及していません。最後に、IAMの役割とポリシーを使用してAWSリソース全体で権限を許可する方法を理解する必要があります。

次のスクリプトは、少なくともインスタンスに対してスクリプトを起動する方法の概要を示しています(関連情報をクエリする方法、またはその情報をSNSトピックに渡す方法を理解する必要があります)。次に、インスタンスに対してShellコマンドを実行します。指定します。

import boto3
def lambda_handler(event, context):
     #query RDS to get ID or get from SNS topic
     id = *queryresult*
     command = 'sh /path/to/scriptoninstance' + id
     ssm = boto3.client('ssm')
     ssmresponse = ssm.send_command(InstanceIds=['i-instanceid'], DocumentName='AWS-RunShellScript', Parameters= { 'commands': [command] } ) 

RDS行にはおそらく2つのフラグがあります。 「準備完了」と表示されているものと「識別済み」と表示されているもの。したがって、SNSトピックはラムダスクリプトをトリガーし、ラムダスクリプトは「ready」= trueおよび「identified」= falseの行を検索し、「identified」をtrueに変更します(同時に実行できる他のラムダスクリプトが実行されないようにするため)それを拾うために)、そしてスクリプトを起動します。スクリプトが正常に実行されない場合は、「identified」をfalseに戻し、データが有効なままであることを確認します。

5
ncarmona

それらの1つを考慮すべきいくつかのことがあります:

  • セキュリティ。現在、ラムダはVPCで実行できません。つまり、EC2には広くオープンなインバウンドセキュリティグループが必要です。

メッセージングキュー(SQSなど)を確認することをお勧めします。これは多くの頭痛の種を解決するでしょう。

それがどのように機能するかです:

  • ラムダ。メッセージを取得します。 SQSに送信
  • EC2。トリガーN分を取得するcronジョブ。 sqsからメッセージをプルします。メッセージを処理します。
2
Vor

新しい EC2 Run Command 機能を使用してこれを実現できると思います。

1
Mark B