Python을 사용하여 Snowflake 사용자, 역할 및 권한 관리

Python을 사용하여 Snowflake 사용자, 역할 및 권한을 관리할 수 있습니다. Snowflake에서 사용자 및 해당 권한 관리에 대한 자세한 내용은 사용자 관리 섹션을 참조하십시오.

전제 조건

이 항목의 예제에서는 Snowflake와 연결하고 Snowflake Python APIs 을 사용할 수 있는 Root 오브젝트를 생성하는 코드를 추가했다고 가정합니다.

예를 들어, 다음 코드는 구성 파일에 정의된 연결 매개 변수를 사용하여 Snowflake에 대한 연결을 생성합니다.

from snowflake.core import Root
from snowflake.snowpark import Session

session = Session.builder.config("connection_name", "myconnection").create()
root = Root(session)
Copy

해당 코드에서는 결과 Session 오브젝트를 사용하여 API의 유형과 메서드를 사용하기 위해 Root 오브젝트를 생성합니다. 자세한 내용은 Snowflake Python APIs 을 사용하여 Snowflake에 연결 섹션을 참조하십시오.

사용자 관리

Snowflake에서 사용자를 관리할 수 있습니다. 사용자는 Snowflake의 계정 수준 오브젝트입니다. Snowflake Python APIs 은 다음 두 가지 별개 유형의 사용자를 나타냅니다.

  • User: 사용자의 속성(예: 이름)을 노출합니다.

  • UserResource: 해당 User 오브젝트를 가져오고 사용자를 삭제하는 데 사용할 수 있는 메서드를 노출합니다.

사용자 만들기

UserCollection.create 메서드를 호출하고 생성하려는 사용자를 나타내는 User 오브젝트를 전달하여 사용자를 생성할 수 있습니다. 사용자를 생성하려면 먼저 사용자 이름을 지정하는 User 오브젝트를 생성합니다.

다음 예제의 코드는 my_user 라는 사용자를 나타내는 User 오브젝트를 생성한 다음 User 오브젝트를 UserCollection.create 메서드에 전달하여 사용자를 생성합니다.

from snowflake.core.user import User

my_user = User(name="my_user")
root.users.create(my_user)
Copy

사용자 세부 정보 얻기

User 오브젝트를 반환하는 UserResource.fetch 메서드를 호출하여 사용자에 대한 정보를 얻을 수 있습니다.

다음 예제의 코드는 my_user 사용자에 대한 정보를 가져옵니다.

my_user = root.users["my_user"].fetch()
print(my_user.to_dict())
Copy

사용자 나열하기

PagedIter 반복기를 반환하는 iter 메서드를 사용하여 사용자를 나열할 수 있습니다.

다음 예제의 코드는 이름이 my 로 시작하는 사용자를 나열합니다.

users = root.users.iter(like="my%")
for user in users:
  print(user.name)
Copy

사용자 삭제하기

UserResource.drop 메서드를 사용하여 사용자를 삭제할 수 있습니다.

다음 예제의 코드는 my_user 사용자를 삭제합니다.

my_user_res = root.users["my_user"]
my_user_res.drop()
Copy

역할 관리하기

Snowflake에서는 역할을 관리할 수 있습니다. 역할은 계정 수준의 오브젝트입니다. Snowflake Python APIs 은 다음 두 가지 별개 유형의 역할을 나타냅니다.

  • Role: 역할의 속성(예: 이름)을 노출합니다.

  • RoleResource: 해당 Role 오브젝트를 가져오고 역할을 삭제하는 데 사용할 수 있는 메서드를 노출합니다.

역할 만들기

역할을 생성하려면 먼저 역할 이름을 지정하는 Role 오브젝트를 생성합니다.

다음 예제의 코드는 my_role 라는 역할을 나타내는 Role 오브젝트를 생성합니다.

from snowflake.core.role import Role

my_role = Role(name="my_role")
root.roles.create(my_role)
Copy

그런 다음 Role 오브젝트를 RoleCollection.create 메서드에 전달하여 역할을 생성합니다.

세션에서 역할 사용

다음 예제의 코드는 현재 세션에서 my_role 역할을 적용합니다.

root.session.use_role("my_role")
Copy

역할 나열하기

iter 메서드를 사용하여 계정의 역할을 목록으로 만들 수 있습니다. 이 메서드는 Role 오브젝트의 PagedIter 반복기를 반환합니다.

다음 예제의 코드는 계정의 모든 역할 이름을 나열합니다.

role_list = root.roles.iter()
for role_obj in role_list:
  print(role_obj.name)
