이건 진짜 원래 API 잘 다루는 사람 아니면 알기 힘들다.
우선 Github으로 Streamlit 배포할 때와 도커를 이용해서 배포할 때가 다른데 오늘은 Docker를 사용했을 때를 설명하겠다.
원래 ipynb에서 GEE, Geemap을 사용하려면 ee.aunthenticate()나 geemap.ee_initialize() 및 authenticate()를 실행해야 한다.
그리고 인증을 하면 토큰을 받을 수 있는데 그것을 입력해주면 된다.
그런데 스트림릿 같은 경우에 웹을 구동하는 순간에 Authenticate가 되어 있지 않으면 아래와 같은 에러가 발생한다.
EOFError: EOF when reading a line
Traceback:
File "/usr/local/lib/python3.9/dist-packages/streamlit/runtime/scriptrunner/script_runner.py", line 534, in _run_script
exec(code, module.__dict__)
File "/app/streamlit/main.py", line 77, in <module>
launch()
File "/app/streamlit/main.py", line 14, in launch
geemap.ee_initialize()
File "/usr/local/lib/python3.9/dist-packages/geemap/common.py", line 130, in ee_initialize
ee.Authenticate(**auth_args)
File "/usr/local/lib/python3.9/dist-packages/ee/__init__.py", line 105, in Authenticate
oauth.authenticate(
File "/usr/local/lib/python3.9/dist-packages/ee/oauth.py", line 430, in authenticate
flow.save_code()
File "/usr/local/lib/python3.9/dist-packages/ee/oauth.py", line 479, in save_code
_obtain_and_write_token(code, self.code_verifier, self.scopes, redirect_uri)
File "/usr/local/lib/python3.9/dist-packages/ee/oauth.py", line 188, in _obtain_and_write_token
auth_code = input('Enter verification code: ')
이럴 때 방법이 있다.
구글의 OAuth를 이용하면 된다.(이미 내글을 볼 정도면 이것저것 많이 해봤을걸 알기에 간단한 설명만 적겠다.)
OAuth에서 API key를 json 형식으로 아래와 같이 만든다.
{
"type": "service_account",
"project_id": "",
"private_key_id": "",
"private_key": "-----BEGIN PRIVATE KEY-----\",
"client_email": "",
"client_id": "",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/"
"universe_domain": "googleapis.com"
}
그러고 main.py(메인페이지)의 lunch() 부분에 다음과 같은 코드를 추가한다.
service_account_json = 'json 경로'
credentials = service_account.Credentials.from_service_account_file(
service_account_json,
scopes=['https://www.googleapis.com/auth/cloud-platform']
)
# Earth Engine 초기화
ee.Initialize(credentials)
이런식으로 Initialize 안에 credential을 넣어주는 것이 포인트다.
시작할 때 말했던 것처럼 GEE 시작할 때 인증하고, 토큰 가져온걸 입력하는 것이 포인트인데 그걸 자동으로 해준다고 생각하면 된다.