【CAI】API開発の流れを整理しつつ、データアクセスサービスコネクタでDBから値を取得してみた

Informatica Cloud Application IntegrationでAPI開発の流れと、DBからデータを取得するデータアクセスサービスコネクタについて解説。
2024.02.19

はじめに

こんにちは、データアナリティクス事業本部ビジネスソリューション部SAチームの渡部です。

今回はInformaticaのCloud Application Integration(以降、CAI)でDBからデータ抽出をするAPI連携について作成してみたので、その開発風景をお届けします。
最近API設計から開発までの流れを棚卸しすることが多いため、その流れも記載するようにしてみます。

なお今回は以下の記事作成時にはなかったデータアクセスサービスコネクタ(以降、DAS)を使用します。

以下の記事で使用したJDBC Generic Cloud Adapterとの違いは以下のとおりです。

  • プロセスの処理時間が短縮する
  • SQLでクエリが記述できプロセス作成が効率的である

お話すること

  • DASを用いたDBからのAPI連携
  • CAIでのAPI設計から開発までの流れ

構成

今回の作成するAPI連携の概要図は以下のとおりです。

  • API公開環境:Informatica Cloud Server
  • RDSはPostgreSQL
    • SecureAgentサーバーからのみからのアクセスを受け付ける

DBには以下のデータを格納しております(PythonのFakerライブラリを使用して作成)。
▶︎を押してください。

