서비스 계정을 사용하여 Google Drive에서 만든 파일의 소유자는 서비스 계정입니다.

GiitHub Actions에서 Google Drive API를 사용할 때는 키 인증 없이 서비스 계정을 사용하는 것이 편리하다는 점을 고려했습니다.
그 과정에서 조금 틀린 부분이 있어서 필기 등을 했다.또 개인 계정(편집)을 통해 이뤄진 것으로 확인됐다.

잘못된 행동


아래의 느낌으로 파일을 서비스 계정에서 제 개인 콘서트에 업로드합니다.
  • 일반 사용자는 웹 UI 등을 통해 나의 실황 중계에 폴더를 만들고 서비스 계정을 편집으로 공유한다
  • 서비스 계정을 사용하여 스크립트 등에서 상기 폴더로 업로드
  • 업로드된 파일을 참조할 필요가 없는 경우 삭제
  • 이 경우 그림1-1에서 보듯이 파일은 사용자의 개인 콘서트에 업로드되고 일반적인 파일처럼 참고하거나 삭제할 수 있다.
    ▶ 그림1-1 잘못된 행동
    flowchart LR
      sa["service account"] -- upload ---> file 
      subgraph My Drive
        file[("file")] -. parent .-> entry
        subgraph Shared Folder
          entry(( ))
          %% style entry fill:#fff
        end
      end
      entry -- browse --- user

    실제 행동

    実際は 図 2-1 のように「ファイルはサービスアカウントのマイドライブへアップロードされ、親フォルダーの 1 つとして共有フォルダーが設定される」という挙動になりました。

    これは「アップロードされたファイルのオーナーがサービスアカウントになるため、ファイルの実体はサービスアカウントのマイドライブに作成される」ということかと思われます。

    図 2-1 実際の挙動

    flowchart LR
      sa["service account"] -- upload ---> file 
      subgraph "My Drive(sa)"
        file[("file")] -. parent .-> entry(( ))
        subgraph Folder
          entry
          %% style entry fill:#fff
        end
      end
      subgraph "My Drive(user)"
        subgraph Shared Folder
          file -. parent .-> shared(( ))
          %% style shared fill:#fff
        end
      end
      shared -- browse --- user

    この場合、ファイルは共有された状態なのでユーザー側から削除してもサービスアカウントのマイドライブにはファイルはそのまま残ります(図 2-2)。

    図 2-2 親フォルダーの設定のみ削除

    flowchart TB
      subgraph "My Drive(user)"
        subgraph Shared Folder
          deleted(( ))
          style deleted fill:#fff,stroke-dasharray: 5 5
        end
      end
      subgraph "My Drive(sa)"
        file[("file")] -. parent .-> entry(( ))
        subgraph Folder
          entry
        end
      end

    확인

    今回は gdrive とサービスアカウントの鍵ファイルを利用することで確認してみます。なお、プロジェクト内の Google Drive API の有効化やサービスアカウントの設定などは割愛します[1]

    공유 설정

    通常ユーザーからウェブ UI などでフォルダーを作成しサービスアカウントと共有します(図 3-1)。

    フォルダーの共有設定でサービスアカウントが追加されているスクリーンショット図 3-1 フォルダーの共有設定にサービスアカウントを追加

    업로드

    gdriveupload コマンドでテキストファイルを共有されたフォルダーへアップロードします(図 3-2)。

    図 3-2 ファイルをアップロード

    $ cat test.txt
    テストのファイル
    
    $ ./gdrive --service-account gha-creds-test-temp.json  -c . upload --parent "1M_ehFhKd7A-ppMimBYfkYSGHr-LcoAID" --mime application/vnd.google-apps.document test.txt
    Uploading test.txt
    Uploaded 12Si2whpEg-Y0216SP_BKZe2ihQzgLt9McmQBoKEIJ9I at 272.0 B/s, total 1.0 KB
    
    웹 UI에서 확인한 후 서비스 계정은 소유자(그림3-3)이다.또 이 상태에서 액세스 관리에서는 파일을 공유하지만 알림 메일은 발송되지 않았다.
    アップロードしたファイルの詳細タブのスクリーンショット 그림3-3 상세 라벨의 소유자는 서비스 계정으로 표시

    삭제


    웹 UI로 삭제해 보세요(그림3-4).
    ファイル削除後のスクリーンショット 그림 3-4 파일 삭제
    사용자 측 폴더에서 삭제[2]되지만 gdrive 소유자(서비스 계정) 측의 개인 콘서트를 확인할 때 파일은 그대로 유지된다(그림3-5).
    ▶ 그림 3-5 사용자가 삭제한 파일 남기기
    $ ./gdrive --service-account gha-creds-test-temp.json  -c . list -q "trashed=false"
    Id                                             Name     Type   Size     Created
    12Si2whpEg-Y0216SP_BKZe2ihQzgLt9McmQBoKEIJ9I   test     doc    1.0 KB   2022-03-22 15:02:16
    1M_ehFhKd7A-ppMimBYfkYSGHr-LcoAID              sample   dir             2022-03-22 14:44:58
    
    소유자 측에서 삭제하면 완전히 사라진다(그림3-6).
    ▶ 그림 3-6 소유자 측 삭제
    $ ./gdrive --service-account gha-creds-test-temp.json  -c . delete 12Si2whpEg-Y0216SP_BKZe2ihQzgLt9McmQBoKEIJ9I
    Deleted 'test'
    
    $ ./gdrive --service-account gha-creds-test-temp.json  -c . list -q "trashed=false"
    Id                                  Name     Type   Size   Created
    1M_ehFhKd7A-ppMimBYfkYSGHr-LcoAID   sample   dir           2022-03-22 14:44:58
    
    !
    서비스 계정을 삭제해도 삭제가 가능하지만, 서비스 계정인 내 콘서트 내 파일도 모두 사라진다.

    소유자를 자신으로 설정(일반 사용자)


    서비스 계정이 소유자라고 해서 곤란하지는 않지만, 평소 홈페이지 UI에서 사용하는 파일이라면 처리가 잘 안 되는 것 같다[3].따라서 소유자를 자신으로 만들고 서비스 계정에서 편집할 수 있는 방법을 고려해 보자.

    직접 파일 만들기


    자주 다시 만들지 않으면'웹 UI 등에서 미리 파일을 만들고 공유 설정을 통해 서비스 계정을 편집'으로 처리할 수 있다.프로그램을 따로 설정하지 않으면 수동으로 처리할 수 있지만 프로그램은 간단하다.

    transferOwnersip 사용


    자동화를 고려하면 Google Drive API를 사용하려고 합니다.이 경우Permissions.createtransferOwnership를 통해 소유자를 변경할 수 있다.
    이것은 gdrive면 방법이 불분명하기 때문에 자체 제작한 도구guratan로 확인한다.
    $ ./gdrive --service-account gha-creds-test-temp.json  -c . upload --parent "1M_ehFhKd7A-ppMimBYfkYSGHr-LcoAID" --mime application/vnd.google-apps.document test.txt
    Uploading test.txt
    Uploaded 1h8NZ3TkKDtXw7Nux3FWgZVe7YM8HO9rChRtBiTZAZ8o at 322.0 B/s, total 1.0 KB
    
    $ GOOGLE_APPLICATION_CREDENTIALS=./gha-creds-test-temp.json npx guratan share --file-id 1h8NZ3TkKDtXw7Nux3FWgZVe7YM8HO9rChRtBiTZAZ8o --type user --role owner --email-address xxxxxxxxxxx --transfer-ownership 
    
    명령을 실행한 후 다음과 같이 소유자를 변경합니다.
    アップロードしたファイルの詳細タブのスクリーンショット 그림 4-1 상세 태그의 소유자는
    또 이 방법을 사용하면 확인된 메일이 발송되지 않아 소유자가 갑자기 달라진다.그리고 그림4-2의 메일을 보냅니다. (API 옵션으로 이 메일을 보내야 합니다.)
    変更のツールメールのスクリーンショット 그림4-2 변경된 우편물
    그 영향인지 모르겠지만 제한이 있는 것 같아요.
  • For consumer users the transfer of ownership from the service account to the user is allowed, but restricted: Only for documents of Google mimeType the owner can be changed.
  • 소유자의 파일을 변경하는 MIME Type이 Google Workspace and Drive MIME Types 중 하나가 아니면 오류가 발생합니다.예를 들어 text/plainapplication/pdf 등에서 오류가 발생할 수 있다(그림4-3).
    이 근처에 뭐든지moveToNewOwnersRoot 조합이 있으면 몰래'.ほにゃららrc의 자동실행용 파일을 삽입할 수 있겠지[4].
    ▶ 그림 4-3 text/plain 표시 오류
    $ ./gdrive --service-account gha-creds-test-temp.json  -c . upload --parent "1M_ehFhKd7A-ppMimBYfkYSGHr-LcoAID" --mime text/plain test.txt
    Uploading test.txt
    Uploaded 1WONynFnpVHv1k0J_v1tDx5fg1_9t-LA4 at 17.0 B/s, total 25.0 B
    
    $ GOOGLE_APPLICATION_CREDENTIALS=./gha-creds-test-temp.json npx guratan share --file-id 1WONynFnpVHv1k0J_v1tDx5fg1_9t-LA4 --type user --role owner --email-address [email protected] --transfer-ownership 
    Error: [{"domain":"global","reason":"invalidSharingRequest","message":"Bad Request. User message: \"You can't change the owner of this item.\""}]
    
    위에서 설명한 대로 제한이 있으므로 모든 경우에 적용할 수 없지만 파일 종류에 문제가 없으면 자동화할 수 있을 것 같습니다.
    !
    누구에게나 갑자기 사장이 될 수 있기 때문에 변경 대상을 지정할 때 주의가 필요하다.
    !
    서비스 계정이 편집이 된 후에도'소유자가 된 사용자로 변경(실질적으로 아무것도 하지 않음)'할 수 있다.편리해 보이지만 "(실제로는 아무것도 하지 않고) 매번 변경된 알림 메일을 보낸다"는 점도 주의해야 한다.

    기타


    편집에 따라 앞에서 인용한 바와 같이 소유자의 변경이 아니라 드라이브와 권한을 공유하는 의뢰 등 방법이다.

    끝말


    서비스 계정의 특성을 고려하면 소유자가 되는 것은 자연스러운 일이지만, 내 콘서트 폴더에 자동으로 파일을 추가하면 일반적인 파일처럼 처리하기 쉽다.
    특히 삭제는'삭제된 줄 알았는데 서비스 계정에 남는 내 콘서트'또는'서비스 계정을 삭제하면 완전히 사라질 것'으로 바뀌므로 주의해야 한다.
    각주
    스크랩에 간단한 필기가 있다.https://zenn.dev/hankei6km/scraps/f786cd2df1073e ↩︎
    '파일 삭제' 와 같이 토스터는 사용자의 쓰레기통으로 이동하지 않습니다.↩︎
    잘못 삭제하면 이용자 쪽 쓰레기통으로 이동하지 않기 때문에 조금 번거롭다 등.↩︎
    슬그머니 공유된 폴더에 올리면 개인적인 느낌도 비슷한데(여기서 추가 알림 메일은 보내지 않음) 미리 사용자 설정이 있어서 OK 처리인가요?↩︎

    좋은 웹페이지 즐겨찾기