Azure Cosmos DB for Cassandra と Service Connector を統合する
[アーティクル]
このページでは、サポートされている認証方法とクライアントを示し、サービス コネクタを使用して Azure Cosmos DB for Apache Cassandra を他のクラウド サービスに接続するために使用できるサンプル コードを示します。 Service Connector を使用しなくても、他のプログラミング言語で Cassandra 用 Azure Cosmos DB に接続できる場合があります。 このページには、サービス接続を作成するときに取得する既定の環境変数の名前と値 (つまり、Spring Boot 構成) も示されています。
サポートされているコンピューティング サービス
サービス コネクタを使用して、次のコンピューティング サービスを Azure Cosmos DB for Apache Cassandra に接続できます。
Azure App Service
Azure Container Apps
Azure Functions
Azure Kubernetes Service (AKS)
Azure Spring Apps
サポートされている認証の種類とクライアントの種類
次の表は、サービス コネクタを使用した Azure Cosmos DB for Apache Cassandra へのコンピューティング サービスの接続でサポートされているクライアントの種類と認証方法の組み合わせを示したものです。 "はい" はその組み合わせがサポートされていることを示し、"いいえ" はサポートされていないことを示します。
クライアント タイプ
システム割り当てマネージド ID
ユーザー割り当てマネージド ID
シークレット/接続文字列
サービス プリンシパル
.NET
はい
イエス
イエス
はい
Go
はい
イエス
イエス
はい
Java
はい
イエス
イエス
はい
Java - Spring Boot
いいえ
番号
有効
いいえ
Node.js
はい
イエス
イエス
はい
Python
はい
イエス
イエス
はい
なし
有効
イエス
イエス
はい
この表は、シークレットと接続文字列の方法のみをサポートする Java - Spring Boot クライアントの種類を除き、表にあるすべてのクライアントの種類と認証方法の組み合わせがサポートされていることを示しています。 その他すべてのクライアントの種類で任意の認証方法を使用し、サービス コネクタを使って Azure Cosmos DB for Apache Cassandra に接続できます。
既定の環境変数名またはアプリケーション プロパティとサンプル コード
接続の認証の種類とクライアントの種類に従って、次の表の接続の詳細とサンプル コードを参照して、コンピューティング サービスを Azure Cosmos DB for Apache Cassandra に接続します。 名前付け規則の詳細については、Service Connector の内部の記事を参照してください。
クライアント ライブラリ Azure.Identity を使用して、マネージド ID またはサービス プリンシパルのアクセス トークンを取得します。 アクセス トークンと AZURE_COSMOS_LISTKEYURL を使用してパスワードを取得します。 サービス コネクタによって追加された環境変数から接続情報を取得し、Azure Cosmos DB for Cassandra に接続します。 次のコードを使用する場合は、使用する認証の種類のコード スニペットの部分をコメント解除します。
using System;
using System.Security.Authentication;
using System.Net.Security;
using System.Net.Http;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;
using Cassandra;
using Azure.Identity;
public class Program
{
public static async Task Main()
{
var cassandraContactPoint = Environment.GetEnvironmentVariable("AZURE_COSMOS_CONTACTPOINT");
var userName = Environment.GetEnvironmentVariable("AZURE_COSMOS_USERNAME");
var cassandraPort = Int32.Parse(Environment.GetEnvironmentVariable("AZURE_COSMOS_PORT"));
var cassandraKeyspace = Environment.GetEnvironmentVariable("AZURE_COSMOS_KEYSPACE");
var listKeyUrl = Environment.GetEnvironmentVariable("AZURE_COSMOS_LISTKEYURL");
var scope = Environment.GetEnvironmentVariable("AZURE_COSMOS_SCOPE");
// Uncomment the following lines corresponding to the authentication type you want to use.
// For system-assigned identity.
// var tokenProvider = new DefaultAzureCredential();
// For user-assigned identity.
// var tokenProvider = new DefaultAzureCredential(
// new DefaultAzureCredentialOptions
// {
// ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_COSMOS_CLIENTID");
// }
// );
// For service principal.
// var tenantId = Environment.GetEnvironmentVariable("AZURE_COSMOS_TENANTID");
// var clientId = Environment.GetEnvironmentVariable("AZURE_COSMOS_CLIENTID");
// var clientSecret = Environment.GetEnvironmentVariable("AZURE_COSMOS_CLIENTSECRET");
// var tokenProvider = new ClientSecretCredential(tenantId, clientId, clientSecret);
// Acquire the access token.
AccessToken accessToken = await tokenProvider.GetTokenAsync(
new TokenRequestContext(scopes: new string[]{ scope }));
// Get the password.
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {accessToken.Token}");
var response = await httpClient.POSTAsync(listKeyUrl);
var responseBody = await response.Content.ReadAsStringAsync();
var keys = JsonConvert.DeserializeObject<Dictionary<string, string>>(responseBody);
var password = keys["primaryMasterKey"];
// Connect to Azure Cosmos DB for Cassandra
var options = new Cassandra.SSLOptions(SslProtocols.Tls12, true, ValidateServerCertificate);
options.SetHostNameResolver((ipAddress) => cassandraContactPoint);
Cluster cluster = Cluster
.Builder()
.WithCredentials(userName, password)
.WithPort(cassandraPort)
.AddContactPoint(cassandraContactPoint).WithSSL(options).Build();
ISession session = await cluster.ConnectAsync();
}
public static bool ValidateServerCertificate
(
object sender,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors
)
{
if (sslPolicyErrors == SslPolicyErrors.None)
return true;
Console.WriteLine("Certificate error: {0}", sslPolicyErrors);
// Do not allow this client to communicate with unauthenticated servers.
return false;
}
}
azure-identity を使用してマネージド ID またはサービス プリンシパルで認証し、AZURE_COSMOS_LISTKEYURL に要求を送信してパスワードを取得します。 サービス コネクタによって追加された環境変数から接続情報を取得し、Azure Cosmos DB for Cassandra に接続します。 次のコードを使用する場合は、使用する認証型のコード スニペットの一部をコメント解除します。
from cassandra.cluster import Cluster
from ssl import PROTOCOL_TLSv1_2, SSLContext, CERT_NONE
from cassandra.auth import PlainTextAuthProvider
import requests
from azure.identity import ManagedIdentityCredential, ClientSecretCredential
username = os.getenv('AZURE_COSMOS_USERNAME')
contactPoint = os.getenv('AZURE_COSMOS_CONTACTPOINT')
port = os.getenv('AZURE_COSMOS_PORT')
keyspace = os.getenv('AZURE_COSMOS_KEYSPACE')
listKeyUrl = os.getenv('AZURE_COSMOS_LISTKEYURL')
scope = os.getenv('AZURE_COSMOS_SCOPE')
# Uncomment the following lines corresponding to the authentication type you want to use.
# For system-assigned managed identity
# cred = ManagedIdentityCredential()
# For user-assigned managed identity
# managed_identity_client_id = os.getenv('AZURE_COSMOS_CLIENTID')
# cred = ManagedIdentityCredential(client_id=managed_identity_client_id)
# For service principal
# tenant_id = os.getenv('AZURE_COSMOS_TENANTID')
# client_id = os.getenv('AZURE_COSMOS_CLIENTID')
# client_secret = os.getenv('AZURE_COSMOS_CLIENTSECRET')
# cred = ClientSecretCredential(tenant_id=tenant_id, client_id=client_id, client_secret=client_secret)
# Get the password
session = requests.Session()
token = cred.get_token(scope)
response = session.post(listKeyUrl, headers={"Authorization": "Bearer {}".format(token.token)})
keys_dict = response.json()
password = keys_dict['primaryMasterKey']
# Connect to Azure Cosmos DB for Cassandra.
ssl_context = SSLContext(PROTOCOL_TLSv1_2)
ssl_context.verify_mode = CERT_NONE
auth_provider = PlainTextAuthProvider(username, password)
cluster = Cluster([contactPoint], port = port, auth_provider=auth_provider,ssl_context=ssl_context)
session = cluster.connect()
依存関係をインストールします。
go get github.com/gocql/gocql
go get "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
go get "github.com/Azure/azure-sdk-for-go/sdk/azcore"
コードでは、azidentity を介してアクセス トークンを取得し、それを使用してパスワードを取得します。 サービス コネクタによって追加された環境変数から接続情報を取得し、Azure Cosmos DB for Cassandra に接続します。 次のコードを使用する場合は、使用する認証の種類のコード スニペットの部分をコメント解除します。
クライアント ライブラリ Azure.Identity を使用して、マネージド ID またはサービス プリンシパルのアクセス トークンを取得します。 アクセス トークンと AZURE_COSMOS_LISTKEYURL を使用してパスワードを取得します。 サービス コネクタによって追加された環境変数から接続情報を取得し、Azure Cosmos DB for Cassandra に接続します。 次のコードを使用する場合は、使用する認証の種類のコード スニペットの部分をコメント解除します。
using System;
using System.Security.Authentication;
using System.Net.Security;
using System.Net.Http;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;
using Cassandra;
using Azure.Identity;
public class Program
{
public static async Task Main()
{
var cassandraContactPoint = Environment.GetEnvironmentVariable("AZURE_COSMOS_CONTACTPOINT");
var userName = Environment.GetEnvironmentVariable("AZURE_COSMOS_USERNAME");
var cassandraPort = Int32.Parse(Environment.GetEnvironmentVariable("AZURE_COSMOS_PORT"));
var cassandraKeyspace = Environment.GetEnvironmentVariable("AZURE_COSMOS_KEYSPACE");
var listKeyUrl = Environment.GetEnvironmentVariable("AZURE_COSMOS_LISTKEYURL");
var scope = Environment.GetEnvironmentVariable("AZURE_COSMOS_SCOPE");
// Uncomment the following lines corresponding to the authentication type you want to use.
// For system-assigned identity.
// var tokenProvider = new DefaultAzureCredential();
// For user-assigned identity.
// var tokenProvider = new DefaultAzureCredential(
// new DefaultAzureCredentialOptions
// {
// ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_COSMOS_CLIENTID");
// }
// );
// For service principal.
// var tenantId = Environment.GetEnvironmentVariable("AZURE_COSMOS_TENANTID");
// var clientId = Environment.GetEnvironmentVariable("AZURE_COSMOS_CLIENTID");
// var clientSecret = Environment.GetEnvironmentVariable("AZURE_COSMOS_CLIENTSECRET");
// var tokenProvider = new ClientSecretCredential(tenantId, clientId, clientSecret);
// Acquire the access token.
AccessToken accessToken = await tokenProvider.GetTokenAsync(
new TokenRequestContext(scopes: new string[]{ scope }));
// Get the password.
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {accessToken.Token}");
var response = await httpClient.POSTAsync(listKeyUrl);
var responseBody = await response.Content.ReadAsStringAsync();
var keys = JsonConvert.DeserializeObject<Dictionary<string, string>>(responseBody);
var password = keys["primaryMasterKey"];
// Connect to Azure Cosmos DB for Cassandra
var options = new Cassandra.SSLOptions(SslProtocols.Tls12, true, ValidateServerCertificate);
options.SetHostNameResolver((ipAddress) => cassandraContactPoint);
Cluster cluster = Cluster
.Builder()
.WithCredentials(userName, password)
.WithPort(cassandraPort)
.AddContactPoint(cassandraContactPoint).WithSSL(options).Build();
ISession session = await cluster.ConnectAsync();
}
public static bool ValidateServerCertificate
(
object sender,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors
)
{
if (sslPolicyErrors == SslPolicyErrors.None)
return true;
Console.WriteLine("Certificate error: {0}", sslPolicyErrors);
// Do not allow this client to communicate with unauthenticated servers.
return false;
}
}
azure-identity を使用してマネージド ID またはサービス プリンシパルで認証し、AZURE_COSMOS_LISTKEYURL に要求を送信してパスワードを取得します。 サービス コネクタによって追加された環境変数から接続情報を取得し、Azure Cosmos DB for Cassandra に接続します。 次のコードを使用する場合は、使用する認証型のコード スニペットの一部をコメント解除します。
from cassandra.cluster import Cluster
from ssl import PROTOCOL_TLSv1_2, SSLContext, CERT_NONE
from cassandra.auth import PlainTextAuthProvider
import requests
from azure.identity import ManagedIdentityCredential, ClientSecretCredential
username = os.getenv('AZURE_COSMOS_USERNAME')
contactPoint = os.getenv('AZURE_COSMOS_CONTACTPOINT')
port = os.getenv('AZURE_COSMOS_PORT')
keyspace = os.getenv('AZURE_COSMOS_KEYSPACE')
listKeyUrl = os.getenv('AZURE_COSMOS_LISTKEYURL')
scope = os.getenv('AZURE_COSMOS_SCOPE')
# Uncomment the following lines corresponding to the authentication type you want to use.
# For system-assigned managed identity
# cred = ManagedIdentityCredential()
# For user-assigned managed identity
# managed_identity_client_id = os.getenv('AZURE_COSMOS_CLIENTID')
# cred = ManagedIdentityCredential(client_id=managed_identity_client_id)
# For service principal
# tenant_id = os.getenv('AZURE_COSMOS_TENANTID')
# client_id = os.getenv('AZURE_COSMOS_CLIENTID')
# client_secret = os.getenv('AZURE_COSMOS_CLIENTSECRET')
# cred = ClientSecretCredential(tenant_id=tenant_id, client_id=client_id, client_secret=client_secret)
# Get the password
session = requests.Session()
token = cred.get_token(scope)
response = session.post(listKeyUrl, headers={"Authorization": "Bearer {}".format(token.token)})
keys_dict = response.json()
password = keys_dict['primaryMasterKey']
# Connect to Azure Cosmos DB for Cassandra.
ssl_context = SSLContext(PROTOCOL_TLSv1_2)
ssl_context.verify_mode = CERT_NONE
auth_provider = PlainTextAuthProvider(username, password)
cluster = Cluster([contactPoint], port = port, auth_provider=auth_provider,ssl_context=ssl_context)
session = cluster.connect()
依存関係をインストールします。
go get github.com/gocql/gocql
go get "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
go get "github.com/Azure/azure-sdk-for-go/sdk/azcore"
コードでは、azidentity を介してアクセス トークンを取得し、それを使用してパスワードを取得します。 サービス コネクタによって追加された環境変数から接続情報を取得し、Azure Cosmos DB for Cassandra に接続します。 次のコードを使用する場合は、使用する認証の種類のコード スニペットの部分をコメント解除します。
Microsoft では、使用可能な最も安全な認証フローを使用することをお勧めします。 この手順で説明されている認証フローでは、アプリケーションで非常に高い信頼度が要求されるため、他のフローには存在しないリスクが伴います。 このフローは、マネージド ID など、より安全なフローが実行可能ではない場合にのみ使用してください。
サービス コネクタによって追加された環境変数から接続情報を取得し、Azure Cosmos DB for Cassandra に接続します。
using System;
using System.Security.Authentication;
using System.Net.Security;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;
using Cassandra;
public class Program
{
public static async Task Main()
{
var cassandraContactPoint = Environment.GetEnvironmentVariable("AZURE_COSMOS_CONTACTPOINT");
var userName = Environment.GetEnvironmentVariable("AZURE_COSMOS_USERNAME");
var password = Environment.GetEnvironmentVariable("AZURE_COSMOS_PASSWORD");
var cassandraPort = Int32.Parse(Environment.GetEnvironmentVariable("AZURE_COSMOS_PORT"));
var cassandraKeyspace = Environment.GetEnvironmentVariable("AZURE_COSMOS_KEYSPACE");
var options = new Cassandra.SSLOptions(SslProtocols.Tls12, true, ValidateServerCertificate);
options.SetHostNameResolver((ipAddress) => cassandraContactPoint);
Cluster cluster = Cluster
.Builder()
.WithCredentials(userName, password)
.WithPort(cassandraPort)
.AddContactPoint(cassandraContactPoint).WithSSL(options).Build();
ISession session = await cluster.ConnectAsync();
}
public static bool ValidateServerCertificate
(
object sender,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors
)
{
if (sslPolicyErrors == SslPolicyErrors.None)
return true;
Console.WriteLine("Certificate error: {0}", sslPolicyErrors);
// Do not allow this client to communicate with unauthenticated servers.
return false;
}
}
サービス コネクタによって追加された環境変数から接続情報を取得し、Azure Cosmos DB for Cassandra に接続します。
const cassandra = require("cassandra-driver");
let username = process.env.AZURE_COSMOS_USERNAME;
let password = process.env.AZURE_COSMOS_PASSWORD;
let contactPoint = process.env.AZURE_COSMOS_CONTACTPOINT;
let port = process.env.AZURE_COSMOS_PORT;
let keyspace = process.env.AZURE_COSMOS_KEYSPACE;
let authProvider = new cassandra.auth.PlainTextAuthProvider(
username,
password
);
let client = new cassandra.Client({
contactPoints: [`${contactPoint}:${port}`],
authProvider: authProvider,
localDataCenter: 'datacenter1',
sslOptions: {
secureProtocol: "TLSv1_2_method"
},
});
client.connect();
クライアント ライブラリ Azure.Identity を使用して、マネージド ID またはサービス プリンシパルのアクセス トークンを取得します。 アクセス トークンと AZURE_COSMOS_LISTKEYURL を使用してパスワードを取得します。 サービス コネクタによって追加された環境変数から接続情報を取得し、Azure Cosmos DB for Cassandra に接続します。 次のコードを使用する場合は、使用する認証の種類のコード スニペットの部分をコメント解除します。
using System;
using System.Security.Authentication;
using System.Net.Security;
using System.Net.Http;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;
using Cassandra;
using Azure.Identity;
public class Program
{
public static async Task Main()
{
var cassandraContactPoint = Environment.GetEnvironmentVariable("AZURE_COSMOS_CONTACTPOINT");
var userName = Environment.GetEnvironmentVariable("AZURE_COSMOS_USERNAME");
var cassandraPort = Int32.Parse(Environment.GetEnvironmentVariable("AZURE_COSMOS_PORT"));
var cassandraKeyspace = Environment.GetEnvironmentVariable("AZURE_COSMOS_KEYSPACE");
var listKeyUrl = Environment.GetEnvironmentVariable("AZURE_COSMOS_LISTKEYURL");
var scope = Environment.GetEnvironmentVariable("AZURE_COSMOS_SCOPE");
// Uncomment the following lines corresponding to the authentication type you want to use.
// For system-assigned identity.
// var tokenProvider = new DefaultAzureCredential();
// For user-assigned identity.
// var tokenProvider = new DefaultAzureCredential(
// new DefaultAzureCredentialOptions
// {
// ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_COSMOS_CLIENTID");
// }
// );
// For service principal.
// var tenantId = Environment.GetEnvironmentVariable("AZURE_COSMOS_TENANTID");
// var clientId = Environment.GetEnvironmentVariable("AZURE_COSMOS_CLIENTID");
// var clientSecret = Environment.GetEnvironmentVariable("AZURE_COSMOS_CLIENTSECRET");
// var tokenProvider = new ClientSecretCredential(tenantId, clientId, clientSecret);
// Acquire the access token.
AccessToken accessToken = await tokenProvider.GetTokenAsync(
new TokenRequestContext(scopes: new string[]{ scope }));
// Get the password.
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {accessToken.Token}");
var response = await httpClient.POSTAsync(listKeyUrl);
var responseBody = await response.Content.ReadAsStringAsync();
var keys = JsonConvert.DeserializeObject<Dictionary<string, string>>(responseBody);
var password = keys["primaryMasterKey"];
// Connect to Azure Cosmos DB for Cassandra
var options = new Cassandra.SSLOptions(SslProtocols.Tls12, true, ValidateServerCertificate);
options.SetHostNameResolver((ipAddress) => cassandraContactPoint);
Cluster cluster = Cluster
.Builder()
.WithCredentials(userName, password)
.WithPort(cassandraPort)
.AddContactPoint(cassandraContactPoint).WithSSL(options).Build();
ISession session = await cluster.ConnectAsync();
}
public static bool ValidateServerCertificate
(
object sender,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors
)
{
if (sslPolicyErrors == SslPolicyErrors.None)
return true;
Console.WriteLine("Certificate error: {0}", sslPolicyErrors);
// Do not allow this client to communicate with unauthenticated servers.
return false;
}
}
azure-identity を使用してマネージド ID またはサービス プリンシパルで認証し、AZURE_COSMOS_LISTKEYURL に要求を送信してパスワードを取得します。 サービス コネクタによって追加された環境変数から接続情報を取得し、Azure Cosmos DB for Cassandra に接続します。 次のコードを使用する場合は、使用する認証型のコード スニペットの一部をコメント解除します。
from cassandra.cluster import Cluster
from ssl import PROTOCOL_TLSv1_2, SSLContext, CERT_NONE
from cassandra.auth import PlainTextAuthProvider
import requests
from azure.identity import ManagedIdentityCredential, ClientSecretCredential
username = os.getenv('AZURE_COSMOS_USERNAME')
contactPoint = os.getenv('AZURE_COSMOS_CONTACTPOINT')
port = os.getenv('AZURE_COSMOS_PORT')
keyspace = os.getenv('AZURE_COSMOS_KEYSPACE')
listKeyUrl = os.getenv('AZURE_COSMOS_LISTKEYURL')
scope = os.getenv('AZURE_COSMOS_SCOPE')
# Uncomment the following lines corresponding to the authentication type you want to use.
# For system-assigned managed identity
# cred = ManagedIdentityCredential()
# For user-assigned managed identity
# managed_identity_client_id = os.getenv('AZURE_COSMOS_CLIENTID')
# cred = ManagedIdentityCredential(client_id=managed_identity_client_id)
# For service principal
# tenant_id = os.getenv('AZURE_COSMOS_TENANTID')
# client_id = os.getenv('AZURE_COSMOS_CLIENTID')
# client_secret = os.getenv('AZURE_COSMOS_CLIENTSECRET')
# cred = ClientSecretCredential(tenant_id=tenant_id, client_id=client_id, client_secret=client_secret)
# Get the password
session = requests.Session()
token = cred.get_token(scope)
response = session.post(listKeyUrl, headers={"Authorization": "Bearer {}".format(token.token)})
keys_dict = response.json()
password = keys_dict['primaryMasterKey']
# Connect to Azure Cosmos DB for Cassandra.
ssl_context = SSLContext(PROTOCOL_TLSv1_2)
ssl_context.verify_mode = CERT_NONE
auth_provider = PlainTextAuthProvider(username, password)
cluster = Cluster([contactPoint], port = port, auth_provider=auth_provider,ssl_context=ssl_context)
session = cluster.connect()
依存関係をインストールします。
go get github.com/gocql/gocql
go get "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
go get "github.com/Azure/azure-sdk-for-go/sdk/azcore"
コードでは、azidentity を介してアクセス トークンを取得し、それを使用してパスワードを取得します。 サービス コネクタによって追加された環境変数から接続情報を取得し、Azure Cosmos DB for Cassandra に接続します。 次のコードを使用する場合は、使用する認証の種類のコード スニペットの部分をコメント解除します。