オープンソースカンファレンス2022 Online/Fall セミナープログラム

Ansible・Terraform・Packerを活用したソフトウェア開発環境の自動構築

株式会社東芝 ソフトウェア技術センター

安村 明子
akiko.yasumura@toshiba.co.jp© 2022 Toshiba Corporation

Contents

01 はじめに
02 大規模な、ソフトウェア開発環境の構築手順の概要
03 環境構築に使用する構成管理ツール (IaCツール)
04 ソフトウェア開発環境の構築方法の詳細
05 おわりに© 2022 Toshiba Corporation2自己紹介株式会社 東芝 ソフトウェア技術センター 安村 明子
組み込みソフトウェア開発等に従事。現在はソフトウェア開発環境に関する業務を担当。

ソフトウェア技術センターの技術領域
共通要素技術共創ソフトウェア
開発技術

ソフトウェアエンジニアリング技術

OSSを中心とした共通基盤ソフトウェアに関する技術

東芝グループの標準的なソフトウェア開発環境、開発プロセス構築に関する技術

ソフトウェア開発の効率化と信頼性向上に関する技術

・データベース

・共創ソフトウェア開発環境

・ソフトウェア設計

・リアルタイムWebアプリ

・ソフトウェア開発環境

・システムズエンジニアリング

・Linux・ソフトウェア開発プロセス

・テスト設計・テスト自動化

https://www.global.toshiba/jp/technology/corporate/swc.html

東芝グループ向けのソフトウェア開発環境を提供© 2022 Toshiba Corporation3

所属チームのお仕事• 弊社内には、多くのソフトウェア開発部門がある• 各部門で開発に必要なツール環境を構築すると、部門毎にサーバリソースやサーバ管理者が必要になる。また、ノウハウが分散する。
ソフトウェア開発管理ツール群

ソフトウェア開発部門X

ソフトウェア開発部門Y

ソフトウェア開発部門Z分散拠点でソフトウェア開発環境を共有

数百のソフトウェア開発部門に、開発管理ツール群をSaaSサービスで提供© 2022 Toshiba Corporation

4本日の内容• ソフトウェア開発部門ごとに、それぞれのニーズにあった環境を即時提供するため、IaCツール(Ansible, Terraform, Packer)を用いて、環境構築を自動化している。
複数の開発環境を効率よく自動構築・管理するための構築方法の一例をご紹介。
• 構築する際のポイント- IaC ツール Ansible・Terraform・Packer をそれぞれ自動構築のどこで使用するか- 構築する環境ごとに異なる部分の取り扱い方

IaC： Infrastructure as Code© 2022 Toshiba Corporation5

01
はじめに© 2022 Toshiba Corporation

6

ソフトウェア開発を支える様々なOSSツール

開発工程

要求分析

設計
タスク管理

利用する
ツールの例

実装・ビルド .
Redmine

テスト

成果物管理

GitLab.

構成管理・リポジトリ管理

Git

Subversion.
GitLab

ビルド管理

不具合管理

成果物管理

Jenkins

RedmineNexusRepository

GitLab

GitLab

JfrogArtifactory

各開発工程において、ソフトウェア開発用OSSツールが複数存在© 2022 Toshiba Corporation

7

各ソフトウェア開発部門やプロジェクトでのツール利用イメージ1
ソフトウェア開発部門やプロジェクトによって使用するツールが異なる

ソフトウェア開発管理ツール群

RedmineGit

プロジェクト Z部門 Y部門X
Subversion

RedmineGit

Jenkins

Nexus

Repository

GitLab※ ソフトウェア開発部門単位またはプロジェクト単位で、ニーズに応じてツールを提供していますが、 以降のスライドでは、簡単化のためプロジェクト単位での説明とします。

© 2022 Toshiba Corporation

8

各ソフトウェア開発プロジェクトでのツール利用イメージ２

ソフトウェア開発プロジェクトによってツールの設定を変えて提供
ソフトウェア開発プロジェクト毎、ツール毎にURLを変えて提供•-

https://xxx.toshiba.co.jp/projectX/redmine/-https://xxx.toshiba.co.jp/projectX/gitlab/-

https://xxx.toshiba.co.jp/projectY/redmine/•

プロジェクトのニーズに応じて、ツールバージョンや、機能の有効／無効などの設定を行う•