DDL & DML
CREATE TABLE infa.users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    age INT,
    address TEXT
);
INSERT INTO users (id, name, age, address) VALUES (1, '山崎 加奈', 56, '香川県新宿区下吉羽41丁目20番3号 クレスト上高野359');
INSERT INTO users (id, name, age, address) VALUES (2, '鈴木 結衣', NULL, '和歌山県川崎市多摩区四番町4丁目1番13号 脚折町ハイツ979');
INSERT INTO users (id, name, age, address) VALUES (3, '小林 太一', NULL, '和歌山県文京区丸の内20丁目9番13号 シャルム氏家新田132');
INSERT INTO users (id, name, age, address) VALUES (4, '山下 洋介', 51, '沖縄県山武郡芝山町湯宮9丁目5番5号 前弥六コーポ806');
INSERT INTO users (id, name, age, address) VALUES (5, '伊藤 明美', 67, '兵庫県横浜市都筑区西神田23丁目22番16号');
INSERT INTO users (id, name, age, address) VALUES (6, '加藤 裕美子', 39, NULL);
INSERT INTO users (id, name, age, address) VALUES (7, '山本 結衣', 52, '神奈川県横浜市鶴見区三筋33丁目18番6号 蔵前アーバン989');
INSERT INTO users (id, name, age, address) VALUES (8, '高橋 聡太郎', 52, '山口県東村山市勝どき36丁目2番12号 コーポ天神島170');
INSERT INTO users (id, name, age, address) VALUES (9, '山本 治', 65, '京都府東久留米市松浦町25丁目8番11号');
INSERT INTO users (id, name, age, address) VALUES (10, '山本 真綾', 28, '静岡県世田谷区丸の内JPタワー42丁目18番20号');
INSERT INTO users (id, name, age, address) VALUES (11, '佐々木 あすか', 38, '長野県中央区北上野41丁目8番16号 コート鳥越649');
INSERT INTO users (id, name, age, address) VALUES (12, '佐藤 拓真', 66, '青森県西多摩郡瑞穂町前弥六南町28丁目27番20号');
INSERT INTO users (id, name, age, address) VALUES (13, '鈴木 幹', 66, NULL);
INSERT INTO users (id, name, age, address) VALUES (14, '中川 くみ子', 38, '高知県豊島区細竹34丁目13番17号 日光ハイツ078');
INSERT INTO users (id, name, age, address) VALUES (15, '中村 京助', 31, '山梨県四街道市脚折町11丁目15番8号 西浅草コート291');
INSERT INTO users (id, name, age, address) VALUES (16, '佐藤 直子', 60, '愛媛県川崎市多摩区西小来川31丁目17番18号 平河町コート517');
INSERT INTO users (id, name, age, address) VALUES (17, '藤原 洋介', 28, '愛媛県長生郡長柄町秋葉原41丁目11番1号');
INSERT INTO users (id, name, age, address) VALUES (18, '松田 花子', 57, '福岡県西東京市竜泉29丁目2番10号 パレス柿木沢118');
INSERT INTO users (id, name, age, address) VALUES (19, '渡辺 太郎', 21, '福岡県あきる野市日比谷公園9丁目9番2号 パレス柿木沢048');
INSERT INTO users (id, name, age, address) VALUES (20, '佐藤 裕美子', 67, NULL);
INSERT INTO users (id, name, age, address) VALUES (21, '田中 淳', NULL, '三重県横浜市港北区白金台22丁目23番20号');
INSERT INTO users (id, name, age, address) VALUES (22, '山本 裕樹', 44, '埼玉県横浜市旭区皇居外苑21丁目26番13号 コート丸の内JPタワー156');
INSERT INTO users (id, name, age, address) VALUES (23, '林 直子', 64, NULL);
INSERT INTO users (id, name, age, address) VALUES (24, '松田 翼', 65, '長野県福生市秋葉原23丁目10番3号 コーポ土沢707');
INSERT INTO users (id, name, age, address) VALUES (25, '山崎 涼平', 44, '三重県小金井市月島11丁目4番15号 シャルム京橋307');
INSERT INTO users (id, name, age, address) VALUES (26, '田中 知実', NULL, '高知県長生郡一宮町芝浦34丁目3番2号');
INSERT INTO users (id, name, age, address) VALUES (27, '清水 桃子', 51, '宮崎県中野区鶴ヶ丘34丁目17番19号');
INSERT INTO users (id, name, age, address) VALUES (28, '佐々木 くみ子', 68, '広島県豊島区長畑42丁目18番11号 湯本塩原シャルム543');
INSERT INTO users (id, name, age, address) VALUES (29, '伊藤 拓真', 54, '栃木県富里市無栗屋14丁目20番17号 クレスト勝どき076');
INSERT INTO users (id, name, age, address) VALUES (30, '佐々木 聡太郎', NULL, NULL);
INSERT INTO users (id, name, age, address) VALUES (31, '鈴木 直子', 40, '高知県渋谷区前弥六10丁目9番10号');
INSERT INTO users (id, name, age, address) VALUES (32, '林 京助', 46, NULL);
INSERT INTO users (id, name, age, address) VALUES (33, '加藤 くみ子', 78, NULL);
INSERT INTO users (id, name, age, address) VALUES (34, '山田 京助', NULL, '千葉県香取郡多古町中川崎6丁目4番19号 パレス手岡149');
INSERT INTO users (id, name, age, address) VALUES (35, '石井 結衣', 44, NULL);
INSERT INTO users (id, name, age, address) VALUES (36, '井上 花子', 18, NULL);
INSERT INTO users (id, name, age, address) VALUES (37, '山口 英樹', 51, NULL);
INSERT INTO users (id, name, age, address) VALUES (38, '西村 結衣', 78, '宮城県香取郡神崎町花川戸17丁目15番14号 コート小入568');
INSERT INTO users (id, name, age, address) VALUES (39, '前田 京助', 23, NULL);
INSERT INTO users (id, name, age, address) VALUES (40, '山田 晃', NULL, NULL);
INSERT INTO users (id, name, age, address) VALUES (41, '村上 和也', 72, NULL);
INSERT INTO users (id, name, age, address) VALUES (42, '松本 亮介', 33, '和歌山県新宿区四番町25丁目13番9号');
INSERT INTO users (id, name, age, address) VALUES (43, '佐藤 聡太郎', 60, '新潟県品川区脚折3丁目15番20号 元浅草コーポ900');
INSERT INTO users (id, name, age, address) VALUES (44, '前田 太一', 36, '鳥取県八王子市東神田15丁目27番20号 パーク月島982');
INSERT INTO users (id, name, age, address) VALUES (45, '山口 裕樹', 56, '長崎県夷隅郡御宿町蟇沼4丁目24番2号 松石アーバン332');
INSERT INTO users (id, name, age, address) VALUES (46, '小川 拓真', NULL, '宮崎県横浜市磯子区幸手22丁目21番6号 パレス白金台465');
INSERT INTO users (id, name, age, address) VALUES (47, '佐藤 和也', 24, '宮城県印旛郡栄町下宇和田10丁目8番9号 シャルム芝大門630');
INSERT INTO users (id, name, age, address) VALUES (48, '井上 涼平', 73, '徳島県横浜市泉区芝浦16丁目21番1号 百村シャルム407');
INSERT INTO users (id, name, age, address) VALUES (49, '阿部 裕美子', 32, NULL);
INSERT INTO users (id, name, age, address) VALUES (50, '松本 学', 80, '秋田県長生郡一宮町油井28丁目7番17号 山中新田ハイツ574');
INSERT INTO users (id, name, age, address) VALUES (51, '鈴木 陽一', NULL, NULL);
INSERT INTO users (id, name, age, address) VALUES (52, '佐々木 あすか', 27, '静岡県山武郡芝山町四番町31丁目24番19号 芝大門パーク283');
INSERT INTO users (id, name, age, address) VALUES (53, '遠藤 晃', 64, '滋賀県大網白里市花島36丁目22番10号');
INSERT INTO users (id, name, age, address) VALUES (54, '山本 裕樹', NULL, '奈良県福生市西小来川20丁目1番7号 中小来川コート135');
INSERT INTO users (id, name, age, address) VALUES (55, '斉藤 陽一', 37, NULL);
INSERT INTO users (id, name, age, address) VALUES (56, '遠藤 七夏', 78, '高知県鴨川市元浅草9丁目24番12号');
INSERT INTO users (id, name, age, address) VALUES (57, '青木 亮介', NULL, '岐阜県夷隅郡大多喜町港南16丁目25番10号');
INSERT INTO users (id, name, age, address) VALUES (58, '鈴木 千代', 54, NULL);
INSERT INTO users (id, name, age, address) VALUES (59, '橋本 直子', 77, '群馬県横浜市南区虎ノ門37丁目9番4号 コーポ日本堤864');
INSERT INTO users (id, name, age, address) VALUES (60, '中川 晃', 48, NULL);
INSERT INTO users (id, name, age, address) VALUES (61, '坂本 智也', 60, '滋賀県三鷹市箭坪18丁目7番2号');
INSERT INTO users (id, name, age, address) VALUES (62, '吉田 裕太', 51, '奈良県横浜市中区細野6丁目17番16号 横林アーバン927');
INSERT INTO users (id, name, age, address) VALUES (63, '後藤 七夏', 52, '鳥取県横浜市港北区京橋17丁目2番11号');
INSERT INTO users (id, name, age, address) VALUES (64, '藤田 さゆり', 45, NULL);
INSERT INTO users (id, name, age, address) VALUES (65, '佐々木 篤司', 32, '島根県小金井市勝どき19丁目5番5号 パレス羽折町269');
INSERT INTO users (id, name, age, address) VALUES (66, '森 くみ子', 43, '広島県印旛郡本埜村虎ノ門虎ノ門ヒルズ森タワー32丁目2番17号 上野桜木シャルム698');
INSERT INTO users (id, name, age, address) VALUES (67, '石井 結衣', NULL, '宮城県山武郡横芝光町皇居外苑10丁目6番10号');
INSERT INTO users (id, name, age, address) VALUES (68, '岡本 零', NULL, NULL);
INSERT INTO users (id, name, age, address) VALUES (69, '加藤 舞', 23, '岐阜県八丈島八丈町南赤田23丁目25番13号 鶴ヶ丘アーバン614');
INSERT INTO users (id, name, age, address) VALUES (70, '佐藤 裕美子', 44, '新潟県御蔵島村鳥越15丁目17番6号 シティ横林468');
INSERT INTO users (id, name, age, address) VALUES (71, '小林 美加子', 69, NULL);
INSERT INTO users (id, name, age, address) VALUES (72, '松田 幹', 33, '千葉県八街市外国府間29丁目18番10号 コーポ神明内875');
INSERT INTO users (id, name, age, address) VALUES (73, '木村 智也', NULL, '奈良県調布市明石町39丁目17番9号');
INSERT INTO users (id, name, age, address) VALUES (74, '近藤 太郎', 38, '北海道八街市千束6丁目4番7号 パレス六番町920');
INSERT INTO users (id, name, age, address) VALUES (75, '高橋 千代', 78, '岐阜県香取市五味ヶ谷14丁目9番12号');
INSERT INTO users (id, name, age, address) VALUES (76, '佐藤 太郎', NULL, '北海道町田市蔵前29丁目16番1号 神明内パーク539');
INSERT INTO users (id, name, age, address) VALUES (77, '林 結衣', 70, '石川県横浜市都筑区細野13丁目22番7号 パーク下吉羽969');
INSERT INTO users (id, name, age, address) VALUES (78, '石井 晃', 51, '和歌山県川崎市多摩区氏家新田5丁目14番17号 芝公園シティ462');
INSERT INTO users (id, name, age, address) VALUES (79, '鈴木 結衣', NULL, NULL);
INSERT INTO users (id, name, age, address) VALUES (80, '山本 太一', 74, NULL);
INSERT INTO users (id, name, age, address) VALUES (81, '近藤 くみ子', 41, '岩手県葛飾区小入18丁目1番2号');
INSERT INTO users (id, name, age, address) VALUES (82, '鈴木 裕太', NULL, '香川県渋谷区虎ノ門虎ノ門ヒルズ森タワー6丁目21番6号 東浅草シャルム864');
INSERT INTO users (id, name, age, address) VALUES (83, '高橋 直子', NULL, NULL);
INSERT INTO users (id, name, age, address) VALUES (84, '高橋 稔', 77, '広島県大田区港南5丁目24番17号');
INSERT INTO users (id, name, age, address) VALUES (85, '小林 聡太郎', 65, '滋賀県袖ケ浦市方京20丁目13番3号 日光アーバン239');
INSERT INTO users (id, name, age, address) VALUES (86, '青木 拓真', 56, '新潟県武蔵村山市上吉羽5丁目18番11号');
INSERT INTO users (id, name, age, address) VALUES (87, '中村 あすか', NULL, '神奈川県板橋区中宮祠28丁目26番8号');
INSERT INTO users (id, name, age, address) VALUES (88, '清水 浩', 69, '神奈川県利島村氏家新田38丁目4番17号');
INSERT INTO users (id, name, age, address) VALUES (89, '池田 加奈', 36, '神奈川県香取郡東庄町北上野7丁目1番14号');
INSERT INTO users (id, name, age, address) VALUES (90, '伊藤 裕太', 62, NULL);
INSERT INTO users (id, name, age, address) VALUES (91, '岡本 幹', NULL, '愛知県川崎市中原区皇居外苑18丁目25番14号 クレスト卯の里419');
INSERT INTO users (id, name, age, address) VALUES (92, '坂本 幹', NULL, '福島県あきる野市鶴ヶ丘32丁目22番17号 パーク東上野106');
INSERT INTO users (id, name, age, address) VALUES (93, '木村 聡太郎', NULL, '茨城県大島町百村20丁目11番4号 パレス北上野054');
INSERT INTO users (id, name, age, address) VALUES (94, '田中 加奈', 24, '徳島県三宅島三宅村土呂部21丁目9番12号 パーク虎ノ門125');
INSERT INTO users (id, name, age, address) VALUES (95, '中村 さゆり', 49, '高知県八千代市港南2丁目16番18号 パレス芝大門382');
INSERT INTO users (id, name, age, address) VALUES (96, '前田 洋介', 58, '三重県横浜市西区西小来川32丁目15番12号');
INSERT INTO users (id, name, age, address) VALUES (97, '佐藤 太郎', 54, '長野県八丈島八丈町北青山19丁目10番6号');
INSERT INTO users (id, name, age, address) VALUES (98, '中村 浩', 74, NULL);
INSERT INTO users (id, name, age, address) VALUES (99, '山本 浩', 58, NULL);
INSERT INTO users (id, name, age, address) VALUES (100, '山田 加奈', NULL, '徳島県横浜市鶴見区花川戸23丁目25番18号 湯本塩原クレスト302');
INSERT INTO users (id, name, age, address) VALUES (101, '清水 京助', 26, '新潟県川崎市多摩区幸手15丁目17番7号 ハイツ南郷屋813');
INSERT INTO users (id, name, age, address) VALUES (102, '井上 治', 22, '奈良県横浜市金沢区独鈷沢15丁目21番10号 湯宮シャルム331');
INSERT INTO users (id, name, age, address) VALUES (103, '山崎 美加子', 69, NULL);
INSERT INTO users (id, name, age, address) VALUES (104, '田中 翔太', 42, '鳥取県利島村松が谷42丁目22番18号 パレス長畑860');
INSERT INTO users (id, name, age, address) VALUES (105, '坂本 さゆり', 38, '山形県浦安市松が谷3丁目3番1号');
INSERT INTO users (id, name, age, address) VALUES (106, '橋本 翼', 54, NULL);
INSERT INTO users (id, name, age, address) VALUES (107, '中川 学', 78, '石川県杉並区白金19丁目15番3号 クレスト白金台086');
INSERT INTO users (id, name, age, address) VALUES (108, '近藤 花子', 75, '福井県武蔵野市勝どき2丁目12番10号 アーバン東三島597');
INSERT INTO users (id, name, age, address) VALUES (109, '石井 加奈', 50, '長野県足立区鶴ヶ丘4丁目27番12号');
INSERT INTO users (id, name, age, address) VALUES (110, '井上 拓真', 69, NULL);
INSERT INTO users (id, name, age, address) VALUES (111, '吉田 里佳', 19, '大分県目黒区西関宿19丁目23番7号 西川コート168');
INSERT INTO users (id, name, age, address) VALUES (112, '佐藤 真綾', 43, NULL);
INSERT INTO users (id, name, age, address) VALUES (113, '斎藤 陽一', 64, '滋賀県川崎市多摩区橋場24丁目21番18号 南郷屋コーポ161');
INSERT INTO users (id, name, age, address) VALUES (114, '佐々木 里佳', 27, '徳島県北区皇居外苑23丁目27番4号 シャルム無栗屋488');
INSERT INTO users (id, name, age, address) VALUES (115, '阿部 美加子', 28, '兵庫県西多摩郡日の出町松浦町22丁目2番17号 天神島パーク703');
INSERT INTO users (id, name, age, address) VALUES (116, '長谷川 加奈', 64, '鹿児島県横浜市神奈川区平河町23丁目26番11号');
INSERT INTO users (id, name, age, address) VALUES (117, '石川 翼', 33, '富山県福生市脚折町28丁目24番19号 脚折シティ052');
INSERT INTO users (id, name, age, address) VALUES (118, '鈴木 充', NULL, NULL);
INSERT INTO users (id, name, age, address) VALUES (119, '岡本 直子', 41, NULL);
INSERT INTO users (id, name, age, address) VALUES (120, '井上 治', 62, '広島県北区木立31丁目23番16号 コーポ隼町203');
INSERT INTO users (id, name, age, address) VALUES (121, '前田 直樹', NULL, '高知県四街道市日光15丁目25番10号');
INSERT INTO users (id, name, age, address) VALUES (122, '山本 花子', 35, '高知県袖ケ浦市前弥六南町25丁目27番12号 コーポ細野926');
INSERT INTO users (id, name, age, address) VALUES (123, '松本 康弘', 58, '奈良県神津島村油井30丁目20番15号');
INSERT INTO users (id, name, age, address) VALUES (124, '佐藤 零', 54, NULL);
INSERT INTO users (id, name, age, address) VALUES (125, '田中 修平', 34, '長崎県印西市中宮祠19丁目2番4号 パーク京橋625');
INSERT INTO users (id, name, age, address) VALUES (126, '山下 真綾', NULL, '愛媛県国立市細竹35丁目6番4号 所野コート344');
INSERT INTO users (id, name, age, address) VALUES (127, '池田 洋介', 52, NULL);
INSERT INTO users (id, name, age, address) VALUES (128, '清水 智也', NULL, '富山県富津市勝どき16丁目19番13号 上野桜木クレスト119');
INSERT INTO users (id, name, age, address) VALUES (129, '加藤 陽子', NULL, NULL);
INSERT INTO users (id, name, age, address) VALUES (130, '伊藤 陽一', NULL, '新潟県印旛郡印旛村西神田27丁目3番14号 コート千束701');
INSERT INTO users (id, name, age, address) VALUES (131, '山田 花子', 18, '大分県青梅市津久戸町7丁目8番6号');
INSERT INTO users (id, name, age, address) VALUES (132, '太田 翔太', 78, '香川県日野市上吉羽41丁目22番4号 天神島アーバン050');
INSERT INTO users (id, name, age, address) VALUES (133, '村上 英樹', 78, NULL);
INSERT INTO users (id, name, age, address) VALUES (134, '前田 京助', 58, '秋田県千代田区高田馬場15丁目14番3号 柿木沢新田アーバン473');
INSERT INTO users (id, name, age, address) VALUES (135, '山下 稔', 42, '滋賀県西多摩郡奥多摩町長畑39丁目19番7号');
INSERT INTO users (id, name, age, address) VALUES (136, '阿部 花子', 22, '兵庫県香取郡東庄町藤金22丁目27番20号 吾妻橋シティ291');
INSERT INTO users (id, name, age, address) VALUES (137, '高橋 浩', 24, '愛媛県横浜市泉区筑土八幡町9丁目22番14号 コーポ西関宿633');
INSERT INTO users (id, name, age, address) VALUES (138, '松田 亮介', 57, '長崎県渋谷区秋葉原20丁目26番8号');
INSERT INTO users (id, name, age, address) VALUES (139, '田中 さゆり', NULL, '埼玉県墨田区白金台29丁目1番18号 クレスト西川003');
INSERT INTO users (id, name, age, address) VALUES (140, '鈴木 桃子', 58, '滋賀県小笠原村脚折2丁目7番8号 太田ヶ谷パレス405');
INSERT INTO users (id, name, age, address) VALUES (141, '加藤 晃', 54, NULL);
INSERT INTO users (id, name, age, address) VALUES (142, '田中 加奈', 75, '長野県匝瑳市柿木沢新田23丁目5番14号');
INSERT INTO users (id, name, age, address) VALUES (143, '井上 陽子', NULL, '岐阜県横浜市港北区丸の内JPタワー27丁目5番14号 上高野パーク709');
INSERT INTO users (id, name, age, address) VALUES (144, '佐々木 千代', NULL, '青森県葛飾区柿木沢1丁目17番5号 アーバン台東355');
INSERT INTO users (id, name, age, address) VALUES (145, '林 翼', 35, '岐阜県利島村中宮祠14丁目5番12号');
INSERT INTO users (id, name, age, address) VALUES (146, '井上 治', 59, '奈良県南房総市芝公園1丁目18番4号 コート下宇和田123');
INSERT INTO users (id, name, age, address) VALUES (147, '石井 零', NULL, NULL);
INSERT INTO users (id, name, age, address) VALUES (148, '小林 真綾', 75, '香川県川崎市中原区所野1丁目26番18号 竜泉シティ839');
INSERT INTO users (id, name, age, address) VALUES (149, '山口 淳', 23, NULL);
INSERT INTO users (id, name, age, address) VALUES (150, '田中 陽子', 47, NULL);

01.APIを設計する

API設計には大きく分けて2パターンあります。

  • API開発の設計
  • API管理の設計

今回はAPI開発の設計に焦点を当てます。
作成するAPIの定義は以下とします。

  • プロセス名:p_getUserInfo
  • 処理概要:RDSのPostgreSQLのテーブルusersからIDに合致する会員情報を抽出する
  • 公開環境:Cloud Server(社外公開API想定)
  • メソッド:GET
    • メソッド対象:RDS for PostgreSQLのusersテーブル
    • Swagger:なし(APIからのデータ取得の際に必要です)
  • リクエスト
    • 入力フィールド:id(整数)
  • レスポンス
    • 出力形式:単純なJSON
    • 出力フィールド:id,name,age,address
  • 詳細設定
    • 接続プール数:DASのデフォルト
    • トランザクション分離:READ COMITTED
    • その他:デフォルト

あらかじめAPI定義を開発前にドキュメントやSwaggerに起こしておいて、それから開発に入ります。

02.APIを開発する

今回はボトムアップアプローチ、つまりCAIで手作業で1からプロセスを作成していきます。
InformaticaのサービスAPI Centerを使用すれば、トップダウンアプローチで設計内容から自動的にある程度のプロセスの生成が可能で、上手く使えば楽ができます。  

