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