簡體   English   中英

RDS 上的 Postgres 13 pg_cron 錯誤很難追蹤

[英]Postgres 13 pg_cron error on RDS that's hard to track down

pg_cron 作業全部失敗,並顯示“...的角色不提供安排作業的權限”

我正在努力在 RDS 上設置pg_partmanpg_cron ,但是當我的pg_cron作業運行時,它們返回此錯誤:

ERROR: The protected role of rds_super doesn't provide permission to schedule a job.

從錯誤文本來看,我似乎在保存pg_cron的目錄或資源中遺漏了一個簡單的權限問題,但我找不到問題的根源。 而且,它可能是別的東西。 大量的谷歌搜索、尋找來源和反復試驗都沒有讓我得到任何答案,我希望得到幫助。

作為背景,這是帶有pg_cron 1.3 的 Postgres 13.4。 這些是 RDS 上現在可用的最新版本。 我的目標是讓pg_cron在該集群的各種數據庫中運行作業,但我已將問題示例簡化為postgrescron模式。

RDS 定義了一個名為rds_superuser的角色,該角色沒有登錄名,然后您可以將其授予其他用戶。 我們正在使用名為rds_super的自定義角色,並且已經使用了多年。

當您在 RDS 上create extension pg_cron時,默認情況下安裝到postgres數據庫中,並創建一個名為cron的新架構。 這一切都很好。 作為問題的“hello world”版本,這里有一個簡單的表格和任務,用於將每分鍾的當前時間插入到文本字段中。

DROP TABLE IF EXISTS cron.foo;

CREATE TABLE IF NOT EXISTS cron.foo (
    bar text
);

GRANT INSERT ON TABLE cron.foo TO rds_super;

INSERT INTO cron.foo VALUES (now()::text);

select * from cron.foo;

-- Run every minute
SELECT cron.schedule('postgres.populate.foo','*/1 * * * *',
$$INSERT INTO cron.foo VALUES (now()::text) $$);

當直接作為rds_super用戶連接時,裸語句INSERT INTO cron.foo VALUES (now()::text)工作正常。 但是當它通過cron.job定義的cron.job執行時, cron.job_run_details輸出有正確的代碼,預期的用戶,但失敗的結果是這個錯誤:

ERROR: The protected role of rds_super doesn't provide permission to schedule a job.

這是否為任何人敲響了警鍾? 我已經刪除,重新安裝,明確設置權限。 沒提升。

民眾

這可能會關閉,但我遇到了一些事情,看起來我需要提供對public訪問。 我從 PG 9.4 或 9.5 開始,無法確保公眾的安全……並在任何地方剝奪了它的所有權利。 這里可能需要放回一些?

權限檢查

以下是我能想到的權限檢查。

select grantor,
       grantee,
       table_schema,
       table_name,
       string_agg (privilege_type, ',' order by privilege_type) as grants

  from information_schema.role_table_grants
where table_catalog = 'postgres'
  and table_schema  = 'cron'
  and grantee       = 'rds_super'

group by 1,2,3,4

order by 1,2,3,4;

我給了用戶所有表的所有權限,只是為了看看是否可以解決問題。 沒有喜悅。

grantor          grantee     table_schema  table_name             grants
rds_super        rds_super   cron          foo                    DELETE,INSERT,REFERENCES,SELECT,TRIGGER,TRUNCATE,UPDATE
rds_super        rds_super   cron          job_run_details_plus   DELETE,INSERT,REFERENCES,SELECT,TRIGGER,TRUNCATE,UPDATE
rds_superuser    rds_super   cron          job                    DELETE,INSERT,REFERENCES,SELECT,TRIGGER,TRUNCATE,UPDATE
rds_superuser    rds_super   cron          job_run_details        DELETE,INSERT,REFERENCES,SELECT,TRIGGER,TRUNCATE,UPDATE

架構權限沒有明顯錯誤:

select pg_catalog.has_schema_privilege('rds_super', 'cron', 'CREATE') AS create,
       pg_catalog.has_schema_privilege('rds_super', 'cron', 'USAGE')  AS usage;

create  usage
t       t

同樣,當我檢查函數執行權限時,什么也沒有彈出:

   select proname, proargnames
     from pg_proc
    where has_function_privilege('rds_super',oid,'execute')
      and pronamespace::regnamespace::text = 'cron'
order by 1,2


proname                  proargnames
job_cache_invalidate
schedule                 {job_name,schedule,command}
schedule                 {schedule,command}
unschedule               {job_id}
unschedule               {job_name}

回答

我不知道這是否答案,但它似乎解決了我的問題。 劇透:以pg_cron scheduler后台工作程序運行的用戶pg_cron scheduler登錄。

我燒掉了所有東西並重新啟動,然后發現我的工作根本無法運行。 沒有錯誤,沒有結果。 我像這樣檢查了后台工作人員的狀態:

 select application_name,
        usename,
        backend_type,
        query,
        state,
        wait_event_type,
        age(now(),backend_start) as backend_start_age,
        age(now(),query_start)  as query_start_age,
        age(now(),state_change) state_change_age

  from pg_stat_activity
 where backend_type != 'client backend';

我注意到后台工作人員已經運行了一天多(它作為共享庫加載),並且似乎卡住了。 我重新啟動了服務器,並重新以dbadmin身份登錄的所有內容,而不是我的自定義用戶。 在這種情況下,這是pg_cron scheduler程序進程正在運行的用戶名。 我不記得dbadmin是否是 RDS Postgres 軟件包的一部分,或者它是否是我多年前添加的內容。 RDS pg_cron說明中沒有關於此的任何內容,所以也許只有我。 我需要稍微設置一下它的search_path和權限,以使一切都按我需要的方式工作,但這很正常。

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/PostgreSQL_pg_cron.html

至少在我的情況下,答案是以與pg_cron后台線程相同的用戶身份運行作業。 我已經在原始問題的末尾發布了更多詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM