У меня есть код снизу, который отлично работает. Моя служба и хранилище находятся в одной среде в агенте. Есть ли способ записать учетные данные без предоставления ключа, следовательно, они находятся в одной среде в агенте?
StorageSharedKeyCredential credential =
new StorageSharedKeyCredential(accountName, **accountKey**);
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
.endpoint(endpoint)
.credential(credential)
.buildClient();
Приложение и хранилище находятся в одной среде. Приложение работает внутри Kubernetes. Хранилище является выделенным.
Вы можете попробовать использовать перегрузку с TokenCredential
для создания своего клиента с использованием класса ManagedIdentityCredential
. Затем создайте управляемое удостоверение для своего Kubernetes и назначьте ему разрешение RBAC на ресурс учетной записи хранения. Я никогда не пробовал его в сервисе Kubernetes, поэтому не уверен, что этого достаточно.
Не могли бы вы привести конкретный пример? Я все еще немного смущен.
В следующих документах это хорошо объясняется: learn.microsoft.com/en-us/azure/storage/blobs/… и learn.microsoft.com/en-us/java/api/overview/azure/…
Есть ли способ записать учетные данные без предоставления ключа?
Чтобы избежать ключевых учетных данных, я согласен с @NotFound, что вы можете использовать Tokencredential
с методом DefaultAzureCredential.
Вам необходимо назначить роли RBAC своей учетной записи хранения для доступа к хранилищу BLOB-объектов через удостоверение. Роли:
Перейдите на портал -> учетные записи хранения -> контроль доступа (IAM) -> добавить -> добавить назначения ролей -> роль Storage-Blob-Contributor или Storage-Blob-owner для учетной записи хранения.
Портал:
Я попытался с помощью примера кода загрузить файл с локального пути в хранилище больших двоичных объектов Azure, используя успешно загруженное удостоверение.
Код:
import com.azure.storage.blob.*;
import com.azure.core.credential.TokenCredential;
import com.azure.identity.*;
public class App
{
public static void main( String[] args )
{
TokenCredential credential = new DefaultAzureCredentialBuilder().build();
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
.endpoint("https://<storage account name>.blob.core.windows.net/")
.credential(credential)
.buildClient();
String containerName = "test";
BlobContainerClient containerClient = blobServiceClient.getBlobContainerClient(containerName);
String localPath = "<your local path >";
BlobClient blobClient = containerClient.getBlobClient("file.json");
System.out.println("\nUploading to Blob storage as blob:\n\t" + blobClient.getBlobUrl());
blobClient.uploadFromFile(localPath);
System.out.println("Uploaded!!!");
}
}
Консоль:
Портал:
Что вы имеете в виду под той же «той же средой в агенте»? Вы запускаете веб-приложение или приложение на виртуальной машине Azure, которая подключается к учетной записи хранения Azure?