バックアップ等のメンテナンス時刻は、ユーザニーズや負荷などを考慮して設定している
GitLab設定例

バージョン

Registry機能

Pages機能

バックアップ時刻

開発プロジェクトX

14.7.7

有有24:30

開発プロジェクトY

15.3.4

無有

25:00© 2022 Toshiba Corporation9自動生成するシステム概要• AWSを利用• プロジェクト・ツール毎に、AWSに1インスタンスを構築• 短時間で提供できるように、あらかじめ元となる環境（AMI*）を作成しておく• AMIを元に作成するため、1ツールの環境構築は約10-20分で可能
AWS
ゴールデンAMI
GitLab
15.3.4

project1用GitLabを作成(作成の詳細過程は後述)

定期的に最新版で作成

AMI：Amazon Machine Image。AWSのEC2の標準テンプレート
ゴールデンAMI：独自に作成した、EC2テンプレート。必要なツールと構成設定が含まれているAMI
EC2インスタンス： Amazon Elastic Compute Cloud上で稼働するサーバ

AWS EC2
project1
GitLab
15.3.4AWS EC2
project2
GitLab
15.3.4© 2022 Toshiba Corporation1002
大規模な、ソフトウェア開発環境の構築手順の概要© 2022 Toshiba Corporation11

環境構築の流れ
事前準備（半年に１度更新）

利用者からの依頼時に実行ゴールデンAMIを作成

AWS
AMI

ツール共通
ゴールデンAMI

GitLab用

ゴールデンAMI(GitLab15.3.4)

Jenkins用

プロジェクト用のツール環境を構築

プロジェクト用のツール環境

ツール起動

https://xxx.toshiba.co.jp/projectX/gitlab/

ゴールデンAMI(Jenkins 2.346)

・・・

AMI：Amazon Machine Image。AWSのEC2の標準テンプレート
ゴールデンAMI：独自に作成した、EC2テンプレート。必要なツールと構成設定が含まれているAMI© 2022 Toshiba Corporation

12

環境構築手順の概要

4つのステップで環境を構築
ゴールデンAMIを作成
各開発用ツール
AWSでの構築・運用に提供されている 必要な共通のAMI
ツールをインストール

各ツール
共通のAMI

開発ツール毎にそれぞれ構築に必要な処理を実行したAMIを作成

プロジェクト用のツール環境を構築

各ツール用
ゴールデン
AMIから
ゴールデン
サーバ新規作成
AMI

プロジェクト固有ゴールデンの設定値を読みAMIから込み、各プロジェ作成したサーバ クト用のツールを起動

ステップ1

ステップ2

ステップ3

ステップ4

Packer, Ansible

Packer, Ansible

Terraform

Ansible各プロジェクト用の設定をしたツール起動環境構築を自動化するためのツール（Ansible, Terraform, Packer）を使用© 2022 Toshiba Corporation13

プロジェクト用ソフトウェア開発ツールの環境立ち上げイメージ
各開発用ツール
AWSでの構築・運用に提供されている 必要な共通のAMI
ツールをインストール

AMI

各ツール共通のAMI開発ツール毎にそれぞれ構築に必要な処理を実行したAMIを作成

ツール共通
AMI

各ツール用
ゴールデン
AMIから
ゴールデン
サーバ新規作成
AMI
ツールA用
ゴールデンAMI

プロジェクト固有ゴールデンの設定値を読みAMIから込み、各プロジェ作成したサーバ クト用のツールを起動
プロジェクトX ツールA用

ツールA 起動
EC2インスタンス

プロジェクトY ツールA用

ツールA 起動
EC2インスタンス

プロジェクトZ ツールA用

ツールA起動EC2インスタンス

プロジェクトX ツールB用

ツールB 起動
EC2インスタンス

プロジェクトY ツールB用

ツールB 起動
EC2インスタンス

プロジェクトX ツールC用

ツールC 起動
EC2インスタンス

プロジェクトZ ツール用

ツールC 起動
EC2インスタンス

EC2インスタンス
EC2インスタンスEC2インスタンス

ツールB用ゴールデンAMI

EC2インスタンス
EC2インスタンス

ツールC用
ゴールデンAMI
AMI： Amazon Machine Image
EC2インスタンス ： Amazon Elastic Compute Cloud上で稼働するサーバ
ゴールデンAMI ： 必要なツールと構成設定が含まれているAMI

