简体   繁体   中英

The Application Default Credentials are not available with environment variable setup in mac Google Cloud Storage

 The Application Default Credentials are not available.
 They are available if running in Google Compute Engine.
 Otherwise, the environment variable GOOGLE_APPLICATION_CREDENTIALS must be defined pointing to a file defining the credentials

Keep getting the above error instead I have set the environment variable on my local machine with the below command

export GOOGLE_APPLICATION_CREDENTIALS="/Users/macbook/Downloads/fetebird-2b6fa8261292.json"

If I check the path for the environment variable with the below command on terminal it does show the path of the variable

echo $GOOGLE_APPLICATION_CREDENTIALS

在此处输入图像描述

On Micronaut application I am trying to create a storage bucket during the startup

@Singleton
public class StartUp implements ApplicationEventListener<StartupEvent> {
    private final GoogleCloudStorageService googleCloudStorageService;

    public StartUp(GoogleCloudStorageService googleCloudStorageService) {
        this.googleCloudStorageService = googleCloudStorageService;
    }

    @Override
    public void onApplicationEvent(StartupEvent event) {
        try {
            this.googleCloudStorageService.createBucketWithStorageClassAndLocation().subscribe();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

On the service

@Singleton
public record GoogleCloudStorageService(GoogleCloudStorageConfiguration googleUploadObjectConfiguration, GoogleCredentialsConfiguration googleCredentialsConfiguration) {

    private static final Logger LOG = LoggerFactory.getLogger(GoogleCloudStorageService.class);

    public Observable<Void> createBucketWithStorageClassAndLocation() throws IOException {
        GoogleCredentials credentials = GoogleCredentials.getApplicationDefault(); // fromStream(new FileInputStream(googleCredentialsConfiguration.getLocation()));
        Storage storage = StorageOptions.newBuilder().setCredentials(credentials).setProjectId(googleUploadObjectConfiguration.projectId()).build().getService();
        StorageClass storageClass = StorageClass.COLDLINE;
        try {
            Bucket bucket =
                    storage.create(
                            BucketInfo.newBuilder(googleUploadObjectConfiguration.bucketName())
                                    .setStorageClass(storageClass)
                                    .setLocation(googleUploadObjectConfiguration.locationName())
                                    .build());
            LOG.info(String.format("Created bucket %s in %s with storage class %s", bucket.getName(), bucket.getLocation(), bucket.getStorageClass()));
        } catch (Exception ex) {
            LOG.error(ex.getMessage());
        }
        return Observable.empty();
    }
}

The environment variable is NULL while running the application

System.out.println(System.getenv("GOOGLE_APPLICATION_CREDENTIALS"))

The GoogleCredentials credentials = GoogleCredentials.getApplicationDefault(); causing an exception as

java.io.IOException: The Application Default Credentials are not available. They are available if running in Google Compute Engine. Otherwise, the environment variable GOOGLE_APPLICATION_CREDENTIALS must be defined pointing to a file defining the credentials. See https://developers.google.com/accounts/docs/application-default-credentials for more information.
    at com.google.auth.oauth2.DefaultCredentialsProvider.getDefaultCredentials(DefaultCredentialsProvider.java:134)
    at com.google.auth.oauth2.GoogleCredentials.getApplicationDefault(GoogleCredentials.java:120)
    at com.google.auth.oauth2.GoogleCredentials.getApplicationDefault(GoogleCredentials.java:92)
    at fete.bird.service.gcp.GoogleCloudStorageService.createBucketWithStorageClassAndLocation(GoogleCloudStorageService.java:24)
    at fete.bird.core.StartUp.onApplicationEvent(StartUp.java:24)
    at fete.bird.core.StartUp.onApplicationEvent(StartUp.java:11)
    at io.micronaut.context.DefaultBeanContext.notifyEventListeners(DefaultBeanContext.java:1307)
    at io.micronaut.context.DefaultBeanContext.publishEvent(DefaultBeanContext.java:1292)
    at io.micronaut.context.DefaultBeanContext.start(DefaultBeanContext.java:248)
    at io.micronaut.context.DefaultApplicationContext.start(DefaultApplicationContext.java:166)
    at io.micronaut.runtime.Micronaut.start(Micronaut.java:71)
    at io.micronaut.runtime.Micronaut.run(Micronaut.java:311)
    at io.micronaut.runtime.Micronaut.run(Micronaut.java:297)
    at fete.bird.ServiceApplication.main(ServiceApplication.java:8)

Is it on StartupEvent the micronaut doesn't access the environment variable?

Well I was missing the below instruction

Local development/testing

If running locally for development/testing, you can use the Google Cloud SDK . Create Application Default Credentials with gcloud auth application-default login , and then google-cloud will automatically detect such credentials.

https://github.com/googleapis/google-cloud-java

However, this solution is not perfect, since it is using the OAuth authentication and getting the warning as Your application has authenticated using end user credentials from Google Cloud SDK. We recommend that most server applications use service accounts instead. If your application continues to use end user credentials from Cloud SDK, you might receive a "quota exceeded" or "API not enabled" error. For more information about service accounts. Your application has authenticated using end user credentials from Google Cloud SDK. We recommend that most server applications use service accounts instead. If your application continues to use end user credentials from Cloud SDK, you might receive a "quota exceeded" or "API not enabled" error. For more information about service accounts.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM