我编写了一个管道来提取G套件活动日志,方法是引用代码读取client_secret.json文件的G suite java-quickstart,如下所示,
InputStream in = new FileInputStream("D://mypath/client_secret.json");
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
管道在本地(runner = DirectRunner)中按预期运行,但在云上执行时,相同的代码在java.io.FileNotFoundException期限失败(runner = DataflowRunner)
我理解在云上执行本地路径无效。这里有什么建议吗?
更新
我修改了下面的代码,我能够读取client_secrets.json文件
InputStream in =
Activities.class.getResourceAsStream("client_secret.json");
实际问题在于创建凭证对象
private static java.io.File DATA_STORE_DIR = new java.io.File(System.getProperty("user.home"),
".credentials/admin-reports_v1-java-quickstart");
private static final List<String> SCOPES = Arrays.asList(ReportsScopes.ADMIN_REPORTS_AUDIT_READONLY);
static {
try {
HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR);
} catch (Throwable t) {
t.printStackTrace();
System.exit(1);
}
}
public static Credential authorize() throws IOException {
// Load client secrets.
InputStream in =
Activities.class.getResourceAsStream("client_secret.json");
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
// Build flow and trigger user authorization request.
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY,
clientSecrets, SCOPES).setDataStoreFactory(DATA_STORE_FACTORY).setAccessType("offline").build();
Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
System.out.println("Credentials saved to " + DATA_STORE_DIR.getAbsolutePath());
return credential;
}
观察:
本地执行:
在云上运行(DataFlowRunner):
我需要什么?
如何修改GoogleAuthorizationCodeFlow.Builder
,以便在作为数据流管道运行时可以创建凭证对象?
答案 0 :(得分:2)
我找到了使用服务帐户创建 GoogleCredential 对象的解决方案。下面是它的代码。
public static Credential authorize() throws IOException, GeneralSecurityException {
String emailAddress = "service_account.iam.gserviceaccount.com";
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId(emailAddress)
.setServiceAccountPrivateKeyFromP12File(Activities.class.getResourceAsStream("MYFILE.p12"))
.setServiceAccountScopes(Collections.singleton(ReportsScopes.ADMIN_REPORTS_AUDIT_READONLY))
.setServiceAccountUser("USER_NAME")
.build();
return credential;
}
答案 1 :(得分:0)
您可以尝试在本地多次运行程序。我想知道的是,如果“StoredCredential”文件可用,它会起作用吗?或者它会再次尝试加载浏览器吗?
如果是这样,您是否可以确定存储该文件的正确位置,并将其从GCS下载到Dataflow工作者?应该有API来下载与数据流SDK jar捆绑在一起的GCS文件。因此,您应该可以使用它们来下载凭据文件。