Copy

역할 삭제하기

RoleResource.drop 메서드를 사용하여 역할을 삭제할 수 있습니다.

다음 예제의 코드는 my_role 역할을 삭제합니다.

my_role_res = root.roles["my_role"]
my_role_res.drop()
Copy

데이터베이스 역할 관리하기

Snowflake에서 데이터베이스 역할 을 관리할 수 있습니다. 데이터베이스 역할은 데이터베이스 수준 오브젝트입니다. Snowflake Python APIs 은 다음 두 가지 별개 유형의 데이터베이스 역할을 나타냅니다.

  • DatabaseRole: 이름 및 설명과 같은 데이터베이스 역할의 속성을 노출합니다.

  • DatabaseRoleResource: 해당 DatabaseRole 오브젝트를 가져오고 데이터베이스 역할을 삭제하는 데 사용할 수 있는 메서드를 노출합니다.

데이터베이스 역할 만들기

데이터베이스 역할을 생성하려면 먼저 역할 이름을 지정하는 DatabaseRole 오브젝트를 생성합니다.

다음 예제의 코드는 my_db_role 라는 데이터베이스를 나타내는 DatabaseRole 오브젝트를 생성합니다.

from snowflake.core.database_role import DatabaseRole

my_db_role = DatabaseRole(
  name="my_db_role",
  comment="sample comment"
)

my_db_role_ref = root.databases['my_db'].database_roles.create(my_db_role)
Copy

그런 다음 이 코드는 DatabaseRole 오브젝트를 DatabaseRoleCollection.create 메서드에 전달하여 데이터베이스 역할을 생성합니다.

데이터베이스 역할 복제

다음 예제의 코드는 my_db_2 대상 데이터베이스에 dr2 라는 데이터베이스 역할을 my_db 데이터베이스에 있는 기존 dr1 데이터베이스 역할의 복사본으로 생성합니다.

database_role_ref = root.databases['my_db'].database_roles['dr1'].clone(target_database_role='dr2', target_database='my_db_2')
Copy

데이터베이스 역할 나열하기

iter 메서드를 사용하여 계정의 데이터베이스 역할을 목록으로 만들 수 있습니다. 이 메서드는 DatabaseRole 오브젝트의 PagedIter 반복기를 반환합니다.

다음 예제의 코드는 my_db 데이터베이스에서 my_db_role 이라는 데이터베이스 역할을 나열하여 결과 수를 1 로 제한합니다.

db_role_list = root.databases['my_db'].database_roles.iter(limit=1, from_name='my_db_role')
for db_role_obj in db_role_list:
  print(db_role_obj.name)
Copy

데이터베이스 역할 삭제

DatabaseRoleResource.drop 메서드를 사용하여 데이터베이스 역할을 삭제할 수 있습니다.

다음 예제의 코드는 my_db_role 데이터베이스 역할을 삭제합니다.

root.databases['my_db'].database_roles['my_db_role'].drop()
Copy

액세스 권한 관리하기

API를 사용하여 계정 역할, 데이터베이스 역할 또는 사용자에 대한 보안 Snowflake 오브젝트에 대한 액세스 권한을 관리할 수 있습니다. Snowflake의 역할, 보안 오브젝트 및 액세스 제어 프레임워크에 대한 자세한 내용은 액세스 제어의 개요 섹션을 참조하십시오.

계정 역할의 경우

다음 코드 예제는 계정 역할 에 대한 권한을 부여하고, 권한을 취소하고, 부여 목록을 나열하는 API 작업을 보여줍니다.

권한 부여

from snowflake.core.role import Securable

root.roles['my_role'].grant_privileges(
    privileges=["OPERATE"], securable_type="WAREHOUSE", securable=Securable(name='my_wh')
)
Copy

역할 부여

from snowflake.core.role import Securable

root.roles['my_role'].grant_role(role_type="ROLE", role=Securable(name='my_role_1'))
Copy

모든 사용자에 권한 부여

from snowflake.core.role import ContainingScope

root.roles['my_role'].grant_privileges_on_all(
    privileges=["SELECT"],
    securable_type="TABLE",
    containing_scope=ContainingScope(database='my_db', schema='my_schema'),
)
Copy

향후 권한 부여

from snowflake.core.role import ContainingScope

root.roles['my_role'].grant_future_privileges(
    privileges=["SELECT", "INSERT"],
    securable_type="TABLE",
    containing_scope=ContainingScope(database='my_db', schema='my_schema'),
)
Copy

권한 취소

from snowflake.core.role import Securable