各プロジェクト用の設定をした
ツール起動

EC2インスタンス
EC2インスタンス© 2022 Toshiba Corporation14

03
環境構築に使用する構成管理ツール (IaCツール)
Ansible・Terraform・Packer© 2022 Toshiba Corporation

15

構成管理ツール (Infrastructure as Codeツール)で環境を自動構築するメリット• 構築時間の短縮• コード化することによる、インフラ構築手順の明確化と変更管理が可能• 環境構築の属人性の解消• 手動による設定ミスの大幅な削減• 他システムでもコードを再利用可能© 2022 Toshiba Corporation

16

Ansible概要 (1)•Ansibleは、Red Hat 社が開発するオープンソースのインフラ構成管理ツール•Pythonがインストールされているサーバに対して、ソフトウェアのインストールや設定を自動実行することが可能•

実行するために準備が必要なファイル-

Playbook ：構成を宣言 (例：Dockerをインストール、ファイルをコピー、ホスト名を設定…)-インベントリ： 管理対象のサーバの情報

実行(Linuxの場合はSSH接続)

AnsiblePlaybook
構成を記述(.yml)

インベントリ
管理対象のサーバの情報

インベントリ中の、指定されたサーバに対してPlaybookの内容を適用© 2022 Toshiba Corporation

17

Ansible概要 (2)ソフトウェア開発環境構築でのAnsibleの利用目的
サーバに対して、ソフトウェアのインストールや設定を自動実行- AMI作成時： サーバへのソフトウェアのインストール、設定(例えば、Proxy設定など)- 各プロジェクト用のツール起動時： サーバへの設定(ホスト名など)、ツールの設定補足など- 運用でも Ansible を活用。1サーバ(VM)につき1ツール(1インスタンス)の構成での運用は、Ansibleなしでは困難。

- 構成をシェルスクリプトで記述するよりもコードの可読性が高い。

参考URL• https://docs.ansible.com/• https://ja.wikipedia.org/wiki/Ansible_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)© 2022 Toshiba Corporation18

Terraform概要 (1)•Terraformは、HashiCorp社によって開発されているオープンソースのインフラ構成管理ツール(クラウドプロビジョニングツール)•

複数のクラウドプロバイダに対応している (AWS、GCP、Azure、 … )•インフラの構成を定義し、インフラを自動構築できる

適用
Terraform

インフラ.tfを定義
インフラの構成.tf ファイルの内容に従ってクラウド上のインフラが自動構築される(リソースが作成・更新・削除される)

AWS、GCP、Azure など+© 2022 Toshiba Corporation

19

Terraform概要 (2)ソフトウェア開発環境構築でのTerraformの利用目的•使用するAWSの一部のリソース管理(作成・変更・削除・AWSコンソールによる変更の検出)-

EC2インスタンス(サーバ)-

EBS(ボリューム)-

セキュリティグループ (一部)-

S3(Amazon Simple Storage Service )バケット (一部)

AnsibleでもEC2インスタンスを作成することは可能だが(作成していたこともあった)、Terraform は リーソースの変更・削除 などの管理が可能。

•リソースの変更履歴の管理

参考URL• https://www.terraform.io/• https://en.wikipedia.org/wiki/Terraform_(software)© 2022 Toshiba Corporation

20

Packer概要 (1)•Packerは、 HashiCorp社によって開発されている、マシンイメージを作成するためのオープンソースツール•

Packer 実行時の処理内容の概要
1.

マシンイメージを作成するためのサーバ(仮想マシン)を新規作成

2.

作成したサーバ(仮想マシン)にソフトウェアのインストールや設定を実施
Ansible・shell などインストール・設定方法を指定可能

3.

マシンイメージ作成・登録

4.

作成したサーバを削除

ソフトウェア開発環境構築時のPacker の利用目的
AMIを作成参考URL• https://www.packer.io/intro© 2022 Toshiba Corporation

21

Packer概要 (2)クラウド利用の場合のイメージ

Packerの処理内容

ソフトウェアなど【 packer_code_example.json 】{"builders":"builders":[{[{"type":"amazon-ebs","type":"amazon-ebs","region":"ap-northeast-1","region":"ap-northeast-1",・・・・・・}]}]

2 インストール・設定(この手段はPacker
コード内に記述)

ベースとする
マシンイメージ

プロビジョニング済みのマシンイメージ

サーバ

1 起動

"provisioners":[{[{"provisioners":"type":“ansible","type":“ansible",“playbook_file: ”common.yml“,“playbook_file: ”common.yml“,......
}]}]

3 作成/保存(登録)4 削除}