DASの作成

DASでDBへの接続とデータ抽出・加工・出力を定義します。

まずCAIにログインし新規作成で、データアクセスサービスコネクタフォームを使用をクリックします。

定義タブで、接続設定を記載します。
なおここに記載する設定はあくまで準備とテストの用途のため、本当の接続設定はこの後作成するアプリケーション接続で実施します。
必要な設定を以下に記載します。

  • JDBC Driver:各DBに応じて設定(org.postgresql.Driver)
  • JDBC Connector URL:各DBに応じて設定
  • User Name:DBのユーザー
  • Password:DBユーザーのパスワード
  • その他こちらをご確認ください。

アクションタブで、新規に+マークからアクションを作成します。
アクションでDBへのクエリや入力・出力の形式を設定することができます。

入力タブで、DBに渡す入力フィールドを指定します。
今回はフィルタ条件としてIDを渡して、一致するユーザー情報を取得したいのでIDを設定しました。

SQLバインディングタブで、クエリを記述します。
入力フィールドのidの囲み方には注意です。

select id, name, age, address from users where id = '{$id}'

今回はレスポンスは1行固定のため、最大行数は1と設定しています。

テスト結果タブで、テストをします(出力タブはあとで設定)。
応答ペイロードが想定どおりであれば、プロセスオブジェクトの生成をクリック。

