AWS

LambdaからEC2内スクリプト実行

AWS Systems Managerを使用する

AWS Systems Manager Agent (SSM Agent)のインストール
EC2インスタンスにSSM Agentがインストールされていることを確認します。Amazon Linuxにはデフォルトでインストールされていますが、他のLinuxディストリビューションの場合は手動でインストールする必要があります。

SSM Agentのステータス確認
sudo systemctl status amazon-ssm-agent
SSM Agentのバージョン確認
amazon-ssm-agent --version

IAMロールの作成とアタッチ
EC2インスタンスに適切なIAMロールをアタッチします。このロールには、SSMを利用するための必要な権限が含まれている必要があります。例えば、AmazonEC2RoleforSSMという管理ポリシーを使用します。

Lambda関数の作成
Lambda関数を作成し、必要なIAMロールをアタッチします。このロールには、SSMを利用するための権限が必要です。例えば、AmazonSSMFullAccessという管理ポリシーを使用します。

Lambda関数からSSMを呼び出してスクリプトを実行
Lambda関数内で、AWS SDKを使用してSSMを呼び出し、EC2インスタンス上でシェルスクリプトを実行します。以下はその例です。

import boto3

def lambda_handler(event, context):
    ssm = boto3.client('ssm')
    
    # 実行したいスクリプトのパス
    script_path = "/path/to/your/script.sh"
    
    # コマンドを実行するインスタンスID
    instance_id = "i-xxxxxxxxxxxxxxxxx"
    
    response = ssm.send_command(
        InstanceIds=[instance_id],
        DocumentName="AWS-RunShellScript",
        Parameters={
            'commands': [script_path]
        },
    )
    
    return response

EC2インスタンスに直接SSHしてスクリプトを実行

Lambda関数に必要なライブラリをインストール
paramikoなどのSSHライブラリを使用します。これは、Lambda環境にこれらのライブラリをインストールする必要があることを意味します。

EC2インスタンスにSSHキーを配置
Lambda関数がEC2インスタンスにSSHできるように、必要なSSHキーをLambda関数内に配置します。

Lambda関数からSSH接続してスクリプトを実行
以下はその例です。

import paramiko

def lambda_handler(event, context):
    # SSH接続情報
    host = "ec2-xx-xx-xx-xx.compute-1.amazonaws.com"
    username = "ec2-user"
    key_file_path = "/path/to/your/private-key.pem"
    
    # SSHクライアントの初期化
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    
    # 秘密鍵の読み込み
    key = paramiko.RSAKey.from_private_key_file(key_file_path)
    
    # 接続
    ssh.connect(hostname=host, username=username, pkey=key)
    
    # コマンドの実行
    stdin, stdout, stderr = ssh.exec_command("/path/to/your/script.sh")
    
    # 結果の取得
    result = stdout.read()
    
    # 接続のクローズ
    ssh.close()
    
    return result
スポンサーリンク
タイトルとURLをコピーしました