root.roles['my_role'].revoke_privileges(
    privileges=["OPERATE"], securable_type="WAREHOUSE", securable=Securable(name='my_wh')
)
Copy

역할 취소

from snowflake.core.role import Securable

root.roles['my_role'].revoke_role(role_type="ROLE", role=Securable(name='my_role_1'))
Copy

모든 사용자에 권한 부여 취소

from snowflake.core.role import ContainingScope

root.roles['my_role'].revoke_privileges_on_all(
    privileges=["SELECT"],
    securable_type="TABLE",
    containing_scope=ContainingScope(database='my_db', schema='my_schema'),
)
Copy

향후 권한 취소

from snowflake.core.role import ContainingScope

root.roles['my_role'].revoke_future_privileges(
    privileges=["SELECT", "INSERT"],
    securable_type="TABLE",
    containing_scope=ContainingScope(database='my_db', schema='my_schema'),
)
Copy

권한에 대한 부여 옵션 취소

from snowflake.core.role import Securable

 root.roles['my_role'].revoke_grant_option_for_privileges(
    privileges=["OPERATE"], securable_type="WAREHOUSE", securable=Securable(name='my_wh')
)
Copy

모든 권한에 대한 권한 부여 옵션 취소

from snowflake.core.role import ContainingScope

root.roles['my_role'].revoke_grant_option_for_privileges_on_all(
    privileges=["SELECT"],
    securable_type="TABLE",
    containing_scope=ContainingScope(database='my_db', schema='my_schema'),
)
Copy

향후 권한에 대한 부여 옵션 취소

from snowflake.core.role import ContainingScope

root.roles['my_role'].revoke_grant_option_for_future_privileges(
    privileges=["SELECT", "INSERT"],
    securable_type="TABLE",
    containing_scope=ContainingScope(database='my_db', schema='my_schema'),
)
Copy

역할에 대한 권한 부여 목록

root.roles['my_role'].iter_grants_to()
Copy

역할에 대한 권한 부여 목록

root.roles['my_role'].iter_grants_on()
Copy

역할의 부여 목록

root.roles['my_role'].iter_grants_of()
Copy

역할에 대한 향후 권한을 나열합니다

root.roles['my_role'].iter_future_grants_to()
Copy

사용자의 경우

다음 코드 예제에서는 사용자에게 역할을 부여하고, 역할을 취소하고, 역할을 목록으로 나열하는 API 작업을 보여 줍니다.

사용자에 역할 부여

from snowflake.core.user import Securable

root.users['my_user'].grant_role(role_type="ROLE", role=Securable(name='my_role'))
Copy

사용자의 역할 취소

from snowflake.core.user import Securable

root.users['my_user'].revoke_role(role_type="ROLE", role=Securable(name='my_role'))
Copy

사용자에게 부여된 역할 나열

root.users['my_user'].iter_grants_to()
Copy

데이터베이스 역할

다음 코드 예제는 데이터베이스 역할 에 대한 권한을 부여하고, 권한을 취소하고, 부여 목록을 나열하는 API 작업을 보여줍니다.

권한 부여

from snowflake.core.database_role import Securable

root.databases['my_db'].database_roles['my_db_role'].grant_privileges(
    privileges=["MODIFY"], securable_type="DATABASE", securable=Securable(name='my_db')
)
Copy

역할 부여

from snowflake.core.database_role import Securable

root.databases['my_db'].database_roles['my_db_role'].grant_role(role_type="DATABASE ROLE", role=Securable(name='my_db_role_1'))
Copy

모든 사용자에 권한 부여

from snowflake.core.database_role import ContainingScope

root.databases['my_db'].database_roles['my_db_role'].grant_privileges_on_all(
    privileges=["SELECT"],
    securable_type="TABLE",
    containing_scope=ContainingScope(database='my_db', schema='my_schema'),
)
Copy

향후 권한 부여

from snowflake.core.database_role import ContainingScope

root.databases['my_db'].database_roles['my_db_role'].grant_future_privileges(
    privileges=["SELECT", "INSERT"],
    securable_type="TABLE",
    containing_scope=ContainingScope(database='my_db', schema='my_schema'),
)
Copy

권한 취소

from snowflake.core.database_role import Securable

root.databases['my_db'].database_roles['my_db_role'].revoke_privileges(
    privileges=["MODIFY"], securable_type="DATABASE", securable=Securable(name='my_db')
)
Copy

역할 취소

from snowflake.core.database_role import Securable

root.databases['my_db'].database_roles['my_db_role'].revoke_role(role_type="DATABASE ROLE", role=Securable(name='my_db_role_1'))
Copy