プロセスオブジェクトタブに応答ペイロードから自動的にプロセスオブジェクトが生成されます。
プロセスオブジェクトはXMLタグで囲まれたスキーマを保持できるオブジェクトになります。
なお応答ペイロードについては後続で添付しております。

プロセスオブジェクトの中から値が入っているrowオブジェクトを編集し、po_userInfoとしました。
フィールドも自動生成されているので、必須を選択する場合はします(画像はミスで必須なのにNULL可能となっています)。

先ほど設定しなかった出力タブで、出力フィールドを設定します。
ここではあくまでDASでの出力であり、APIのレスポンス出力はこの後作成するプロセスで設定します。

タイプとして参照、先ほど作成したプロセスオブジェクトを選択して、で以下のとおり設定しました。

let $row := $Response//row
return
 <po_userinfo>
    <id>{$row/id/text()}</id>
    <name>{$row/name/text()}</name>
    <age>{$row/age/text()}</age>
    <address>{$row/address/text()}</address>
</po_userinfo>

1行目の$Response//rowはクエリのレスポンス(以下の応答ペイロード)の、row配下の要素を指しています。

<multiDataAccessResponse>
   <dataAccessResponse>
      <result statementId="SQL Name 1">
         <row>
            <id>25</id>
            <name>山崎 涼平</name>
            <age>44</age>
            <address>三重県小金井市月島11丁目4番15号 シャルム京橋307</address>
         </row>
      </result>
   </dataAccessResponse>
