1
0

サブアカウント版とインスタンス版のDestinationの関係

Posted at

はじめに

この記事は SAP Advent Calendar 2023 の12月16日分の記事として執筆しています。

概要

SAP BTPの接続先を定義するDestinationサービスについて、疑問に思ったことがあったので調査しました。
ブログ自体初投稿なのでお手柔らかにお願いします。

対象読者様

  • Destinationサービス使用したアプリケーション開発の経験がある方
  • 最低限のJava知識がある方

ことの発端

皆さんご存知の通り、Destinationにはサブアカウント画面から操作するDestinationとインスタンス画面から操作するDestinationの2つがあります。
通常、DestinationをCFのアプリから使用する際は、Destinationインスタンスとアプリをサービスバインディングさせて使用します。
ここで疑問に思ったのが、本来CFアプリケーションとは何も紐づきがないはずのサブアカウントDestinationの情報をなぜか取得できます。
この疑問を解消すべく検証をしてみました。

全体イメージ
イメージ

手っ取り早く結論

Destinationインスタンスの役割は

  • 接続情報の管理
  • サブアカウントのDestination情報を自動取得している可能性が高い

です。(内部構造がわからないので断定はできません)

image.png

検証

前提条件

  • 言語はJava
  • SAP Cloud SDKを使用
  • Destinationの接続先はSAP SandBox環境のBusiness Partner APIを使用
  • プログラムは取得したAPIを文字列にして返すだけ
  • どのDesitnationかわかりやすいようAdditional Properipiesの値を合わせて返却
  • ソースコード
DestinationService.java
@Service
public class DestinationService {
	
	public String getBusinessPartner() {
		try {
			final HttpDestination destination = DestinationAccessor.getDestination("DestinationName").asHttp();
            // どのDesitnationかわかりやすいようAdditional Properipiesの値を取得
            final String destinationPropety = destination.get("Test.Propety").toString();
			final BusinessPartnerService service = new DefaultBusinessPartnerService();
			final List<BusinessPartner> result = service.getAllBusinessPartner().top(5).executeRequest(destination);
			return "destinationPropety:" + destinationPropety + " " + result;	
		} catch (Exception e) {
			return e.toString();
		}

	}

}	

検証① 通常パターン

Destinationインスタンスとアプリケーションをサービスバインディングさせて実行
検証①イメージ

結果

当たり前だけど使用できる
image.png

検証② 失敗パターン

Destinationインスタンスとアプリケーションをサービスバインディングさせないで実行
image.png

結果

これも当たり前だけど使用できない
image.png

検証③ サブアカウントのDestination取得

Destinationインスタンスとアプリケーションをサービスバインディングさせたうえで、サブアカウントDestinationにも接続情報を設定し実行。(インスタンスDestinationには接続情報を設定しない。)
image.png

結果

取得できる!!
またインスタンスのDestinationには何も情報を設定していないので、インスタンスDestinationの設定有無に関わらず、サービスバインディングさえすればサブアカウントDestinationの情報は取得可能!!
image.png

検証④ バインディングをせずサブアカウントDestinationを取得

Destinationインスタンス自体は存在するが、アプリケーションとサービスバインディングをしない状態でサブアカウントDestinationを取得するよう実行。
image.png

結果

取得できない!!
image.png

検証①~④の結果からすると

  • インスタンスDestinationとアプリケーションがサービスバインディングされていればサブアカウントDestinationの設定は不要(検証①、②)
  • サブアカウントDestinationを使用する場合は必ずインスタンスDestinationとアプリケーションのサービスバインディングが必要(検証④)
  • ただしインスタンスDestinationには何も設定しなくても接続することが可能(検証③)

になり、Destinationインスタンスは接続先情報の管理とは別に、サブアカウントDestinationの情報を取得する役割があるのではないかと思います。(内部構造がわからないので、断定はできませんが)

まとめ

内容としてはHelpPortalを探せば見つかりそうな気もしますが、実際に手を動かして検証することで、より深い理解ができました。
やはり手を動かすは正義です笑

番外編 サブアカウントとインスタンスで同名Destinationを作成した場合は?

サブアカウントDestinationをインスタンスDestinationからそれぞれ接続情報を取得できることがわかりましたが、Destination名が同名の場合はどうなるでしょう?

image.png

結果

インスタンスDestinationが優先されます。使用する際は注意しましょう。

image.png

参考
DestinationService.java
@Service
public class DestinationService {
	
	public String getBusinessPartner() {
		try {
			final HttpDestination destination = DestinationAccessor.getDestination("Same").asHttp();
            final String destinationPropety = destination.get("Test.Propety").toString();
			final BusinessPartnerService service = new DefaultBusinessPartnerService();
			final List<BusinessPartner> result = service.getAllBusinessPartner().top(5).executeRequest(destination);
			return "destinationPropety:" + destinationPropety + " " + result;	
		} catch (Exception e) {
			return e.toString();
		}

	}

}	
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0