AWS SCT 拡張パックを使用して PostgreSQL で SQL Server エージェントをエミュレートする
SQL Server エージェントは、SQL Server ジョブを実行する Microsoft Windows サービスです。SQL Server エージェントは、スケジュールに従って、特定のイベントに応答して、またはオンデマンドでジョブを実行します。SQL Server エージェントの詳細については、『Microsoft 技術ドキュメント
PostgreSQL には、SQL Server エージェントに相当するものはありません。SQL Server エージェントの機能をエミュレートするために、AWS SCT は拡張パックを作成します。この拡張パックは AWS Lambda と Amazon CloudWatch を使用しています。AWS Lambda は、スケジュールの管理やジョブの実行に使用するインターフェイスを実装します。Amazon CloudWatch はスケジュールルールを管理します。
AWS Lambda と Amazon CloudWatch は JSON パラメータを使用してやり取りします。この JSON パラメータには次の構造があります。
{ "mode":
mode
, "parameters": {list of parameters
}, "callback":procedure name
}
前の例では、
はタスクのタイプであり、mode
はタスクのタイプによって決まるパラメータのセットです。また、list of parameters
は、タスクが完了した後に実行されるプロシージャの名前でもあります。procedure name
AWS SCT は 1 つの Lambda 関数を使用してジョブの制御と実行を行います。CloudWatch ルールはジョブの実行を開始し、ジョブを開始するために必要な情報を提供します。CloudWatch ルールがトリガーされると、ルールのパラメータを使用して Lambda 関数が開始されます。
プロシージャを呼び出す簡単なジョブを作成するには、次の形式を使用します。
{ "mode": "run_job", "parameters": { "vendor": "mysql", "cmd": "lambda_db.nightly_job" } }
複数のステップを含むジョブを作成するには、次の形式を使用します。
{ "mode": "run_job", "parameters": { "job_name": "Job1", "enabled": "true", "start_step_id": 1, "notify_level_email": [0|1|2|3], "notify_email": email, "delete_level": [0|1|2|3], "job_callback": "ProcCallBackJob(job_name, code, message)", "step_callback": "ProcCallBackStep(job_name, step_id, code, message)" }, "steps": [ { "id":1, "cmd": "ProcStep1", "cmdexec_success_code": 0, "on_success_action": [|2|3|4], "on_success_step_id": 1, "on_fail_action": 0, "on_fail_step_id": 0, "retry_attempts": number, "retry_interval": number }, { "id":2, "cmd": "ProcStep2", "cmdexec_success_code": 0, "on_success_action": [1|2|3|4], "on_success_step_id": 0, "on_fail_action": 0, "on_fail_step_id": 0, "retry_attempts": number, "retry_interval": number }, ... ] }
PostgreSQL での SQL Server エージェントの動作をエミュレートするために、AWS SCT 拡張パックでは以下のテーブルとプロシージャも作成します。
PostgreSQL で SQL Server エージェントをエミュレートするテーブル
SQL Server エージェントをエミュレートするために、拡張パックは次のテーブルを使用します。
- sysjobs
ジョブに関する情報を格納します。
- sysjobsteps
ジョブのステップに関する情報を格納します。
- sysschedules
ジョブスケジュールに関する情報を格納します。
- sysjobschedules
個々のジョブのスケジュール情報を格納します。
- sysjobhistory
スケジュールされたジョブの実行に関する情報を格納します。
PostgreSQL で SQL Server エージェントをエミュレートするプロシージャ
SQL Server エージェントをエミュレートするために、拡張パックでは以下の手順を使用します。
- sp_add_job
新しいジョブを追加します。
- sp_add_jobstep
ジョブにステップを追加します。
- sp_add_schedule
Amazon CloudWatch に新しいスケジュールルールを作成します。このスケジュールは任意の数のジョブで使用できます。
- sp_attach_schedule
選択したジョブのスケジュールを設定します。
- sp_add_jobschedule
Amazon CloudWatch でジョブのスケジュールルールを作成し、このルールのターゲットを設定します。
- sp_update_job
以前に作成したジョブの属性を更新します。
- sp_update_jobstep
ジョブ内のステップの属性を更新します。
- sp_update_schedule
Amazon CloudWatch のスケジュールルールの属性を更新します。
- sp_update_jobschedule
指定ジョブのスケジュールの属性を更新します。
- sp_delete_job
ジョブを削除します。
- sp_delete_jobstep
ジョブからジョブステップを削除します。
- sp_delete_schedule
スケジュールを削除します。
- sp_delete_jobschedule
指定されたジョブのスケジュールルールを Amazon CloudWatch から削除します。
- sp_detach_schedule
スケジュールとジョブの関連付けを削除します。
- get_jobs、update_job
AWS Elastic Beanstalk と相互作用する内部プロシージャ。
- sp_verify_job_date、sp_verify_job_time、sp_verify_job、sp_verify_jobstep、sp_verify_schedule、sp_verify_job_identifier、sp_verify_schedule_identifiers
設定を確認する内部プロシージャ。
PostgreSQL で SQL サーバーエージェントをエミュレートするプロシージャの構文
拡張パック内の aws_sqlserver_ext.sp_add_job
プロシージャは、msdb.dbo.sp_add_job
プロシージャをエミュレートします。SQL Server エージェントプロシージャの詳細については、『Microsoft 技術ドキュメント
par_job_name varchar, par_enabled smallint = 1, par_description varchar = NULL::character varying, par_start_step_id integer = 1, par_category_name varchar = NULL::character varying, par_category_id integer = NULL::integer, par_owner_login_name varchar = NULL::character varying, par_notify_level_eventlog integer = 2, par_notify_level_email integer = 0, par_notify_level_netsend integer = 0, par_notify_level_page integer = 0, par_notify_email_operator_name varchar = NULL::character varying, par_notify_netsend_operator_name varchar = NULL::character varying, par_notify_page_operator_name varchar = NULL::character varying, par_delete_level integer = 0, inout par_job_id integer = NULL::integer, par_originating_server varchar = NULL::character varying, out returncode integer
拡張パック内の aws_sqlserver_ext.sp_add_jobstep
プロシージャは、msdb.dbo.sp_add_jobstep
プロシージャをエミュレートします。SQL Server エージェントプロシージャの詳細については、『Microsoft 技術ドキュメント
par_job_id integer = NULL::integer, par_job_name varchar = NULL::character varying, par_step_id integer = NULL::integer, par_step_name varchar = NULL::character varying, par_subsystem varchar = 'TSQL'::bpchar, par_command text = NULL::text, par_additional_parameters text = NULL::text, par_cmdexec_success_code integer = 0, par_on_success_action smallint = 1, par_on_success_step_id integer = 0, par_on_fail_action smallint = 2, par_on_fail_step_id integer = 0, par_server varchar = NULL::character varying, par_database_name varchar = NULL::character varying, par_database_user_name varchar = NULL::character varying, par_retry_attempts integer = 0, par_retry_interval integer = 0, par_os_run_priority integer = 0, par_output_file_name varchar = NULL::character varying, par_flags integer = 0, par_proxy_id integer = NULL::integer, par_proxy_name varchar = NULL::character varying, inout par_step_uid char = NULL::bpchar, out returncode integer
拡張パック内の aws_sqlserver_ext.sp_add_schedule
プロシージャは、msdb.dbo.sp_add_schedule
プロシージャをエミュレートします。SQL Server エージェントプロシージャの詳細については、『Microsoft 技術ドキュメント
par_schedule_name varchar, par_enabled smallint = 1, par_freq_type integer = 0, par_freq_interval integer = 0, par_freq_subday_type integer = 0, par_freq_subday_interval integer = 0, par_freq_relative_interval integer = 0, par_freq_recurrence_factor integer = 0, par_active_start_date integer = NULL::integer, par_active_end_date integer = 99991231, par_active_start_time integer = 0, par_active_end_time integer = 235959, par_owner_login_name varchar = NULL::character varying, *inout par_schedule_uid char = NULL::bpchar,* inout par_schedule_id integer = NULL::integer, par_originating_server varchar = NULL::character varying, out returncode integer
拡張パック内の aws_sqlserver_ext.sp_attach_schedule
プロシージャは、msdb.dbo.sp_attach_schedule
プロシージャをエミュレートします。SQL Server エージェントプロシージャの詳細については、『Microsoft 技術ドキュメント
par_job_id integer = NULL::integer, par_job_name varchar = NULL::character varying, par_schedule_id integer = NULL::integer, par_schedule_name varchar = NULL::character varying, par_automatic_post smallint = 1, out returncode integer
拡張パック内の aws_sqlserver_ext.sp_add_jobschedule
プロシージャは、msdb.dbo.sp_add_jobschedule
プロシージャをエミュレートします。SQL Server エージェントプロシージャの詳細については、『Microsoft 技術ドキュメント
par_job_id integer = NULL::integer, par_job_name varchar = NULL::character varying, par_name varchar = NULL::character varying, par_enabled smallint = 1, par_freq_type integer = 1, par_freq_interval integer = 0, par_freq_subday_type integer = 0, par_freq_subday_interval integer = 0, par_freq_relative_interval integer = 0, par_freq_recurrence_factor integer = 0, par_active_start_date integer = NULL::integer, par_active_end_date integer = 99991231, par_active_start_time integer = 0, par_active_end_time integer = 235959, inout par_schedule_id integer = NULL::integer, par_automatic_post smallint = 1, inout par_schedule_uid char = NULL::bpchar, out returncode integer
拡張パック内の aws_sqlserver_ext.sp_delete_job
プロシージャは、msdb.dbo.sp_delete_job
プロシージャをエミュレートします。SQL Server エージェントプロシージャの詳細については、『Microsoft 技術ドキュメント
par_job_id integer = NULL::integer, par_job_name varchar = NULL::character varying, par_originating_server varchar = NULL::character varying, par_delete_history smallint = 1, par_delete_unused_schedule smallint = 1, out returncode integer
拡張パック内の aws_sqlserver_ext.sp_delete_jobstep
プロシージャは、msdb.dbo.sp_delete_jobstep
プロシージャをエミュレートします。SQL Server エージェントプロシージャの詳細については、『Microsoft 技術ドキュメント
par_job_id integer = NULL::integer, par_job_name varchar = NULL::character varying, par_step_id integer = NULL::integer, out returncode integer
拡張パック内の aws_sqlserver_ext.sp_delete_jobschedule
プロシージャは、msdb.dbo.sp_delete_jobschedule
プロシージャをエミュレートします。SQL Server エージェントプロシージャの詳細については、『Microsoft 技術ドキュメント
par_job_id integer = NULL::integer, par_job_name varchar = NULL::character varying, par_name varchar = NULL::character varying, par_keep_schedule integer = 0, par_automatic_post smallint = 1, out returncode integer
拡張パック内の aws_sqlserver_ext.sp_delete_schedule
プロシージャは、msdb.dbo.sp_delete_schedule
プロシージャをエミュレートします。SQL Server エージェントプロシージャの詳細については、『Microsoft 技術ドキュメント
par_schedule_id integer = NULL::integer, par_schedule_name varchar = NULL::character varying, par_force_delete smallint = 0, par_automatic_post smallint = 1, out returncode integer
拡張パック内の aws_sqlserver_ext.sp_detach_schedule
プロシージャは、msdb.dbo.sp_detach_schedule
プロシージャをエミュレートします。SQL Server エージェントプロシージャの詳細については、『Microsoft 技術ドキュメント
par_job_id integer = NULL::integer, par_job_name varchar = NULL::character varying, par_schedule_id integer = NULL::integer, par_schedule_name varchar = NULL::character varying, par_delete_unused_schedule smallint = 0, par_automatic_post smallint = 1, out returncode integer
拡張パック内の aws_sqlserver_ext.sp_update_job
プロシージャは、msdb.dbo.sp_update_job
プロシージャをエミュレートします。SQL Server エージェントプロシージャの詳細については、『Microsoft 技術ドキュメント
par_job_id integer = NULL::integer par_job_name varchar = NULL::character varying par_new_name varchar = NULL::character varying par_enabled smallint = NULL::smallint par_description varchar = NULL::character varying par_start_step_id integer = NULL::integer par_category_name varchar = NULL::character varying par_owner_login_name varchar = NULL::character varying par_notify_level_eventlog integer = NULL::integer par_notify_level_email integer = NULL::integer par_notify_level_netsend integer = NULL::integer par_notify_level_page integer = NULL::integer par_notify_email_operator_name varchar = NULL::character varying par_notify_netsend_operator_name varchar = NULL::character varying par_notify_page_operator_name varchar = NULL::character varying par_delete_level integer = NULL::integer par_automatic_post smallint = 1 out returncode integer
拡張パック内の aws_sqlserver_ext.sp_update_jobschedule
プロシージャは、msdb.dbo.sp_update_jobschedule
プロシージャをエミュレートします。SQL Server エージェントプロシージャの詳細については、『Microsoft 技術ドキュメント
par_job_id integer = NULL::integer par_job_name varchar = NULL::character varying par_name varchar = NULL::character varying par_new_name varchar = NULL::character varying par_enabled smallint = NULL::smallint par_freq_type integer = NULL::integer par_freq_interval integer = NULL::integer par_freq_subday_type integer = NULL::integer par_freq_subday_interval integer = NULL::integer par_freq_relative_interval integer = NULL::integer par_freq_recurrence_factor integer = NULL::integer par_active_start_date integer = NULL::integer par_active_end_date integer = NULL::integer par_active_start_time integer = NULL::integer par_active_end_time integer = NULL::integer par_automatic_post smallint = 1 out returncode integer
拡張パック内の aws_sqlserver_ext.sp_update_jobstep
プロシージャは、msdb.dbo.sp_update_jobstep
プロシージャをエミュレートします。SQL Server エージェントプロシージャの詳細については、『Microsoft 技術ドキュメント
par_job_id integer = NULL::integer par_job_name varchar = NULL::character varying par_step_id integer = NULL::integer par_step_name varchar = NULL::character varying par_subsystem varchar = NULL::character varying par_command text = NULL::text par_additional_parameters text = NULL::text par_cmdexec_success_code integer = NULL::integer par_on_success_action smallint = NULL::smallint par_on_success_step_id integer = NULL::integer par_on_fail_action smallint = NULL::smallint par_on_fail_step_id integer = NULL::integer par_server varchar = NULL::character varying par_database_name varchar = NULL::character varying par_database_user_name varchar = NULL::character varying par_retry_attempts integer = NULL::integer par_retry_interval integer = NULL::integer par_os_run_priority integer = NULL::integer par_output_file_name varchar = NULL::character varying par_flags integer = NULL::integer par_proxy_id integer = NULL::integer par_proxy_name varchar = NULL::character varying out returncode integer
拡張パック内の aws_sqlserver_ext.sp_update_schedule
プロシージャは、msdb.dbo.sp_update_schedule
プロシージャをエミュレートします。SQL Server エージェントプロシージャの詳細については、『Microsoft 技術ドキュメント
par_schedule_id integer = NULL::integer par_name varchar = NULL::character varying par_new_name varchar = NULL::character varying par_enabled smallint = NULL::smallint par_freq_type integer = NULL::integer par_freq_interval integer = NULL::integer par_freq_subday_type integer = NULL::integer par_freq_subday_interval integer = NULL::integer par_freq_relative_interval integer = NULL::integer par_freq_recurrence_factor integer = NULL::integer par_active_start_date integer = NULL::integer par_active_end_date integer = NULL::integer par_active_start_time integer = NULL::integer par_active_end_time integer = NULL::integer par_owner_login_name varchar = NULL::character varying par_automatic_post smallint = 1 out returncode integer
PostgreSQL で SQL Server エージェントをエミュレートするプロシージャを使用する場合の例
新しいジョブを追加するには、次に示す aws_sqlserver_ext.sp_add_job
プロシージャに従います。
SELECT * FROM aws_sqlserver_ext.sp_add_job ( par_job_name := 'test_job', par_enabled := 1::smallint, par_start_step_id := 1::integer, par_category_name := '[Uncategorized (Local)]', par_owner_login_name := 'sa');
新しいジョブステップを追加するには、次に示す aws_sqlserver_ext.sp_add_jobstep
プロシージャに従います。
SELECT * FROM aws_sqlserver_ext.sp_add_jobstep ( par_job_name := 'test_job', par_step_id := 1::smallint, par_step_name := 'test_job_step1', par_subsystem := 'TSQL', par_command := 'EXECUTE [dbo].[PROC_TEST_JOB_STEP1];', par_server := NULL, par_database_name := 'GOLD_TEST_SS');
簡単なスケジュールを追加するには、次に示す aws_sqlserver_ext.sp_add_schedule
プロシージャに従います。
SELECT * FROM aws_sqlserver_ext.sp_add_schedule( par_schedule_name := 'RunOnce', par_freq_type := 1, par_active_start_time := 233000);
ジョブのスケジュールを設定するには、次に示す aws_sqlserver_ext.sp_attach_schedule
プロシージャに従います。
SELECT * FROM aws_sqlserver_ext.sp_attach_schedule ( par_job_name := 'test_job', par_schedule_name := 'NightlyJobs');
ジョブのスケジュールを作成するには、次に示す aws_sqlserver_ext.sp_add_jobschedule
プロシージャに従います。
SELECT * FROM aws_sqlserver_ext.sp_add_jobschedule ( par_job_name := 'test_job2', par_name := 'test_schedule2', par_enabled := 1::smallint, par_freq_type := 4, par_freq_interval := 1, par_freq_subday_type := 4, par_freq_subday_interval := 1, par_freq_relative_interval := 0, par_freq_recurrence_factor := 0, par_active_start_date := 20100801, par_active_end_date := 99991231, par_active_start_time := 0, par_active_end_time := 0);
PostgreSQL で SQL サーバーエージェントをエミュレートするためのユースケースの例
ソースデータベースコードで SQL Server エージェントを使用してジョブを実行している場合、AWS SCT はSQL Server から PostgreSQL への拡張パックを使用して、このコードを PostgreSQL に変換できます。拡張パックは AWS Lambda 関数を使用して SQL Server エージェントの動作をエミュレートします。
新しい AWS Lambda 関数を作成するか、既存の関数を登録できます。
新しい AWS Lambda 関数を作成するには
-
AWS SCT のターゲットデータベースのツリーで、コンテキスト (右クリック) メニューを開き、[次に拡張パックの適用] () を選択して、[PostgreSQL] を選択します。
拡張パックウィザードが表示されます。
-
[SQL Server エージェントエミュレーションサービス] タブで、次の操作を行います。
-
[AWS Lambda 関数の作成] を選択します。
-
[データベースログイン] には、ターゲットデータベースユーザーの名前を入力します。
-
[データベースパスワード] には、前のステップで入力したユーザー名のパスワードを入力します。
-
[Python ライブラリフォルダ] には、Python ライブラリフォルダへのパスを入力します。
-
[AWS Lambda 関数の作成] を選択し、[次へ] を選択します。
-
以前にデプロイした AWS Lambda 関数を登録するには
-
ターゲットデータベースで次のスクリプトを実行します。
SELECT FROM aws_sqlserver_ext.set_service_setting( p_service := 'JOB', p_setting := 'LAMBDA_ARN', p_value :=
ARN
)前述の例では、
はデプロイされた AWS Lambda 関数の Amazon リソースネーム (ARN) です。ARN
次の例では、1 つのステップで構成されるシンプルなタスクを作成します。このタスクでは、5 分ごとに以前に作成された job_example
関数が実行されます。この job_example_table
関数はレコードをテーブルに挿入します。
この簡単なタスクを作成するには
-
以下の
aws_sqlserver_ext.sp_add_job
関数を使用してジョブを作成します。SELECT FROM aws_sqlserver_ext.sp_add_job ( par_job_name := 'test_simple_job');
-
次に示す
aws_sqlserver_ext.sp_add_jobstep
関数を使用してジョブステップを作成します。SELECT FROM aws_sqlserver_ext.sp_add_jobstep ( par_job_name := 'test_simple_job', par_step_name := 'test_simple_job_step1', par_command := 'PERFORM job_simple_example;');
ジョブステップは関数の実行内容を指定します。
-
次に示すように、
aws_sqlserver_ext.sp_add_jobschedule
関数を使用してジョブのスケジューラーを作成します。SELECT FROM aws_sqlserver_ext.sp_add_jobschedule ( par_job_name := 'test_simple_job', par_name := 'test_schedule', par_freq_type := 4, /* Daily */ par_freq_interval := 1, /* frequency_interval is unused */ par_freq_subday_type := 4, /* Minutes */ par_freq_subday_interval := 5 /* 5 minutes */);
ジョブステップは関数の実行内容を指定します。
このジョブを削除するには、以下の aws_sqlserver_ext.sp_delete_job
関数を使用します。
PERFORM aws_sqlserver_ext.sp_delete_job( par_job_name := 'PeriodicJob1'::character varying, par_delete_history := 1::smallint, par_delete_unused_schedule := 1::smallint);