</multiDataAccessResponse>

2行目以降のreturnで、プロセスオブジェクトへの代入をしています。
出力フィールドuserinfoには以下のデータが代入されることとなります。

<po_userinfo>
  <id>25</id>
  <name>山崎 涼平</name>
  <age>44</age>
  <address>三重県小金井市月島11丁目4番15号 シャルム京橋307</address>
</po_userinfo>

CAIでは上記のようなXMLクエリとして、XQueryを使用する場合があるため簡単な使い方は把握する必要があります。
なかなか解説記事は多くないですが、FLWOR式を理解すると問題ないかと思います。

なお今回は簡単のためにプロセスオブジェクトを出力フィールドに指定しましたが、今回のAPI仕様であればカラムごとに出力させることが可能なので、XQueryは使用せずに実装することも可能です。
ローコードツールなので、できるならばローコードで行きたいですね!

これでDASの設定は完了です。  

アプリケーション接続の作成

続いてアプリケーション接続の作成です。
アプリケーション接続では、Informaticaが用意する各種コネクタや、DASを始めとしたサービスコネクタなど、APIで呼びたいコネクタに対する各種設定を定義します。

  • タイプ:先ほど作成したDAS
  • 実行日時:DBに接続するためにSecureAgentサーバーを選択します。日時となっていますが、実行環境の誤訳と思われます。

