使用 Google 云验证本地 Spring 启动服务
Authenticate a local Spring Boot service with Google Cloud
我有一个 spring 启动应用程序,它会 运行 在本地服务器上(而不是在 google 云服务器上)。我计划使用服务帐户来允许应用程序使用 Google 云存储和日志记录。我创建了一个服务帐户和一个 api 密钥并下载了 json 文件,如下所示:
{
"type": "service_account",
"project_id": "...",
"private_key_id": "....",
"private_key": "-----BEGIN PRIVATE KEY-----\n....\n-----END PRIVATE KEY-----\n",
"client_email": ".....iam.gserviceaccount.com",
"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/x509/....."
}
如果我在开发环境中启动应用程序并设置指向 json 文件的环境变量,应用程序将按预期工作 (GOOGLE_APPLICATION_CREDENTIALS)。
但是,我需要 运行 应用程序作为 ubuntu 中的 init.d 服务(应用程序配置为 运行 作为可执行 jar)。
我将我的 jar 文件安装为这样的服务:
sudo ln -s /home/<user>/<jarname>.jar /etc/init.d/<service-name>
sudo chmod +x /etc/init.d/<service-name>
sudo update-rc.d <service-name> defaults
sudo service <service-name> start
init.d 服务看不到我设置的环境变量,因此我需要以其他方式进行身份验证。
我安装了 gcloud
并设置了这样的服务帐户:
gcloud auth activate-service-account service-account-name@project-name.iam.gserviceaccount.com --key-file=credentials.json
gcloud config set project <projectId>
我也运行 gclout init
它显示我添加的服务帐户。
当我 运行 应用程序时,我收到多个错误:com.google.api.gax.rpc.PermissionDeniedException: io.grpc.StatusRuntimeException: PERMISSION_DENIED: The request is missing a valid API key.
。好像少了什么,但不知道是什么
我的logback-spring.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/cloud/gcp/autoconfigure/logging/logback-appender.xml" />
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
<appender name="CLOUD" class="com.google.cloud.logging.logback.LoggingAppender">
<!-- Optional : filter logs at or above a level -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<log>application.log</log> <!-- Optional : default java.log -->
<!--resourceType>gae_app</resourceType--> <!-- Optional : default: auto-detected, fallback: global -->
<loggingEventEnhancer>....LoggingEventEnhancer</loggingEventEnhancer>
<flushLevel>INFO</flushLevel> <!-- Optional : default ERROR -->
</appender>
<root level="INFO">
<!-- If running in GCP, remove the CONSOLE appender otherwise logs will be duplicated. -->
<appender-ref ref="CONSOLE"/>
<appender-ref ref="CLOUD"/>
</root>
</configuration>
运行 gcloud logging sinks list
在服务器上工作正常,所以权限应该是正确的。
我知道 spring.cloud.gcp.credentials.location=file:/..
,但它对我不起作用。 (另外,这个:https://github.com/spring-cloud/spring-cloud-gcp/issues/315#issuecomment-359077878)
我使用了 systemd,它允许我在服务启动时设置任何环境变量。
- 将可执行 jar 和 application.properties 放在一个文件夹中,例如
/opt/<name>
或 /home/<user>/<name>
- 须藤纳米
/etc/systemd/system/<name>.service
- 内容:
[Unit]
Description=Description text...etc
Wants=network-online.target
After=network.target network-online.target
[Service]
Environment="LOGPATH=/var/<name>/logs"
Environment="GOOGLE_APPLICATION_CREDENTIALS=/path-to-google-json/google/credentials.json"
ExecStartPre=/bin/mkdir -pm 0755 ${LOGPATH}
ExecStart=/opt/<name>/<jar-name>.jar
PIDFile=/run/<name>/<name>%i.pid
Restart=on-abort
RuntimeDirectory=<name>
RuntimeDirectoryMode=755
WorkingDirectory=/opt/<name>
[Install]
WantedBy=multi-user.target
- 重新加载 systemctl 配置:
sudo systemctl daemon-reload
- 设置系统开机后启动的服务:
sudo systemctl enable <name>.service
- 用
sudo systemctl start <name>.service
启动服务
状态:sudo systemctl status <name>.service
遵循标准输出:sudo journalctl -u <name>.service --follow
我有一个 spring 启动应用程序,它会 运行 在本地服务器上(而不是在 google 云服务器上)。我计划使用服务帐户来允许应用程序使用 Google 云存储和日志记录。我创建了一个服务帐户和一个 api 密钥并下载了 json 文件,如下所示:
{
"type": "service_account",
"project_id": "...",
"private_key_id": "....",
"private_key": "-----BEGIN PRIVATE KEY-----\n....\n-----END PRIVATE KEY-----\n",
"client_email": ".....iam.gserviceaccount.com",
"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/x509/....."
}
如果我在开发环境中启动应用程序并设置指向 json 文件的环境变量,应用程序将按预期工作 (GOOGLE_APPLICATION_CREDENTIALS)。
但是,我需要 运行 应用程序作为 ubuntu 中的 init.d 服务(应用程序配置为 运行 作为可执行 jar)。 我将我的 jar 文件安装为这样的服务:
sudo ln -s /home/<user>/<jarname>.jar /etc/init.d/<service-name>
sudo chmod +x /etc/init.d/<service-name>
sudo update-rc.d <service-name> defaults
sudo service <service-name> start
init.d 服务看不到我设置的环境变量,因此我需要以其他方式进行身份验证。
我安装了 gcloud
并设置了这样的服务帐户:
gcloud auth activate-service-account service-account-name@project-name.iam.gserviceaccount.com --key-file=credentials.json
gcloud config set project <projectId>
我也运行 gclout init
它显示我添加的服务帐户。
当我 运行 应用程序时,我收到多个错误:com.google.api.gax.rpc.PermissionDeniedException: io.grpc.StatusRuntimeException: PERMISSION_DENIED: The request is missing a valid API key.
。好像少了什么,但不知道是什么
我的logback-spring.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/cloud/gcp/autoconfigure/logging/logback-appender.xml" />
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
<appender name="CLOUD" class="com.google.cloud.logging.logback.LoggingAppender">
<!-- Optional : filter logs at or above a level -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<log>application.log</log> <!-- Optional : default java.log -->
<!--resourceType>gae_app</resourceType--> <!-- Optional : default: auto-detected, fallback: global -->
<loggingEventEnhancer>....LoggingEventEnhancer</loggingEventEnhancer>
<flushLevel>INFO</flushLevel> <!-- Optional : default ERROR -->
</appender>
<root level="INFO">
<!-- If running in GCP, remove the CONSOLE appender otherwise logs will be duplicated. -->
<appender-ref ref="CONSOLE"/>
<appender-ref ref="CLOUD"/>
</root>
</configuration>
运行 gcloud logging sinks list
在服务器上工作正常,所以权限应该是正确的。
我知道 spring.cloud.gcp.credentials.location=file:/..
,但它对我不起作用。 (另外,这个:https://github.com/spring-cloud/spring-cloud-gcp/issues/315#issuecomment-359077878)
我使用了 systemd,它允许我在服务启动时设置任何环境变量。
- 将可执行 jar 和 application.properties 放在一个文件夹中,例如
/opt/<name>
或/home/<user>/<name>
- 须藤纳米
/etc/systemd/system/<name>.service
- 内容:
[Unit]
Description=Description text...etc
Wants=network-online.target
After=network.target network-online.target
[Service]
Environment="LOGPATH=/var/<name>/logs"
Environment="GOOGLE_APPLICATION_CREDENTIALS=/path-to-google-json/google/credentials.json"
ExecStartPre=/bin/mkdir -pm 0755 ${LOGPATH}
ExecStart=/opt/<name>/<jar-name>.jar
PIDFile=/run/<name>/<name>%i.pid
Restart=on-abort
RuntimeDirectory=<name>
RuntimeDirectoryMode=755
WorkingDirectory=/opt/<name>
[Install]
WantedBy=multi-user.target
- 重新加载 systemctl 配置:
sudo systemctl daemon-reload
- 设置系统开机后启动的服务:
sudo systemctl enable <name>.service
- 用
sudo systemctl start <name>.service
启动服务
状态:sudo systemctl status <name>.service
遵循标准输出:sudo journalctl -u <name>.service --follow