マシンイメージを作成するために起動するサーバ(仮想マシン)の情報
AWSの例。
実行手段と具体的な処理内容を記述。
Ansibleの指定例。
(この場合、マシンイメージを作成するためのサーバへのソフトウェアインストール・設定などの処理はAnsibleで実施)

ビルド(例：packer build packer_code_example.json )Packer.json

shellの例"provisioners": [{"type": “shell","inline": [“sudo apt-get install –y …
...
}]

プロビジョニング：必要に応じてネットワークやコンピュータの設備などのリソースを提供できるよう予測し、準備しておくこと© 2022 Toshiba Corporation

22

04
ソフトウェア開発環境の構築方法の詳細© 2022 Toshiba Corporation23

構築方法 (ステップ1) ～Packer・Ansible～
各開発用ツールAWSでの構築・運用に提供されている 必要な共通のAMI
ツールをインストール

各ツール共通のAMI開発ツール毎にそれぞれ構築に必要な処理を実行したAMIを作成

ゴールデン
各ツール用ゴー
AMIから
ルデン
サーバ新規作成
AMI

ツール共通
AMI

AMI

ツールA用
ゴールデンAMI

利用ツール： Packer、 Ansible
Packerの処理概要

ソフトウェアなど

2 インストール・設定(Ansibleでプロビジョニング)ベースとする
AMI

サーバ

1 起動

プロジェクトX ツールA用

EC2インスタンス【 packer_code_example_common.json 】{"builders": [{"builders": [{"type": "amazon-ebs","type": "amazon-ebs","region": "ap-northeast-1","region": "ap-northeast-1",・・・・・・}]}]

プロビジョニング済み
AMI"provisioners":"provisioners":[{[{"type":“ansible","type":“ansible",“playbook_file: ”common.yml“,“playbook_file: ”common.yml“,......
}] }]3 作成/保存(登録)4 削除

プロジェクト固有ゴールデンの設定値を読みAMIから込み、各プロジェ作成したサーバ クト用のツールを起動}

各プロジェクト用の設定をしたツール起動

ツールA 起動
EC2インスタンス

AMIを作成するために起動するサーバの情報

Ansibleで、Playbookcommon.yml を適用。
common.yml：
Docker、AWS CLIなど
全てのツールの起動・運用に必要な共通の道具をインストール© 2022 Toshiba Corporation

24構築方法 (ステップ2) ～Packer・Ansible～
各開発用ツール
AWSでの構築・運用に提供されている 必要な共通のAMI
ツールをインストール

各ツール
共通のAMI

開発ツール毎にそれぞれ構築に必要な処理を実行したAMIを作成

ツール共通
AMI

AMI

各ツール用
ゴールデン
AMIから
ゴールデン
サーバ新規作成
AMI
ツールA用
ゴールデンAMI

プロジェクト固有ゴールデンの設定値を読みAMIから込み、各プロジェ作成したサーバ クト用のツールを起動
プロジェクトX ツールA用

EC2インスタンス

各プロジェクト用の設定をしたツール起動

ツールA 起動
EC2インスタンス

AMIを作成するステップなので、基本的に前スライドと同様。playbook_file で指定するYAMLファイルにそれぞれツール毎に必要な処理を記述。

利用ツール： Packer、 Ansible
Packerの処理概要

ソフトウェアなど

2 インストール・設定(Ansibleでプロビジョニング)ベースとする
AMI

サーバ

1 起動

【 packer_code_example_gitlab.json 】{"builders": [{"builders": [{"type": "amazon-ebs","type": "amazon-ebs","region": "ap-northeast-1","region": "ap-northeast-1",・・・・・・}]}]

プロビジョニング済み
AMI"provisioners":"provisioners":[{[{"type":“ansible","type":“ansible",“playbook_file: ”common.yml“,“playbook_file: ”gitlab.yml“,......
}] }]3 作成/保存(登録)4 削除}

GitLabの例

AMIを作成するために起動するサーバの情報

Ansibleで、Playbookgitlab.yml を適用。