接続プロパティについてはDASの設定を流用して設定しました。

上述しましたが、APIで使用する各種設定はアプリケーション接続に設定したものが採用されます。
詳しい設定の意味について知りたい場合は、またまたこちらをご確認ください。

なおAdvancedにあたる設定の中でも、以下あたりは決めないといけないかなと思います。

  • 接続プール数
    • DBとの接続において確立と終了のオーバーヘッドをなくすため、あらかじめDBとの確立した接続を保っておく接続の数
  • トランザクション分離レベル
    • トランザクション間のコミットの関係性についての4つのレベル

プロセスの作成

最後にプロセスを作成します。
こちらでAPIの仕様、具体的にはリアルタイムデータ統合や、データのインタラクティブアクセス、業務オーケストレーションの骨子を作り上げます。

今回作成するプロセス全体像は以下のとおりです。

まずは開始ステップの開始タブでAPIの簡単な設定をします。

  • 匿名アクセスを許可します:オン
  • 次で実行(実行環境のこと):クラウドサーバー

入力フィールドタブは今回設定しませんでした。
リクエストボディが必要なPOSTの場合に使用することが多いです。

出力フィールドタブではAPIのレスポンスボディを設定できます。

  • 出力形式:ペイロード全体
    • ペイロード全体にすると出力フィールドに格納されたペイロードがすべてそのままの形で出力されます
  • タイプ:定義された接続タイプ > 作成したアプリケーション接続 > プロセスオブジェクト