모든 권한 취소

from snowflake.core.database_role import ContainingScope

root.databases['my_db'].database_roles['my_db_role'].revoke_privileges_on_all(
    privileges=["SELECT"],
    securable_type="TABLE",
    containing_scope=ContainingScope(database='my_db', schema='my_schema'),
)
Copy

향후 권한 취소

from snowflake.core.database_role import ContainingScope

root.databases['my_db'].database_roles['my_db_role'].revoke_future_privileges(
    privileges=["SELECT", "INSERT"],
    securable_type="TABLE",
    containing_scope=ContainingScope(database='my_db', schema='my_schema'),
)
Copy

권한에 대한 부여 옵션 취소

from snowflake.core.database_role import Securable

root.databases['my_db'].database_roles['my_db_role'].revoke_grant_option_for_privileges(
    privileges=["MODIFY"], securable_type="DATABASE", securable=Securable(name='my_db')
)
Copy

모든 권한에 대한 권한 부여 옵션 취소

from snowflake.core.database_role import ContainingScope

root.databases['my_db'].database_roles['my_db_role'].revoke_grant_option_for_privileges_on_all(
    privileges=["SELECT"],
    securable_type="TABLE",
    containing_scope=ContainingScope(database='my_db', schema='my_schema'),
)
Copy

향후 권한에 대한 부여 옵션 취소

from snowflake.core.database_role import ContainingScope

root.databases['my_db'].database_roles['my_db_role'].revoke_grant_option_for_future_privileges(
    privileges=["SELECT", "INSERT"],
    securable_type="TABLE",
    containing_scope=ContainingScope(database='my_db', schema='my_schema'),
)
Copy

역할에 대한 권한 부여 목록

root.databases['my_db'].database_roles['my_db_role'].iter_grants_to()
Copy

역할에 대한 향후 권한을 나열합니다

root.databases['my_db'].database_roles['my_db_role'].iter_future_grants_to()
Copy

Grant 리소스를 사용하여 권한 관리하기 — 사용 중단됨

GRANT <권한> 작업을 실행하여 보안이 설정된 Snowflake 오브젝트에 대한 액세스 권한을 역할에 부여할 수 있습니다.

권한 부여하기

Snowflake 오브젝트에 권한을 부여하려면 먼저 다음 특성을 지정하는 Grant 오브젝트를 생성합니다.

  • grantee: 권한이 부여되는 역할 또는 사용자입니다.

  • securable: 권한에 의해 보호되는 Snowflake 오브젝트입니다.

  • privileges: 역할에 부여되는 권한입니다.

계정에서 역할에 CREATE 권한 부여하기

다음 예제의 코드는 현재 Snowflake 계정의 my_role 역할에 create_databasecreate_warehouse 권한을 부여하는 부여 작업을 나타내는 Grant 오브젝트를 생성합니다. 이 코드는 root.grants.grant 메서드를 사용하여 작업을 실행합니다.

from snowflake.core.grant import Grant
from snowflake.core.grant._grantee import Grantees
from snowflake.core.grant._privileges import Privileges
from snowflake.core.grant._securables import Securables

root.grants.grant(
  Grant(
    grantee=Grantees.role(name='my_role'),
    securable=Securables.current_account,
    privileges=[Privileges.create_database,
                Privileges.create_warehouse],
  )
)
Copy

역할에 데이터베이스 권한 부여

다음 예제의 코드는 my_db 데이터베이스에 대해 가져온 권한my_role 역할에 부여합니다.

from snowflake.core.grant import Grant
from snowflake.core.grant._grantee import Grantees
from snowflake.core.grant._privileges import Privileges
from snowflake.core.grant._securables import Securables

root.grants.grant(
  Grant(
    grantee=Grantees.role('my_role'),
    securable=Securables.database('my_db'),
    privileges=[Privileges.imported_privileges],
  )
)
Copy

다른 역할에 역할 부여하기

역할을 다른 역할에 할당하여 역할 간에 “상위-하위” 관계(역할 계층 구조 라고도 함)를 생성할 수 있습니다.

다음 예제의 코드는 my_role 사용자 역할을 ACCOUNTADMIN 시스템 역할에 부여합니다.

from snowflake.core.grant import Grant
from snowflake.core.grant._grantee import Grantees
from snowflake.core.grant._securables import Securables

root.grants.grant(
  Grant(
    grantee=Grantees.role('ACCOUNTADMIN'),
    securable=Securables.role('my_role'),
  )
)
Copy