gitlab.yml：
Docker イメージのpullなど、GitLabの起動に必要な処理を実施© 2022 Toshiba Corporation

25構築方法 (ステップ3) ～Terraform～
各開発用ツール
AWSでの構築・運用に提供されている 必要な共通のAMI
ツールをインストール

AMI

各ツール
共通のAMI

開発ツール毎にそれぞれ構築に必要な処理を実行したAMIを作成

ツール共通
AMI

利用ツール： Terraform【 X_gitlab_sample.tf 】
module “projectX_gitlab" {source = "./gitlab/"
private_ip = "12.34.56.78"
tags
tags == {{Name
Name = “projectX-gitlab"= “projectX-gitlab"
Owner
=“X"
Owner
= “X"
Ver
=
“1.2.3“Ver= “15.3.5“
Func1
=“on”
Registry = “true”
Func2
Pages= “off”= “false”
Hour
=“12”
Hour
= “12”
Min=“10”
Min= “10”
}}
・・・}

各ツール用
ゴールデン
AMIから
ゴールデン
サーバ新規作成
AMI
ツールA用
ゴールデンAMI

プロジェクト固有ゴールデンの設定値を読みAMIから込み、各プロジェ
作成したサーバ クト用のツールを起動

ツールA 起動
EC2インスタンス

プロジェクトX ツールA用

EC2インスタンス

EC2インスタンスのタグ情報
Name= “projectX-git;ab"
Owner
= “X"
Ver
= “15.3.4“Registry= “true”
Pages= “false”
Hour= “12”
Min= “10”

GitLabのEC2インスタンスの例

GitLab共通のEC2インスタンスに関する情報はモジュールで定義。
プロジェクト毎の設定値をタグ情報として、EC2インスタンスに設定。
程よい範囲でAWSリソースをTerraform管理する(全てをTerraform管理しない。全運用担当者に影響するリソースはTerraform管理しない)

各プロジェクト用の設定をした
ツール起動

AWSコンソール画面から確認できるサーバの情報のイメージ
Name

Owner

VerRegistry

Pages

HourMin…

projectX-gitlab

X

15.3.4

truefalse

1210…

projectY-gitlabY

15.3.4

truetrue1220…

projectZ-gitlab

Z

14.7.7

truetrue1230…

projectX-jenkins

X

10.3

15

10…

….

…

…

…

…

…

…

…

タグにツールの設定情報を設定することで、Webブラウザから各サーバの設定情報一覧を確認可能© 2022 Toshiba Corporation26

構築方法 (ステップ3) ～Terraform コードのイメージ～【./gitlab/main.tf イメージ 】
variable "instance_type" {default = "t3.large"}

利用ツール： Terraform【 X_gitlab_sample.tf 】
module “projectX_gitlab" {source = "./gitlab/"
private_ip = "12.34.56.78"
tags
tags == {{Name
Name = “projectX-gitlab"= “projectX-gitlab"Owner
=“X"
Owner
= “X"
Ver
=“1.2.3“Ver= “15.3.5“
Func1
=“on”
Registry = “true”
Func2
Pages= “off”= “false”
Hour
=“12”
Hour
= “12”
Min=“10”
Min= “10”}}・・・Terraform 使用前は、ツール毎に異なる情報を}
Ansibleの変数で管理

GitLabの例

GitLab共通のEC2インスタンスに関する情報はモジュールで定義。

プロジェクト毎の設定値をタグ情報として、EC2インスタンスに設定。
程よい範囲でAWSリソースをTerraform管理する.

プロジェクト固有
基本的にプロジェクト毎にプロジェクト用のの設定値を読み同じ値を設定するときは設定をした込み、各プロジェdefault値を設定。
ツール起動
クト用のツールを異なる値を設定する場合は、起動
X_gitlab_sample.tf で指定。

