{"id":7652,"date":"2026-02-25T16:55:42","date_gmt":"2026-02-25T07:55:42","guid":{"rendered":"https:\/\/blog.since2020.jp\/?p=7652"},"modified":"2026-02-25T17:01:23","modified_gmt":"2026-02-25T08:01:23","slug":"databricks-apps-user-access","status":"publish","type":"post","link":"https:\/\/since2020.jp\/media\/databricks-apps-user-access\/","title":{"rendered":"Databricks Apps \u3067\u30e6\u30fc\u30b6\u30fc\u5358\u4f4d\u306e\u30a2\u30af\u30bb\u30b9\u5236\u5fa1\u3092\u5b9f\u73fe"},"content":{"rendered":"\n<p>Databricks Apps\u3067\u30e6\u30fc\u30b6\u30fc\u5358\u4f4d\u306e\u30a2\u30af\u30bb\u30b9\u5236\u5fa1\u3092\u5b9f\u88c5\u3002\u30c8\u30fc\u30af\u30f3\u53d6\u5f97\u304b\u3089SDK\u5b9f\u884c\u307e\u3067\u89e3\u8aac\u3002<\/p>\n\n\n<h2>\u306f\u3058\u3081\u306b<\/h2>\n<p>Databricks Apps \u3092\u4f7f\u3063\u305f\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u958b\u767a\u306b\u304a\u3044\u3066\u3001\u30e6\u30fc\u30b6\u30fc\u3054\u3068\u306b\u7570\u306a\u308b\u30c7\u30fc\u30bf\u30a2\u30af\u30bb\u30b9\u6a29\u9650\u3092\u9069\u7528\u3057\u305f\u3044\u30b1\u30fc\u30b9\u306f\u591a\u3044\u3067\u3057\u3087\u3046\u3002\u672c\u8a18\u4e8b\u3067\u306f\u3001Databricks Apps \u3067\u30e6\u30fc\u30b6\u30fc\u30c8\u30fc\u30af\u30f3\u3092\u53d6\u5f97\u3057\u3001Unity Catalog \u3084 Genie Space \u3078\u306e\u30a2\u30af\u30bb\u30b9\u5236\u5fa1\u3092\u4e00\u6c17\u901a\u8cab\u3067\u5b9f\u88c5\u3059\u308b\u65b9\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<!-- notionvc: d3c69814-8a62-4d06-b481-9ad72ff37e1b --><\/p>\n\n<h2>\u4e8b\u524d\u8a2d\u5b9a<\/h2>\n<b>1. \u30a2\u30d7\u30ea\u3067\u306e\u30e6\u30fc\u30b6\u30fc\u6a29\u9650\u8a2d\u5b9a<\/b>\r\n<p>\u307e\u305a\u3001Databricks Apps \u3067\u30e6\u30fc\u30b6\u30fc\u8a8d\u8a3c\u3092\u6709\u52b9\u5316\u3057\u307e\u3059\u3002<\/p>\r\n<p><strong>Compute &gt; Apps &gt; \u5bfe\u8c61\u306e\u30a2\u30d7\u30ea &gt; Edit &gt; Configure resources<\/strong> \u304b\u3089 <strong>User authorization<\/strong>\u304b\u3089Add scope\u3088\u308a\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u8a2d\u5b9a\u3057\u307e\u3059\u3002<\/p>\r\n<p><img decoding=\"async\" src=\"https:\/\/since2020.jp\/media\/wp-content\/uploads\/2026\/02\/image-1-300x214.png\" alt=\"\" width=\"300\" height=\"214\" class=\"alignnone size-medium wp-image-7674\" srcset=\"https:\/\/since2020.jp\/media\/wp-content\/uploads\/2026\/02\/image-1-300x214.png 300w, https:\/\/since2020.jp\/media\/wp-content\/uploads\/2026\/02\/image-1.png 590w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/p>\r\n<p><!-- notionvc: 85d9fe1b-a577-4384-944d-86dd7eaf9042 --><\/p>\r\n<p>&nbsp;<\/p>\r\n<p><span data-token-index=\"0\" class=\"notion-enable-hover\">\u91cd\u8981<\/span>: User authorization \u304c <span data-token-index=\"2\" class=\"notion-enable-hover\">Preview<\/span> \u30e2\u30fc\u30c9\u306b\u306a\u3063\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u6709\u52b9\u306b\u306a\u3063\u3066\u3044\u306a\u3044\u5834\u5408\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u8a2d\u5b9a\u304b\u3089 Previews \u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u30c8\u30b0\u30eb\u3092 ON \u306b\u3057\u307e\u3059\u3002<!-- notionvc: 6aa4f04e-a9ea-4363-b7ae-f3e96c734163 --><\/p>\r\n<p><img decoding=\"async\" src=\"https:\/\/since2020.jp\/media\/wp-content\/uploads\/2026\/02\/image-2-1-300x132.png\" alt=\"\" width=\"300\" height=\"132\" class=\"alignnone size-medium wp-image-7675\" srcset=\"https:\/\/since2020.jp\/media\/wp-content\/uploads\/2026\/02\/image-2-1-300x132.png 300w, https:\/\/since2020.jp\/media\/wp-content\/uploads\/2026\/02\/image-2-1.png 688w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/p>\r\n<b>2. Genie Space \u3078\u306e\u6a29\u9650\u4ed8\u4e0e<\/b>\r\n<p>\u63a5\u7d9a\u3059\u308b Genie Space \u306b\u5bfe\u3057\u3066\u3001\u30e6\u30fc\u30b6\u30fc\u304c <strong>Run \u4ee5\u4e0a\u306e\u6a29\u9650<\/strong> \u3092\u6301\u3063\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002Genie Space \u306e Share \u30dc\u30bf\u30f3\u304b\u3089\u6a29\u9650\u8a2d\u5b9a\u3092\u78ba\u8a8d\u3067\u304d\u307e\u3059\u3002<\/p>\r\n<p><!-- notionvc: 0b430466-8f07-480b-8992-8a4d3f4ce922 --><\/p>\r\n<p><img decoding=\"async\" src=\"https:\/\/since2020.jp\/media\/wp-content\/uploads\/2026\/02\/8B9D57F7-4209-4A89-BB6C-15B8CC142D8C-300x177.png\" alt=\"\" width=\"300\" height=\"177\" class=\"alignnone size-medium wp-image-7676\" srcset=\"https:\/\/since2020.jp\/media\/wp-content\/uploads\/2026\/02\/8B9D57F7-4209-4A89-BB6C-15B8CC142D8C-300x177.png 300w, https:\/\/since2020.jp\/media\/wp-content\/uploads\/2026\/02\/8B9D57F7-4209-4A89-BB6C-15B8CC142D8C-768x454.png 768w, https:\/\/since2020.jp\/media\/wp-content\/uploads\/2026\/02\/8B9D57F7-4209-4A89-BB6C-15B8CC142D8C.png 862w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/p>\r\n<p>\u30a2\u30d7\u30ea\u3068 Genie Space \u3092\u63a5\u7d9a\u3059\u308b\u305f\u3081\u3001<\/p>\r\n<div><span data-token-index=\"1\">app.yaml<\/span><\/div>\r\n<p>\u306b Genie Space ID \u3092\u5b9a\u7fa9\u3057\u3066\u304a\u304d\u307e\u3059\u3002<!-- notionvc: a9ddf7f8-6163-4f8d-b421-a3b4e4ad0b54 --><\/p>\r\n<div class=\"hcb_wrap\">\r\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>command: ['streamlit', 'run', 'app.py'] \r\n\r\nenv: \r\n  - name: 'GENIE_SPACE_ID' \r\n    valueFrom: 'genie_space_id'\r\n  - name: 'GENIE_DYNAMIC_META'\r\n    valueFrom: 'genie_dynamic_meta' \r\n  - name: 'OPENAI_API_KEY' \r\n    valueFrom: 'openai-api-key'\r\n  - name: 'GEMINI_API_KEY' \r\n    valueFrom: 'gemini-api-key'\r\n  - name: 'DATABRICKS_WAREHOUSE_ID' \r\n    valueFrom: 'sql-warehouse' \r\n  - name: 'STREAMLIT_GATHER_USAGE_STATS' \r\n    value: 'false'<\/code><\/pre>\r\n<\/div>\r\n<b>3. Unity Catalog \u3078\u306e\u6a29\u9650\u4ed8\u4e0e<\/b>\r\n<p>\u30e6\u30fc\u30b6\u30fc\u304c\u53c2\u7167\u3057\u305f\u3044\u30ab\u30bf\u30ed\u30b0\u3001\u30b9\u30ad\u30fc\u30de\u3001\u30c6\u30fc\u30d6\u30eb\u306b\u5bfe\u3057\u3066\u9069\u5207\u306a\u6a29\u9650\uff08USE CATALOG\u3001USE SCHEMA\u3001SELECT \u306a\u3069\uff09\u304c\u4ed8\u4e0e\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/p>\r\n<p><!-- notionvc: 9a6e8a04-debe-45c3-9310-0c13619e23af --><\/p>\n\n<h2>\u5b9f\u88c5\u306e\u6d41\u308c<\/h2>\n<b>\u30b9\u30c6\u30c3\u30d71: \u30e6\u30fc\u30b6\u30fc\u30c8\u30fc\u30af\u30f3\u306e\u53d6\u5f97<\/b>\r\n<p>Streamlit \u306e\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u304b\u3089\u3001\u30e6\u30fc\u30b6\u30fc\u304c\u30a2\u30af\u30bb\u30b9\u3057\u305f\u969b\u3001\u30ea\u30af\u30a8\u30b9\u30c8\u30d8\u30c3\u30c0\u30fc(<code>x-forwarded-access-token<\/code>)\u304b\u3089\u30c8\u30fc\u30af\u30f3\u3092\u53d6\u5f97\u3057\u307e\u3059\u3002<\/p>\r\n<p><!-- notionvc: f4905952-e443-4a7b-9bb3-8c935880bda5 --><\/p>\r\n<div class=\"hcb_wrap\">\r\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>user_token = None \r\nif hasattr(st, \"context\") and st.context.headers is not None: \r\n\u3000\u3000\u3000user_token = st.context.headers.get(\"x-forwarded-access-token\") <!-- --><!-- notionvc: f68d2931-dcd4-48ad-81d5-ff4ae0c181e9 --><\/code><\/pre>\r\n<b>\u30b9\u30c6\u30c3\u30d72: \u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u521d\u671f\u72b6\u614b\u3078\u306e\u4fdd\u5b58<\/b>\r\n<p>\u53d6\u5f97\u3057\u305f\u30c8\u30fc\u30af\u30f3\u3092\u3001\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u306e\u72b6\u614b\u7ba1\u7406\uff08<code>state<\/code>\uff09\u306b\u4fdd\u5b58\u3057\u307e\u3059\u3002\u3053\u308c\u306b\u3088\u308a\u3001\u3059\u3079\u3066\u306e\u30b5\u30d6\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u304c\u540c\u3058\u30c8\u30fc\u30af\u30f3\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\r\n<p><!-- notionvc: f9f67cec-0763-4e52-8f5a-a9a691169036 --><\/p>\r\n<div class=\"hcb_wrap\">\r\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>state = { <span data-token-index=\"1\" class=\"notion-enable-hover\">\r\n<\/span>\u3000\u3000\u3000\u3000\u3000\u3000\"user_input\": user_input, \r\n\u3000\u3000\u3000\u3000\u3000\u3000\"chat_history\": chat_history, \r\n\u3000\u3000\u3000\u3000\u3000\u3000\"user_access_token\": user_token, # &lt;--- State\u306b\u4fdd\u5b58 }<\/code><\/pre>\r\n<\/div>\r\n<b>\u30b9\u30c6\u30c3\u30d73: \u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3067\u306e\u30c8\u30fc\u30af\u30f3\u5229\u7528<\/b>\r\n<p>\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3067 <code>state<\/code> \u304b\u3089\u30c8\u30fc\u30af\u30f3\u3092\u53d6\u308a\u51fa\u3057\u3001Databricks SDK \u306e\u30af\u30e9\u30a4\u30a2\u30f3\u30c8(<code>WorkspaceClient<\/code>)\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\r\n<p><!-- notionvc: 90a1b81b-dd19-4ba8-8fd5-acc6bad3cb45 --><\/p>\r\n<div class=\"hcb_wrap\">\r\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code># state \u304b\u3089\u30c8\u30fc\u30af\u30f3\u3092\u53d6\u5f97 \r\nuser_token = ctx.session.state.get(\"user_access_token\") \r\n# \u30c8\u30fc\u30af\u30f3\u3092\u4f7f\u3063\u3066 WorkspaceClient \u3092\u4f5c\u6210 \r\nif user_token: \r\n    w = WorkspaceClient( token=user_token, auth_type=\"pat\" ) \r\nelse: w = WorkspaceClient()<!-- notionvc: ee6b7e7b-214a-4b5a-a599-b9464b53dc33 --><\/code><\/pre>\r\n<p>\u4f5c\u6210\u3057\u305f\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3068Databricks SDK\u306e<\/p>\r\n<div class=\"notion-inline-code-container\"><span data-token-index=\"1\" class=\"notion-enable-hover\">statement_execution<\/span><\/div>\r\n<p>API\u3092\u4f7f\u7528\u3057\u3066SQL\u30af\u30a8\u30ea(<\/p>\r\n<div class=\"notion-inline-code-container\"><span data-token-index=\"3\" class=\"notion-enable-hover\">statement<\/span><\/div>\r\n<p>)\u3092\u5b9f\u884c\u3057\u3001\u30c7\u30fc\u30bf\u3092\u53d6\u5f97\u3057\u307e\u3059\u3002<!-- notionvc: 8beea656-5e08-4310-84b1-751fde688573 --><\/p>\r\n<div class=\"hcb_wrap\">\r\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>stmt = w.statement_execution.execute_statement( \r\n        statement=query, \r\n        warehouse_id=warehouse_id, \r\n        catalog=\"data\" \r\n)<!-- notionvc: 183a681b-3c75-466a-b6fd-f605aa19b155 --><\/code><\/pre>\r\n<\/div>\r\n<\/div>\r\n<\/div>\n\n<h2>\u307e\u3068\u3081<\/h2>\n<p>Databricks Apps \u3067\u30e6\u30fc\u30b6\u30fc\u5358\u4f4d\u306e\u30a2\u30af\u30bb\u30b9\u5236\u5fa1\u3092\u5b9f\u88c5\u3059\u308b\u30dd\u30a4\u30f3\u30c8\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\u3002<\/p>\r\n<ol>\r\n\t<li><strong>\u4e8b\u524d\u8a2d\u5b9a<\/strong>: User authorization\u3001Genie Space\u3001Unity Catalog \u306e\u6a29\u9650\u8a2d\u5b9a\u3092\u6b63\u3057\u304f\u884c\u3046<\/li>\r\n\t<li><strong>\u30c8\u30fc\u30af\u30f3\u53d6\u5f97<\/strong>: <code>st.context.headers<\/code> \u304b\u3089 <code>x-forwarded-access-token<\/code> \u3092\u53d6\u5f97<\/li>\r\n\t<li><strong>State \u7ba1\u7406<\/strong>: \u53d6\u5f97\u3057\u305f\u30c8\u30fc\u30af\u30f3\u3092State \u306b\u4fdd\u5b58\u3057\u3001\u5404\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3067\u53c2\u7167<\/li>\r\n\t<li><strong>SDK \u5229\u7528<\/strong>: <code>WorkspaceClient<\/code> \u4f5c\u6210\u6642\u306b <code>token<\/code> \u3068 <code>auth_type=\"pat\"<\/code> \u3092\u6307\u5b9a<\/li>\r\n<\/ol>\r\n<p>\u3053\u306e\u5b9f\u88c5\u306b\u3088\u308a\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u5168\u4f53\u3067\u30e6\u30fc\u30b6\u30fc\u306e\u6a29\u9650\u306b\u57fa\u3065\u3044\u305f\u30c7\u30fc\u30bf\u30a2\u30af\u30bb\u30b9\u5236\u5fa1\u304c\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3068\u30ac\u30d0\u30ca\u30f3\u30b9\u3092\u4fdd\u3061\u306a\u304c\u3089\u3001\u67d4\u8edf\u306a\u30c7\u30fc\u30bf\u6d3b\u7528\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\r\n<p><!-- notionvc: 2857a48c-b37e-4122-ba43-cac49f30f8ef --><\/p>","protected":false},"excerpt":{"rendered":"<p>Databricks Apps\u3067\u30e6\u30fc\u30b6\u30fc\u5358\u4f4d\u306e\u30a2\u30af\u30bb\u30b9\u5236\u5fa1\u3092\u5b9f\u88c5\u3002\u30c8\u30fc\u30af\u30f3\u53d6\u5f97\u304b\u3089SDK\u5b9f\u884c\u307e\u3067\u89e3\u8aac\u3002 \u306f\u3058\u3081\u306b Databricks Apps \u3092\u4f7f\u3063\u305f\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u958b\u767a\u306b\u304a\u3044\u3066\u3001\u30e6\u30fc\u30b6\u30fc\u3054\u3068\u306b\u7570\u306a\u308b\u30c7\u30fc\u30bf\u30a2\u30af\u30bb\u30b9\u6a29 [&hellip;]<\/p>\n","protected":false},"author":14,"featured_media":6170,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"content-type":"","swell_btn_cv_data":"","footnotes":"","_wp_rev_ctl_limit":""},"categories":[1249],"tags":[774,1239,333],"class_list":["post-7652","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-knowledge","tag-databricks","tag-databricks-apps","tag-333"],"_links":{"self":[{"href":"https:\/\/since2020.jp\/media\/wp-json\/wp\/v2\/posts\/7652","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/since2020.jp\/media\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/since2020.jp\/media\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/since2020.jp\/media\/wp-json\/wp\/v2\/users\/14"}],"replies":[{"embeddable":true,"href":"https:\/\/since2020.jp\/media\/wp-json\/wp\/v2\/comments?post=7652"}],"version-history":[{"count":1,"href":"https:\/\/since2020.jp\/media\/wp-json\/wp\/v2\/posts\/7652\/revisions"}],"predecessor-version":[{"id":7870,"href":"https:\/\/since2020.jp\/media\/wp-json\/wp\/v2\/posts\/7652\/revisions\/7870"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/since2020.jp\/media\/wp-json\/wp\/v2\/media\/6170"}],"wp:attachment":[{"href":"https:\/\/since2020.jp\/media\/wp-json\/wp\/v2\/media?parent=7652"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/since2020.jp\/media\/wp-json\/wp\/v2\/categories?post=7652"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/since2020.jp\/media\/wp-json\/wp\/v2\/tags?post=7652"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}