一時フィールドタブでは、プロセス上で値を保持するための変数を設定できます。
今回はパスパラメータの値を保持するため、一時フィールドidを設定します。

割り当てステップでは、データ加工・代入処理を記述できます。
今回は関数を使用してパスパラメータの値を一時フィールドidに代入しています。

request:getResourcePathSegments()

サービスステップでは、アプリケーション接続やプロセス、シェルスクリプトなどを呼び出すことが可能です。
今回は作成したアプリケーション接続を呼び出します。

アプリケーション接続の入力として、パスパラメータの値が入った一時フィールドidを代入します。

後続の割り当てステップでアプリケーション接続の出力フィールドであるuserInfoを、プロセスの出力フィールドであるresponseに代入します。

保存して、パブリッシュをすればプロセスは完成です。  

03.APIをテストする

CAIは機能として画面上でテストを実施することができるのですが、今回はパスパラメータをAPIに渡すこともありAPIのテストはPostmanで実施します。
プロセスの右上からプロパティの詳細をクリックします。

するとプロセスの詳細とともにAPIのURLが発行されています。
このサービスURLをコピーします。

Postmanを使用して、コピーしたURLにGETをしてみます。
無事に値が返ってきました。

おわりに

以上、CAIでのAPI連携開発でした。
今回実際に触りつつドキュメントを見つつ確かめてみることで、API開発の流れやCAIの特徴を掴むことができました。

参考情報