variable "tags" {X用ツールA 起動
type = map(string)
EC2インスタンス
default = {プロジェクト毎にName = ""異なる値を設定するときは、
Owner = ""default値なしで、必ずVer= "“
X_gitlab_sample.tf で指定。
・・・}
}
・・・・・
resource "aws_instance" "gitlab" {ami= data.aws_ami.base-image.id
instance_type= var.instance_type
private_ip= var.private_ip
iam_instance_profile = “TOSHIBA_Instances"
異なる値が設定
subnet_id= "subnet-01234567"
される項目はkey_name= “toshiba-key"
変数にする。
availability_zone= "ap-northeast-1c“・・・・共通の設定値は直接指定。
運用中に変数化することも…

© 2022 Toshiba Corporation

27

構築方法 (ステップ4) ～Ansible～
各開発用ツール
AWSでの構築・運用に提供されている 必要な共通のAMI
ツールをインストール

各ツール共通のAMI開発ツール毎にそれぞれ構築に必要な処理を実行したAMIを作成

ツール共通
利用ツール：
Ansible 、(AWSCLI)
AMI
AMI

ゴールデン
各ツール用ゴー
AMIから
ルデン
サーバ新規作成
AMI
ツールA用
ゴールデンAMI

設定ファイルに基づいてツールを起動

url=http://xxx.toshiba.co.jp/X/gitlab/
registyr=true
pages=false

GitLab# cron設定
10 12 * * * maintenance.shAnsibleで起動に必要なファイルを生成/サーバを設定

各プロジェクト用の設定をしたツール起動

ツールA 起動
EC2インスタンス

プロジェクトX ツールA用• AWS CLIを使用して、EC2インスタンスのタグ情報から、これから起動するツールの固有の設定値を取得し、動的にインベントリを作成• インベントリ情報をもとに、プロジェクト用の設定値をサーバおよびツールに設定し、ツールを起動

X用GitLab EC2インスタンス

プロジェクト固有ゴールデンの設定値を読みAMIから込み、各プロジェ作成したサーバ クト用のツールを起動

EC2インスタンス

EC2インスタンスのタグ情報
Name= “projectX-git;ab"
Owner
= “X"
Ver
= “15.3.4“Registry= “true”
Pages= “false”
Hour= “12”
Min= “10”AWS CLI でインベントリを作成する。
これにより、タグの値をAnsibleの変数として扱うことができるようになる。
【インベントリイメージ 】
projectX-gitlab Owner=X Ver=15.3.4 Registry=true Pages=false ……
projectY-gitlab Owner=Y Ver=15.3.4 Registry=true Pages=true ……
projectX-gitlab Owner=X Ver=14.7.7 Registry=true Paages=true ……
© 2022 Toshiba Corporation28

05
おわりに

© 2022 Toshiba Corporation29

まとめ• Ansible、Terraform、Packerを使用して、複数のソフウェア開発環境を効率よく自動構築・管理する方法の一例を紹介
留意事項- 前提が一つ違うと最適解は変わってくる- 新しいツールが次々に出てくるので、その時々で最適なものを選択する必要がある• 開発環境の構築に限らず、設定内容が一部異なる環境を複数構築するケースでも同様の仕組みを適用可能© 2022 Toshiba Corporation

30

課題

• バージョンアップ
- 一度構築した環境のOSのバージョンアップ
- プラグインを扱うツールのバージョンアップ

• サーバ数・利用者数・データ量の増加による、最適なシステム構成・運用方法の変化への対応• 新しいサービスや新しいツールの採用• 利用申し込みから環境構築完了のユーザへの連絡までの完全自動化• 利用者数増加による問合せ件数の増加© 2022 Toshiba Corporation31

～環境構築する際のその他の留意事項など～• 最適な構成・運用方法は、ソフトウェア開発環境の規模によって異なる• 程よい匙加減で自動化する必要がある
どこまでの範囲を自動化するのか、事象の発生頻度と変更頻度も考慮した上で、吟味が必要• コードは程よい粒度でモジュール化する必要がある
分割しすぎて、可読性が低下することがある• 担当者はゆるやかに流動していくので、基本的にはシンプルで誰でもメンテナンスできるような方法にすることが望ましい• ツール側もバージョンアップすると、コードの記述方法が変更になることがあるのでバージョンアップするタイミングは要検討© 2022 Toshiba Corporation32

仲間を募集しています！
株式会社 東芝 ソフトウェア技術センター では、•OSSを中心とした共通基盤ソフトウェアに関する技術•

ソフトウェア開発環境、開発プロセス構築に関する技術•

ソフトウェア開発の効率化と信頼性向上に関する技術に興味のある人を募集しております。

より詳しい情報をWEBで公開していますので是⾮ご覧ください。
https://www.global.toshiba/jp/technology/corporate/swc.html© 2022 Toshiba Corporation33