目的と経緯
- AWS Lambdaで Cloud Natural Language をPython用SDK で操作することが目的です
-
Getting started with authentication によると環境変数
GOOGLE_APPLICATION_CREDENTIALS
へサービスアカウントJSONファイルパスを指定すれば良いと書いてあり、当然その通りにすれば動作しました - この方法はファイルを読み込む前提であり、AWS LambdaやGoogle以外のコンテナ系環境で実行する場合は実行環境内にファイルを設置する必要があります
- デプロイファイルセットにAPIアクセス用のクレデンシャルファイルを含めるのは少し躊躇するところです
- 今回はAWSなので パラメータストア(AWS Systems Manager)へクレデンシャル内容を保持し、実行時に取得することにしました
- パラメータストアから取得した時点で文字列は変数に保持できているので、それをそのまま使ってくれよ、というのが自然かなと思うのですが現時点のSDK(version2.0.0)にはそのインターフェイスは用意されていないようです
- パラメータストアから取得した内容(JSON文字列)をテンポラリファイルへ書き出し、そのパスを環境変数
GOOGLE_APPLICATION_CREDENTIALS
へセットしてSDK利用する、という方法でも動作すると思いましたが、それもいかにも無駄かなと感じます- ※用意されたインターフェイスに従うという意味では間違いとは思っていません
- そこで、ファイルを介さずに直接クレデンシャルJSONを利用する方法としたので、メモと何かの参考になればと記録します
コード
クライアントオブジェクトを取得する
- google.oauth2.service_account.Credentialsのクラスメソッド
from_service_account_info()
を引っ張り出し、クレデンシャルをロードしています - 要は
LanguageServiceClient()
のcredentialsパラメータを指定すれば良いのです。指定内容が本記事で言いたいことすべてです
from google.cloud.language_v1 import LanguageServiceClient
from google.oauth2.service_account import Credentials
def get_language_client(credential: dict) -> LanguageServiceClient:
return LanguageServiceClient(
credentials=Credentials.from_service_account_info(credential))
利用例
実行コード
import json
from google.cloud import language_v1
# 省略しますがサービスアカウントJSONファイルの内容そのままをセット(実際はパラメータストアなどから取得する想定)
credential_json = '{\n "type": "service_account",\n "project_id": "...",\n ....'
# 作成したメソッドでクライアントオブジェクトを取得
client = get_language_client(json.loads(credential_json))
# エンティティ分析を呼び出して動作を確認
text = '東京の夏は暑い'
response = client.analyze_entities(
document=language_v1.Document(
content=text,
type_=language_v1.Document.Type.PLAIN_TEXT),
encoding_type=language_v1.EncodingType.UTF8)
for entity in response.entities:
print('{}\n{}\n{}\n{}\n'.format(
'='*20,
entity.name,
entity.type_.name,
entity.metadata))
実行結果
====================
東京
LOCATION
{'wikipedia_url': 'https://de.wikipedia.org/wiki/Tokio', 'mid': '/g/12lnhn10f'}
====================
夏
OTHER
{}
最後に
現時点でv2.0.0がリリースされていますが、未リリースのgithubコード上ではメソッド追加されているようです
このバージョンがリリースされれば LanguageServiceClient.from_service_account_info(key_dict)
を使えるようになると思われます
※見返したところ、冒頭の「目的と経緯」が長いポエム状態でした。夜中に書いたのですみません。