はじめに

この文書ではVCPが秘密情報管理のために提供しているHashiCorp Vaultの利用手順について記しています。

VCPのVaultサーバでは格納された秘密情報のバックアップや冗長管理は行っていないので、元データの管理は利用者の責任で行ってください。

HashiCorp Vaultについて

HashiCorp Vaultは秘密情報を安全に管理するためのツールです。

特徴

HashiCorp Vault(以下ではVaultサーバと記します)には、以下のような特徴があります。

  • セキュアな秘密保管
    • 任意のキー、バリューの組で秘密情報を格納できます。Vaultサーバではこれらの秘密情報を永続ストレージに書き込む前に暗号化しています。
  • マスターキーの分割
    • 永続ストレージに記録している秘密情報はマスターキーによって暗号化されています。マスターキーはシャミアの秘密分散法によって複数のキーに分割されています。閾値以上のキーを与えることで永続ストレージの情報は復号化できるようになります。
  • 監査
    • Vaultサーバへの要求と応答は(エラーを含めて)その全てを監査ログに記録することができます。
  • HTTP API
    • Vaultサーバのあらゆる機能は HTTP APIで操作できます。

シークレットエンジン

Vaultサーバが秘密情報を扱うためのコンポーネントとしてシークレットエンジンがあります。シークレットエンジンには単なる Key Value ストアの機能をもつものから、動的に秘密情報を生成できるものまで様々なものが用意されています。

ここでは VCP で利用できる以下の2つのシークレットエンジンについて簡単にふれておきます。

  1. KV シークレットエンジン v1
  2. Cubbyhole シークレットエンジン

1.のKVシークレットエンジンはいわゆる Key Valueストア(KVS)です。通常のKVSと異なるのはValueに指定した値が暗号化されて保存されることです。

2.の Cubbyholeシークレットエンジンも1.と同様に暗号化をサポートしたKVSです。1.と異なるのはKVSのスコープがアクセストークン毎に別々になっていることです。つまりトークンAでアクセスした場合とトークンBでアクセスした場合で全く異なるKVSにアクセスするようになっています。それぞれのKVSはお互いにアクセスできないようになっています。

VCPではユーザ毎に別々のトークンを発行することになるので、VCコントローラに属する全てのユーザが共有する秘密情報はKVシークレットエンジンに、ユーザ個々が保持する秘密情報はCubbyholeシークレットエンジンに保管するという利用方法が考えられます。

VCPでは基本的には Cubbyhole シークレットエンジンの利用を推奨します。

ただし Cubbyholeシークレットエンジンに保管されているデータはトークンが無効になってしまうと(削除されて)アクセスできなくなるので注意が必要です。トークンが無効になる原因としてはトークンの有効期限が切れた、または管理者によって明示的にトークン無効化の操作が行われた、などが考えられます。

VCPでの利用方法

VCPではVCコントローラのVaultサーバに格納されたAWSの認証情報などを参照する機能があります。この機能を利用するとローカル環境にAWSの認証情報などの秘密情報を保持する必要がなくなります。

Vaultサーバを利用する場合

Vault サーバを利用する場合のクラウドプロバイダの認証情報の扱いを確認します。

Vaultを利用しない場合

  1. AWSの認証情報は、事前にVCコントローラのVaultサーバに格納されています。
    • Vaultサーバの機能によって認証情報は暗号されて格納されています
  2. VCP SDKの設定ファイルvcp_config.ymlにはVaultサーバにおける認証情報の格納場所が記されています
  3. ユーザによってVCP SDKが呼び出されます
  4. VCP SDKによってVC Controller Coreに対する REST APIが呼び出されます
    • その際VC Controller Coreとの間で認証情報が受け渡されることはなく、Vaultサーバの格納場所のみを渡します
  5. VC Controller Coreは受け取ったVaultサーバの格納場所から認証情報を取得します
  6. VC Controller Coreは取得した認証情報を用いて AWS APIを実行してAmazon EC2インスタンスを起動します

Vaultサーバを利用しない場合

はじめに Vault サーバを利用しない場合のクラウドプロバイダの認証情報の扱いを確認します。

ここではAWSの認証情報を扱う場合を例として記しています。

Vaultを利用しない場合

  1. AWSの認証情報は、事前にVCP SDKの設定ファイルvcp_config.ymlに平文で書き込まれています
  2. ユーザによってVCP SDKが呼び出されます
  3. VCP SDKによってVC Controller Coreに対する REST APIが呼び出されます
    • その際にパラメータとして AWSの認証情報が付加されます
  4. VC Controller Coreは受け取った認証情報を用いて AWS APIを実行してAmazon EC2インスタンスを起動します

操作手順

以下での操作手順は以下のようになります。

  1. Vaultサーバにアクセスするための準備
  2. Vaultサーバにアクセスする(値の格納、取得、一覧取得、値の削除)
  3. AWSの認証情報を Vaultサーバから読み込むようにVCP SDKの設定を変更する

Vaultサーバにアクセスするための準備

Vaultサーバにアクセスするのに必要となるアクセストークンの入力やアドレスの設定を行います。

アクセストークンの入力

VaultサーバにアクセスするにはVCコントローラのアクセストークンが必要となります。次のセルを実行すると入力枠が表示されるのでアクセストークンを入力してください。

In [1]:
from getpass import getpass
vcc_access_token = getpass()
········

入力された値が正しいことを確認するために、VCP SDKの初期化を行います。アクセストークンが正しく入力されていない場合は、VCP SDKの初期化がエラーとなり以下のようなメッセージが表示されます。

2019-XX-XX XX:XX:XX,XXX - ERROR - config vc failed: http_status(403)
2019-XX-XX XX:XX:XX,XXX - ERROR - 2019/XX/XX XX:XX:XX UTC: VCPAuthException: xxxxxxx:token lookup is failed: permission denied

この場合はアクセストークンの入力からやり直してください。

In [2]:
from common import logsetting
from vcpsdk.vcpsdk import VcpSDK


vcp = VcpSDK(
    vcc_access_token  # VCCのアクセストークン
)

Vaultサーバのアドレスを確認する

VCP SDKからVaultサーバのアドレスを取得します。取得したアドレスは後でVaultサーバにアクセスする際に利用するので変数vault_addressに格納しておきます。

In [3]:
# VCP SDKからVaultサーバのアドレスを取得する
vault_address = vcp.vcc_info()['vault_url']

# アドレスを表示する
print(vault_address)
https://10.0.0.1:8443

Vaultサーバのアドレスが正しいことを確認するために Vault サーバの HTTP API を実行してみます。 次のセルを実行してエラーにならなければ、アドレスが正しいことが確認できます。

ここでは Helpを取得するHTTP APIを実行しています。

In [4]:
!curl -I --fail --header "X-Vault-Token:{vcc_access_token}" \
    "{vault_address}/v1/cubbyhole?help=1"





VaultサーバのHTTP APIについては次節以降で説明します。

ライブラリの準備

このNotebookでは Vaultサーバ の HTTP API を呼び出すために、Python のライブラリ Requests を利用します。ここでは Requests が利用できることの確認と簡単な使い方について記します。

まず、この環境から Requests が利用できることを確認します。次のセルを実行してエラーにならないことを確認してください。

In [5]:
import requests

エラーになった場合はライブラリのインストールを行います。次のセルのコメントを外して実行してください。

In [6]:
# !pip install --user requests

Requests を使って試しに https://www.nii.ac.jp/ にアクセスしてみます。

In [7]:
# https://www.nii.ac.jp/ に GET のリクエストを行う
r = requests.get('https://www.nii.ac.jp')
r
Out[7]:
<Response [200]>

リクエストが成功したことを示すステータスコード200がレスポンスとして返されます。

取得したテキストを表示してみます。

In [8]:
print(r.text)
<!DOCTYPE html>
<html lang="ja">
<head>
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-PDNSR5');</script>
<!-- End Google Tag Manager -->
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<meta http-equiv="content-language" content="ja" />
<title>国立情報学研究所 / National Institute of Informatics</title>
<meta class="swiftype" name="title" data-type="string" content="国立情報学研究所 / National Institute of Informatics" />
<meta name="viewport" content="width=640">
<meta name="robots" content="index,follow" />
<meta name="keywords" content="NII,情報学,CSI,オープンハウス,市民講座,SINET,CiNii,リポジトリ,科研費研究番号,サイニー,論文検索" />
<meta name="description" content="国立情報学研究所は、情報学という新しい研究分野での「未来価値創成」を目指すわが国唯一の学術総合研究所として、ネットワーク、ソフトウェア、コンテンツなどの情報関連分野の新しい理論・方法論から応用展開までの研究開発を総合的に推進しています。" />
<meta name="rating" content="General" />
<meta name="author" content="国立情報学研究所" />
<meta name="copyright" content="Copyright &copy; National Institute of Informatics, 2007-2022">
<meta http-equiv="content-script-type" content="text/javascript" />
<meta http-equiv="content-style-type" content="text/css" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" >
<meta name="google-site-verification" content="tW7EKJkt28d9IatrhH0_fZw7vKQ--sSZBLDvZylSwkU" />
<meta property="fb:app_id" content="172672774186738" />
<meta property="og:title" content="国立情報学研究所 / National Institute of Informatics" />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://www.nii.ac.jp/" />
<meta property="og:image" content="https://www.nii.ac.jp/_img/ogp.jpg" />
<meta property="og:site_name" content="国立情報学研究所 / National Institute of Informatics" />
<meta property="og:description" content="国立情報学研究所は、情報学という新しい研究分野での「未来価値創成」を目指すわが国唯一の学術総合研究所として、ネットワーク、ソフトウェア、コンテンツなどの情報関連分野の新しい理論・方法論から応用展開までの研究開発を総合的に推進しています。" />
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:site" content="@jouhouken">
<meta name="twitter:title" content="国立情報学研究所 / National Institute of Informatics">
<meta name="twitter:description" content="国立情報学研究所は、情報学という新しい研究分野での「未来価値創成」を目指すわが国唯一の学術総合研究所として、ネットワーク、ソフトウェア、コンテンツなどの情報関連分野の新しい理論・方法論から応用展開までの研究開発を総合的に推進しています。">
<meta name="twitter:image" content="https://www.nii.ac.jp/_img/ogp_tw.jpg">
<link rel="canonical" href="https://www.nii.ac.jp/" />
<link rel="shortcut icon" href="https://www.nii.ac.jp/_img/common/favicon.ico" />
<link rel="stylesheet" href="/_css/ionicons.css">
<link rel="stylesheet" href="/_css/nii_style.css">
<!-- LINE Tag Base Code --> 
<!-- Do Not Modify --> 
<script> 
(function(g,d,o){ 
g._ltq=g._ltq||[];g._lt=g._lt||function(){g._ltq.push(arguments)}; 
var h=location.protocol==='https:'?'https://d.line-scdn.net':'http://d.line-cdn.net'; 
var s=d.createElement('script');s.async=1; 
s.src=o||h+'/n/line_tag/public/release/v1/lt.js'; 
var t=d.getElementsByTagName('script')[0];t.parentNode.insertBefore(s,t); 
})(window, document); 
_lt('init', { 
customerType: 'lap',  
sharedCookieDomain: 'reg.nii.ac.jp', 
tagId: '97a87859-ea05-4e3f-8543-e57724e3dbcf' 
}); 
_lt('send', 'pv', ['97a87859-ea05-4e3f-8543-e57724e3dbcf']); 
</script> 
<noscript> 
<img height="1" width="1" style="display:none" 
src="https://tr.line.me/tag.gif?c_t=lap&t_id=97a87859-ea05-4e3f-8543-e57724e3dbcf&e=pv&noscript=1" /> 
</noscript> 
<!-- End LINE Tag Base Code -->
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="/_js/html5shiv.js"></script>
<script src="/_js/respond.min.js"></script>
<![endif]-->
</head>
<body>
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-PDNSR5"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
<div id="fb-root"></div>
<script>(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/ja_JP/sdk.js#xfbml=1&version=v2.9";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
<div id="navi" >
	<section id="naviBox" class=" cf relative">
		<a href="/"><img class="mainLogo" src="/_img/_logo/mainLogo.gif" alt="国立情報学研究所 / National Institute of Informatics" /></a>
		<div id="naviSP">
			<img class="hidePC" src="/_img/_icon/menuSP.gif" />
			<img class="hide" src="/_img/_icon/menuClose.gif" />
		</div>
		<img id="naviPC" class="hidePC" src="/_img/_icon/menuPC.gif" />
		<div id="searchBox" class="menuSP">
			<div class="searchBox">
<script type="text/javascript">// <![CDATA[
(function(w,d,t,u,n,s,e){w['SwiftypeObject']=n;w[n]=w[n]||function(){
  (w[n].q=w[n].q||[]).push(arguments);};s=d.createElement(t);
  e=d.getElementsByTagName(t)[0];s.async=1;s.src=u;e.parentNode.insertBefore(s,e);
  })(window,document,'script','//s.swiftypecdn.com/install/v2/st.js','_st');
  _st('install','N-DNg_K55_uKdDgRwnR-','2.0.0');
// ]]></script>
			<form>
				<input type="text" class="st-default-search-input" />
				<input type="submit" value="検索">
			</form>
			</div>
		</div>
		<ul id="infoBox" class="menuSP bg-light-gray">
			<li class="bd-gray-left"><a href="/about/access/">交通アクセス<br class="hideSP" /><i class="ion-android-arrow-dropdown hideSP"></i></a></li>
			<li class="bd-gray-left"><a href="/about/contact/">お問い合わせ<br class="hideSP" /><i class="ion-android-arrow-dropdown hideSP"></i></a></li>
			<li class="bd-gray-left bd-gray-right"><a href="/en/">English<br class="hideSP" /><i class="ion-android-arrow-dropdown hideSP"></i></a></li>				
		</ul>
	</section>
<div class="bg-light-gray bd-gray-top bd-gray-bottom bd-none-sp menuContainer">
	<ul id="globalMenu" class="menuBox cf">
		<li class="bd-gray-left to-index "><a href="/about/">NIIについて<br class="hideSP" /><small><span class="hidePC"> / </span>About NII</small></a>
			<div class="subMenuBox bg-light-gray bd-gray bd-none-sp box-shadow">
				<div class="hideSP dropDown dropDown-1"><i class="ion-android-arrow-dropdown"></i></div>
				<div class="table col-04 notable-sp top full padding-right-default padding-top-default padding-bottom-default padding-none-sp">
					<div class="padding-left-default padding-none-sp">
						<span class="to-category nolink"><em>はじめに</em></span>
						<div class="pageList">
							<span class="to-page"><a href="/about/introduction/director/">所長の挨拶</a></span>
							<span class="to-page"><a href="/about/introduction/mission/">NIIの特色</a></span>
							<span class="to-page"><a href="/about/introduction/iuric/" class="bd-cancel">大学共同利用機関</a></span>
						</div>
						<span class="to-category nolink"><em>概要</em></span>
						<div class="pageList">
							<span class="to-page"><a href="/about/overview/history/">沿革</a></span>
							<span class="to-page"><a href="/about/overview/council/">運営会議・アドバイザリーボード</a></span>
							<span class="to-page"><a href="/about/overview/organization/">組織図</a></span>
							<span class="to-page"><a href="/about/overview/chizai/">知的財産</a></span>
							<span class="to-page"><a href="/about/overview/budget/">所員・予算</a></span>
							<span class="to-page"><a href="/about/overview/rekidai/">歴代所長</a></span>
							<span class="to-page"><a href="/about/overview/catalogue/">要覧・概要</a></span>
							<span class="to-page"><a href="/about/overview/annualreport/">å¹´å ±</a></span>
							<span class="to-page"><a href="/about/overview/commark/">ロゴマーク・<br class="hideSP">広報コミュニケーションマーク</a></span>
                            <span class="to-page"><a href="/20th/" target="_blank">設立20周年記念ウェブサイト</a></span>
						</div>
					</div>
					<div class="padding-left-default padding-none-sp">
						<!--<span class="to-category margin-bottom-sm margin-none-sp"><a href="/about/property/">社会連携推進室</a></span>-->
						<span class="to-category"><a href="/about/international/">国際交流</a></span>
						<div class="pageList">
							<span class="to-page"><a href="/about/international/mouresearch/">大学・研究機関との研究交流</a></span>
							<span class="to-page"><a href="/about/international/mou/">国際交流協定(MOU)の<br>締結状況</a></span>
							<span class="to-page"><a href="/about/international/ictlec/">NII International advanced lectures series on ICT</a></span>
							<span class="to-page"><a href="/about/international/shonanmtg/" class="bd-cancel">NII湘南会議</a></span>
						</div>
						<span class="to-category margin-bottom-sm margin-none-sp"><a href="/about/rso/">研究戦略室</a></span>
						<span class="to-category margin-bottom-sm margin-none-sp"><a href="/about/aic/">先端ICTセンター</a></span>
						<span class="to-category margin-bottom-sm margin-none-sp"><a href="/about/aic/nii-csirt/">NII CSIRT</a></span>
						<span class="to-category"><a href="/about/library/">国立情報学研究所 図書室</a></span>
						<div class="pageList">
							<span class="to-page"><a href="/about/library/guide/">図書室 利用案内</a></span>
							<span class="to-page"><a href="/about/library/gakunin/">図書室 学認経由のアクセス</a></span>
						</div>
						<span class="to-category margin-bottom-sm margin-none-sp"><a href="/about/seminar-house/">国際高等セミナーハウス</a></span>
					</div>
					<div class="padding-left-default padding-none-sp">
						<span class="to-category nolink"><em>広報</em></span>
						<div class="pageList">
							<span class="to-page"><a href="/about/pr/video/">広報ビデオ</a></span>
							<span class="to-page"><a href="/about/pr/jouhouken/">情報犬ビットくん</a></span>
						</div>
						<span class="to-category"><a href="/about/publication/">出版物・広報誌</a></span>
						<div class="pageList">
							<span class="to-page"><a href="/about/publication/today/">NII Today</a></span>
							<span class="to-page"><a href="/about/publication/harmony/">軽井沢土曜懇話会講演集<br>知と美のハーモニー</a></span>
							<span class="to-page"><a href="/about/publication/bit-kun/">のぞいてみようNII<br class="hideSP">情報犬ビットくん</a></span>
							<span class="to-page"><a href="/about/publication/jouhouken-series/">情報研シリーズ</a></span>
							<span class="to-page"><a href="/about/publication/jouhougaku-series/">情報学シリーズ</a></span>
							<span class="to-page"><a href="/about/publication/other-books/">その他 教員の著書</a></span>
                            <span class="to-page"><a href="/20th/publication/" class="bd-cancel" target="_blank">NII20周年記念出版物</a></span>
						</div>
						<span class="to-category"><a href="/disclosure/">情報公開</a></span>
						<div class="pageList">
							<span class="to-page"><a href="/disclosure/sinet_advisory/">学術情報ネットワーク<br>外部諮問委員会報告書</a></span>
						</div>
						<span class="to-category margin-bottom-sm margin-none-sp"><a href="/report/">調査報告書</a></span>
						<span class="to-category margin-bottom-sm margin-none-sp"><a href="/procure/">調達情報</a></span>
					</div>
					<div class="padding-left-default padding-none-sp">
						<span class="to-category margin-bottom-sm margin-none-sp"><a href="/about/recruit/">採用情報</a></span>
						<span class="to-category"><a href="/about/access/">交通アクセス</a></span>
						<div class="pageList">
							<span class="to-page"><a href="/about/access/">学術総合センター</a></span>
                        <span class="to-page"><a href="/about/access/kashiwa/">柏分館</a></span>
							<span class="to-page"><a href="/about/access/karuizawa/" class="bd-cancel">国際高等セミナーハウス</a></span>
						</div>
						<span class="to-category margin-bottom-sm margin-none-sp"><a href="/about/contact/">問い合わせ窓口</a></span>
						<span class="to-category"><a href="/mail/">メールマガジン</a></span>
						<div class="pageList">
							<span class="to-page"><a href="/mail/form/">購読の登録/解除</a></span>
							<span class="to-page"><a href="/mail/archives/">バックナンバー</a></span>
						</div>
						<span class="to-category margin-bottom-sm margin-none-sp"><a href="/news/">トピックス</a></span>
                    	<span class="to-category margin-bottom-sm margin-none-sp"><a href="/event/list/">イベント</a></span>
						<span class="to-category margin-bottom-sm margin-none-sp"><a href="/link/">リンク</a></span>
					</div>
				</div>
			</div>
		</li><!--
		--><li class="bd-gray-left to-index ">
			<a href="/research/">研究<br class="hideSP" /><small><span class="hidePC"> / </span>Research</small></a>
			<div class="subMenuBox bg-light-gray bd-gray box-shadow">
				<div class="hideSP dropDown dropDown-2"><i class="ion-android-arrow-dropdown"></i></div>
				<div class="table col-03 notable-sp  top full padding-right-default padding-top-default padding-bottom-default padding-none-sp">
					<div class="padding-left-default padding-none-sp">
						<span class="to-category margin-bottom-sm margin-none-sp"><a href="/research/research-divisions/">研究系</a></span>
						<span class="to-category"><a href="/research/centers/">研究センター</a></span>
						<div class="pageList">
							<span class="to-page"><a href="/research/centers/network/">学術ネットワーク研究開発センター</a></span>
							<span class="to-page"><a href="/research/centers/kmcs/">知識コンテンツ科学研究センター</a></span>
							<span class="to-page"><a href="http://grace-center.jp/" target="_blank">先端ソフトウェア工学・国際研究センター</a></span>
							<span class="to-page"><a href="/research/centers/">社会共有知研究センター</a></span>
							<span class="to-page"><a href="/research/centers/ccrd/">クラウド基盤研究開発センター</a></span>
							<span class="to-page"><a href="/research/centers/dsc/">データセット共同利用研究開発センター</a></span>
							<span class="to-page"><a href="/research/centers/cyberresilience/">ストラテジックサイバーレジリエンス研究開発センター</a></span>
							<span class="to-page"><a href="https://rcos.nii.ac.jp/" target="_blank">オープンサイエンス基盤研究センター</a></span>
							<span class="to-page"><a href="https://qis1.ex.nii.ac.jp/" target="_blank">量子情報国際研究センター</a></span>
							<span class="to-page"><a href="/research/centers/">サイバーフィジカル情報学国際研究センター</a></span>
							<span class="to-page"><a href="http://bigdata.nii.ac.jp/wp/" target="_blank">ビッグデータ数理国際研究センター</a></span>
							<span class="to-page"><a href="/research/centers/">数理的高信頼ソフトウェアシステム研究センター</a></span>
							<span class="to-page"><a href="http://research.nii.ac.jp/rc4mb/" target="_blank">医療ビッグデータ研究センター</a></span>
                        	<span class="to-page"><a href="http://research.nii.ac.jp/~iechizen/synmediacenter/index.html" target="_blank">シンセティックメディア国際研究センター</a></span>
							<span class="to-page"><a href="http://research.nii.ac.jp/CRIS/" target="_blank">ロバストインテリジェンス・ソーシャルテクノロジー研究センター</a></span>
                    	</div>
					</div>
					<div class="padding-left-default padding-none-sp">
						<span class="to-category"><a href="/faculty/">研究者紹介</a></span>
						<div class="pageList">
<!--
							<span class="to-page"><a href="/faculty/closeup/">研究者クローズアップ</a></span>
-->
							<span class="to-page"><a href="/faculty/director/">所長</a></span>
							<span class="to-page"><a href="/faculty/executives/">役職員(研究系)</a></span>
							<span class="to-page green"><a href="/faculty/informatics/">情報学プリンシプル研究系</a></span>
							<span class="to-page orange"><a href="/faculty/architecture/">アーキテクチャ科学研究系</a></span>
							<span class="to-page blue"><a href="/faculty/digital_content/">コンテンツ科学研究系</a></span>
							<span class="to-page pink"><a href="/faculty/society/">情報社会相関研究系</a></span>
							<span class="to-page"><a href="/faculty/list/">研究者一覧</a></span>
							<span class="to-page"><a href="/faculty/meiyo/">名誉教授</a></span>
							<span class="to-page"><a href="/faculty/closeup/" class="bd-cancel">研究者クローズアップ</a></span>
						</div>
						<span class="to-category"><a href="/research/projects/">参画する大型プロジェクト</a></span>
						<div class="pageList">
							<span class="to-page"><a href="/research/projects/jst-crest/">JST CREST</a></span>
							<span class="to-page"><a href="/research/projects/jst-presto/">JST さきがけ</a></span>
							<span class="to-page"><a href="/research/projects/jst-mirai/">JST 未来社会創造事業</a></span>
							<span class="to-page"><a href="/research/projects/jrplead-ukri/">日本学術振興会 : 国際共同事業 英国との国際共同研究プログラム(JRP-LEAD with UKRI)</a></span>
						</div>
                    	<span class="to-category margin-bottom-sm margin-none-sp"><a href="/research/kakenhi/">科学研究費助成事業(科研費)</a></span>
					</div>
					<div class="padding-left-default padding-none-sp">
						<span class="to-category viridian"><a href="https://www.nii.ac.jp/research/iga/" target="_blank">産官学連携活動</a></span>
						<div class="pageList">
							<span class="to-page viridian"><a href="https://www.nii.ac.jp/research/iga/index.html?event" target="_blank">産官学連携塾</a></span>
															<span class="to-page viridian"><a href="https://www.nii.ac.jp/seeds/" target="_blank">NII SEEDS</a></span>
							<!-- <span class="to-page"><a href="/research/XXXXXXX" class="bd-cancel">研究者による学術指導<br>(コンサルティング)の案内</a></span> -->
						</div>
						<span class="to-category margin-bottom-sm margin-none-sp"><a href="/research/collaboration/">共同研究(民間・公募型)</a></span>
						<span class="to-category margin-bottom-sm margin-none-sp"><a href="/research/jyutaku/">受託研究概要</a></span>
						<span class="to-category margin-bottom-sm margin-none-sp"><a href="/research/kifukin/">寄附金</a></span>
						<span class="to-category"><a href="/research/kenkyou/">研究員・学生受入制度</a></span>
						<div class="pageList">
							<span class="to-page"><a href="/research/kenkyou/jyutakukenkyuin/">受託研究員</a></span>
													<span class="to-page"><a href="/research/kenkyou/gairaikenshusei/">外来研修生</a></span>
							<span class="to-page"><a href="/research/kenkyou/tokubetsukenkyuin/">特別共同利用研究員</a></span>
							<span class="to-page"><a href="/research/kenkyou/kenkyukenshusei/">研究研修生</a></span>
													<span class="to-page"><a href="/research/kenkyou/cooperation/">連携大学院</a></span>
							<span class="to-page"><a href="/research/kenkyou/jsps/">日本学術振興会特別研究員</a></span>
						</div>
						<span class="to-category margin-bottom-sm margin-none-sp"><a href="/research/kyakuin/">客員教員研究費</a></span>
						<span class="to-category"><a href="/research/reports/">研究成果</a></span>
						<div class="pageList">
							<span class="to-page"><a href="/research/reports/pi/">Progress in Informatics</a></span>
							<span class="to-page"><a href="https://www.nii.ac.jp/TechReports/public_html/index-j.html" target="_blank">NIIテクニカルレポート</a></span>
							<span class="to-page"><a href="/research/reports/kaken/">科研報告書など</a></span>
						</div>
					</div>
				</div>
			</div>
		</li><!--
	--><li class="bd-gray-left to-index ">
			<a href="/service/">事業<br class="hideSP" /><small><span class="hidePC"> / </span>Service</small></a>
			<div class="subMenuBox bg-light-gray bd-gray box-shadow">
				<div class="hideSP dropDown dropDown-3"><i class="ion-android-arrow-dropdown"></i></div>
				<div class="table col-03 notable-sp  top full padding-right-default padding-top-default padding-bottom-default padding-none-sp">
					<div class="padding-left-default padding-none-sp">
						<span class="to-category margin-bottom-sm margin-none-sp black"><a href="http://www.sinet.ad.jp/" target="_blank">学術情報ネットワーク 「SINET6」</a></span>
						<span class="to-category red nolink"><em>学術情報の公開・共有</em></span>
						<div class="pageList">
							<span class="to-page red"><a href="https://cir.nii.ac.jp/ja" target="_blank">CiNii Research</a></span>
							<span class="to-page red"><a href="https://ci.nii.ac.jp/" target="_blank">[終了]CiNii Articles</a></span>
							<span class="to-page red"><a href="https://ci.nii.ac.jp/books/" target="_blank">CiNii Books</a></span>
							<span class="to-page red"><a href="https://ci.nii.ac.jp/d/" target="_blank">CiNii Dissertations</a></span>
							<span class="to-page red"><a href="https://kaken.nii.ac.jp/" target="_blank">KAKEN</a></span>
							<span class="to-page red"><a href="http://reo.nii.ac.jp/" target="_blank">NII-REO</a></span>
							<span class="to-page red bb3"><a href="https://support.nii.ac.jp/ja" target="_blank">NII学術コンテンツサービスサポート</a></span>
							<span class="to-page red"><a href="https://www.nii.ac.jp/CAT-ILL/" target="_blank">NACSIS-CAT/ILL</a></span>
							<span class="to-page red"><a href="https://contents.nii.ac.jp/korekara/libsysnw/e-resources" target="_blank">電子リソースデータ共有サービス(ERDB-JP、ライセンス)</a></span>
							<span class="to-page red"><a href="https://www.nii.ac.jp/irp" target="_blank">NII-IRP</a></span>
							<span class="to-page red"><a href="https://irdb.nii.ac.jp/" target="_blank">IRDB</a></span>
							<span class="to-page red"><a href="https://jpcoar.repo.nii.ac.jp/" target="_blank">JAIRO Cloud</a></span>
                            <span class="to-page red"><a href="https://rdm.nii.ac.jp/" target="_blank">GakuNin RDM</a></span>
                            <span class="to-page red"><a href="https://lms.nii.ac.jp/" target="_blank">学認LMS</a></span>
                    		<span class="to-page red"><a href="/service/handbook/" target="_self">オープンサイエンスのためのデータ管理基盤ハンドブック</a></span>                        
							<span class="to-page red bb3"><a href="https://www.nii.ac.jp/sparc/" target="_blank">SPARC Japan</a></span>
						</div>
					</div>
					<div class="padding-left-default padding-none-sp">
						<span class="to-category nolink"><em>大学情報環境整備支援</em></span>
						<div class="pageList">
							<span class="to-page"><a href="https://www.gakunin.jp/" target="_blank">学認(GakuNin)</a></span>
							<span class="to-page"><a href="https://www.eduroam.jp/" target="_blank">eduroam JP</a></span>
							<span class="to-page"><a href="https://cloud.gakunin.jp/" target="_blank">学認クラウド 導入支援サービス</a></span>
							<span class="to-page"><a href="https://certs.nii.ac.jp/" target="_blank">UPKI電子証明書発行サービス</a></span>
							<span class="to-page"><a href="/service/nii-socs/">大学間連携に基づく情報セキュリティ体制の基盤構築(NII-SOCS)</a></span>
							<span class="to-page"><a href="/service/sp/">高等教育機関における情報セキュリティポリシー策定について</a></span>
                    		<span class="to-page"><a href="https://www.nii.ac.jp/service/rinrinhime/" target="_self">倫倫姫の情報セキュリティ教室</a></span>
							<span class="to-page"><a href="/service/hikatsuba/" class="bd-cancel">[終了] ヒカリ&つばさの3択教室シリーズ</a></span>
															<span class="to-page"><a href="https://meatwiki.nii.ac.jp/confluence/display/NIIninsho/Outage" target="_blank">メンテナンスのお知らせ</a></span>
											</div>
						<span class="to-category red nolink"><em>大学図書館との連携</em></span>
						<div class="pageList">
							<span class="to-page red"><a href="https://contents.nii.ac.jp/cpc" target="_blank">大学図書館と国立情報学研究所との<br>連携・協力推進会議</a></span>
							<span class="to-page red"><a href="https://contents.nii.ac.jp/justice" target="_blank">大学図書館コンソーシアム連合<br>「JUSTICE」</a></span>
							<span class="to-page red"><a href="https://jpcoar.repo.nii.ac.jp/" target="_blank">オープンアクセスリポジトリ推進協会<br>「JPCOAR」</a></span>
							<span class="to-page red"><a href="https://contents.nii.ac.jp/korekara" target="_blank">これからの学術情報システム構築検討委員会</a></span>
						</div>
					</div>
					<div class="padding-left-default padding-none-sp">
											<span class="to-category margin-bottom-sm margin-none-sp"><a href="https://contents.nii.ac.jp/hrd" target="_blank">教育研修事業</a></span>
						<span class="to-category"><a href="/service/openforum/">学術情報基盤オープンフォーラム</a></span>
						<div class="pageList">
							<span class="to-page"><a href="/service/openforum/archives/">過去の開催状況</a></span>
							<span class="to-page"><a href="/service/openforum/sinet6-access-line/" class="bd-cancel">学術情報ネットワーク(SINET6)<br>接続用アクセス回線 仕様書(例)</a></span>
						</div>
						<span class="to-category nolink"><em>社会貢献</em></span>
						<div class="pageList">
							<span class="to-page"><a href="/service/jmooc/">NII JMOOC | gacco</a></span>
							<span class="to-page"><a href="/csp/" target="_blank">コンピュータサイエンスパーク</a></span>
                    		<span class="to-page"><a href="/tatsujin/" target="_blank">情報科学の達人</a></span>
                    </div>
					</div>
				</div>
			</div>
		</li><!--
	--><li class="bd-gray-left bd-gray-right bg-purple to-index"><a href="/graduate/" target="_blank" class="text-white noneIcon">大学院教育<br class="hideSP" /><small class="text-white"><span class="hidePC"> / </span>Graduate Program</small></a>
		</li>
	</ul>
</div>
</div>
<div id="mainContents">
<!-- #mainContents -->
<style>
.label.important {
color: #fff;
background-color: #df0011;
}
</style>
<div id="slideMain">
		<a class="noAfter"  target="_blank" href="/today/96/"><img src="/upload/NIItoday_96_%E3%83%90%E3%83%8A%E3%83%BC_0831.jpg" /></a>
		<a class="noAfter"  target="_blank" href="https://youtu.be/9HqDcxiQzUw"><img src="/upload/seeds22_takefusa_bannar.png" /></a>
		<a class="noAfter"  href="https://www.nii.ac.jp/event/2022/1016.html"><img src="/upload/daikyo_sympo22_banner.png" /></a>
		<a class="noAfter"  target="_blank" href="https://www.nii.ac.jp/service/handbook/"><img src="/upload/handobook.png" /></a>
		<a class="noAfter"  href="https://edx.nii.ac.jp/"><img src="/upload/banner_edxarchives330-2.png" /></a>
</div>
<div class="bg-light-gray">
	<section id="infoContainer" class="relative">
		<div class="hidePC tabMenu block cf">
			<h3 class="selected bd-gray-right">トピックス</h3>
			<h3 class="pressTabHead">ニュースリリース</h3>
		</div>
<!-- ニュース -->
		<div class="newsContainer tabContent">
			<h3 class="with-border hideSP block"><a href="/news/">トピックス <small>/ TOPICS</small></a></h3>
			<div class="newsBox">
				<a href="/event/other/decs/ds_casestudies.html" >
					<span class="date">2022/09/27</span>
		<span class="label">
		NII情報
					</span>
					<p>「教育機関向け遠隔授業・プログラミング教育支援」活用事例紹介のページを公開</p>
				</a>
			</div>
			<div class="newsBox">
				<a href="/news/2022/0922.html" >
					<span class="date">2022/09/22</span>
		<span class="label">
		NII情報
					</span>
					<p>「リアルタイムMRI調音運動データベース 第1版(rtMRIDB)」提供開始</p>
				</a>
			</div>
			<div class="newsBox">
				<a href="/about/recruit/2022/0920.html" >
					<span class="date">2022/09/20</span>
		<span class="label">
			募集
					</span>
					<p>情報学プリンシプル研究系 井上研究室 特任研究員(特定有期雇用職員・ポスドク相当)募集</p>
				</a>
			</div>
			<div class="newsBox">
				<a href="/news/award/2022/0906.html" >
					<span class="date">2022/09/06</span>
		<span class="label">
			受賞
					</span>
					<p>上野 晴樹 名誉教授にアジア太平洋人工知能学会がフェローの称号を授与</p>
				</a>
			</div>
			<div class="newsBox">
				<a href="/en/about/international/mouresearch/internship2022-2/" >
					<span class="date">2022/09/06</span>
		<span class="label">
		NII情報
					</span>
					<p>2nd call of 2022 "NII International Internship Program" Guideline for Candidates</p>
				</a>
			</div>
			<div class="newsBox">
				<a href="/news/award/2022/0902-2.html" >
					<span class="date">2022/09/02</span>
		<span class="label">
			受賞
					</span>
					<p>石川 裕 教授(アーキテクチャ科学研究系)に日本ソフトウェア科学会がフェローの称号を授与</p>
				</a>
			</div>
			<div class="text-right next-contents">
				<a href="/news/"><i class="bg-icon bg-icon-navy ion-ios-arrow-forward"></i> トピックス一覧</a>
			</div>
		</div>
<!-- /ニュース -->
<!-- ニュースリリース -->
		<div class="newsContainer pressRelease tabContent">
			<h3 class="with-border hideSP block"><a href="/news/release/">ニュースリリース <small>/ RELEASE</small></a></h3>
			<div class="newsBox">
				<a href="/news/release/2022/0915.html" >
					<span class="date">2022/09/15</span>
					<p>国立情報学研究所の公式キャラクター「情報犬 ビットくん」恒例のLINEスタンプに加え今年はLINE絵文字も販売</p>
				</a>
			</div>
			<div class="newsBox">
				<a href="/news/release/2022/0831.html" >
					<span class="date">2022/08/31</span>
					<p>フリマアプリ「メルカリ」の出品データを大学等へ無償で提供開始<br>〜二次流通市場における消費者の行動・心理分析の研究などを通じて循環型社会実現への貢献を目指す〜</p>
				</a>
			</div>
			<div class="newsBox">
				<a href="/news/release/2022/0818.html" >
					<span class="date">2022/08/18</span>
					<p>約16万件の商品・サービスの口コミデータを学術研究目的に無償で提供開始</p>
				</a>
			</div>
			<div class="newsBox">
				<a href="/news/release/2022/0812.html" >
					<span class="date">2022/08/12</span>
					<p>胃生検の病理診断支援AIを開発 <br>――不足する病理医を支援、がん医療を確実なものに――</p>
				</a>
			</div>
			<div class="newsBox">
				<a href="/news/release/2022/0727.html" >
					<span class="date">2022/07/27</span>
					<p>ビッグデータ時代の研究の個人情報保護ルールの全体像を説明</br> ~「オープンサイエンスのためのデータ管理基盤ハンドブック」を発行~</p>
				</a>
			</div>
			<div class="text-right next-contents">
				<a href="/news/release/"><i class="bg-icon bg-icon-navy ion-ios-arrow-forward"></i> ニュースリリース一覧</a>
			</div>
		</div>
<!-- /ニュースリリース -->
<!-- イベント -->
		<div class="newsContainer event">
			<h3 class="with-border"><a href="/event/list/">イベント <small>/ EVENT</small></a></h3>
			<div class="newsBox">
				<a href="https://www.nii.ac.jp/event/other/decs/#edx56" >
					<p>【第56回】大学等におけるオンライン教育とデジタル変革に関するサイバーシンポジウム「教育機関DXシンポ」(オンライン開催)</p>
					<span class="date"><i class="ion-ios-calendar-outline"></i> 開催日: 2022/09/30</span>
				</a>
			</div>
			<div class="newsBox">
				<a href="https://www.sinet.ad.jp/events/advnet2022" >
					<p>先端ネットワーク利用研究に関するワークショップ「ADVNET2022」</p>
					<span class="date"><i class="ion-ios-calendar-outline"></i> 開催日: 2022/10/14</span>
				</a>
			</div>
			<div class="newsBox">
				<a href="/event/2022/1016.html" >
					<p>大学共同利用機関シンポジウム2022<br>「科学の時代。見えてきた未来」</p>
					<span class="date"><i class="ion-ios-calendar-outline"></i> 開催日: 2022/10/16</span>
				</a>
			</div>
			<div class="text-right next-contents">
				<a href="/event/list/"><i class="bg-icon bg-icon-white ion-ios-arrow-forward"></i> イベント一覧</a>
			</div>
		</div>
<!-- /イベント -->
	</section>
	<section class="youtubeBox">
		<div class="float-left margin-bottom-default text float-none-sp">
			<h3 class="with-border">おすすめ動画 <small>/ MOVIE</small></h3>
		</div>
		<div class="float-right float-none-sp padding-bottom-md-sp">
			<iframe width="640" height="360" src="https://www.youtube.com/embed/V6gssdHmWrc?rel=0&amp;showinfo=0" frameborder="0" allowfullscreen></iframe>
		</div>
		<div class="float-left text float-none-sp">
			<h4>かけざんをべんきょうしよう! 〜ビットくん九九サイコロにちょうせん!【コンピュータサイエンスパーク初級編】</h4>
			<p class="hideSP"></p>
			<div class="text-right next-contents btn-sp">
				<a href="https://www.nii.ac.jp/csp/try/20220604-first.html"  target="_blank"><i class="bg-icon bg-icon-navy ion-ios-arrow-forward"></i> 詳しくみる</a>
			</div>
		</div>
	</section>
</div>
<style>
	.pc{
		display: inline;
	}
	.sp{
		display: none;
	}
	.covid19{
		padding: 50px 40px;
		width: 100%;
		margin: 0 auto;
	}
	.covid19 h2{
		color: #df0011;
		font-size: 1.375rem;
		font-weight: 700;
		line-height: 1.2;
		margin: 0;
		padding: 0 0 4px;
		border-top: 0;
		border-bottom: 4px solid #df0011;
	}
    .covid19 h3{
		color: #df0011;
		border-bottom: 4px solid #df0011;
	}
	.covid19 ul{
		margin: 0 auto;
	}
	.covid19 ul li{
		font-size: 0.875rem;
		line-height: 1.3125rem;
		border-bottom: 1px dotted #e2e2e5; 
	}
	.covid19 ul li a:after{
		font-family: "Ionicons";
		content: "\f363";
		position: absolute;
		right: .2rem;
		top: calc( 50% - 8px);
		font-size: 1.2em;
	}
	.covid19 ul li span,
	.covid19 ul li p{
		font-weight: 700;
	}
	@media screen and (max-width: 640px) {
		.covid19{
			padding: 50px 18px;
		}
		.pc{
			display: none;
		}
		.sp{
			display: inline;
		}
		.covid19 h2{
			padding: 50px 0 20px 0;
			border-top: 8px solid #df0011;
			border-bottom: 1px solid #e2e2e5;
		}
        .covid19 h3{
			border-bottom: 8px solid #df0011;
		}
		.covid19 ul{
			padding: 0 17px;
		}
		.covid19 ul li{
			font-size: 1.153rem;
		}
		.covid19 ul li span{
			color: #acabc8;
			font-size: 0.875rem;
		}
	}	
	.covid19 ul li a{
		padding: 16px 7px;
		padding-right: 2rem;
		color: #37474f;
		display: block;
	}
</style>
<section>
	<div class="covid19">
		<h3>新型コロナウイルス感染症<br class="sp">(COVID-19)対応について</h3>
		<ul>
        	<li>
				<a href="https://www.rois.ac.jp/info/covid19.html" target="_blank">
					<span class="date">2022/06/30</span>
					<p>当機構における新型コロナウイルス感染症罹患者発生状況</p>
				</a>
			</li>
        <li>
				<a href="https://edx.nii.ac.jp/" target="_blank">
					<span class="date">2021/10/27</span>
					<p>ウェブサイト「教育機関DXシンポアーカイブス」を公開</p>
				</a>
			</li>
        	<li>
				<a href="/news/2020/0408.html">
					<span class="date">2020/04/08</span>
					<p>国立情報学研究所における教職員および学生等の在宅勤務導入について</p>
				</a>
			</li>
		</ul>
	</div>
</section>
<section class="specialBox">
	<h3 class="with-border">注目コンテンツ <small>/ SPECIAL</small></h3>
<div id="footerSlider">
		<a href="/today/96/"><img src="/upload/NIItoday_96_%E3%83%90%E3%83%8A%E3%83%BC_0831_148.jpg" />NII Today 96</a>
		<a href="https://youtu.be/9HqDcxiQzUw" target="_blank"><img src="/upload/seeds22_takefusa_bannar-s.png" />NII SEEDs 研究者インタビュー - 竹房あつ子</a>
		<a href="https://www.nii.ac.jp/event/2022/1016.html"><img src="/upload/daikyo_sympo22_banner-s.png" />大学共同利用機関シンポジウム2022</a>
		<a href="https://www.nii.ac.jp/service/handbook/" target="_blank"><img src="/upload/handobook_s.png" />オープンサイエンスのためのデータ管理基盤ハンドブック</a>
		<a href="https://www.nii.ac.jp/event/shimin/#4th"><img src="/upload/banner_shiminkouza2021_4_s.png" />2021年度 市民講座 「情報学最前線」</a>
		<a href="https://www.nii.ac.jp/event/shimin/#5th"><img src="/upload/banner_shiminkouza2021-5_s.png" />2021年度 市民講座 「情報学最前線」</a>
		<a href="/about/publication/jouhouken-series/"><img src="/upload/659751fbdc8900063c8a092790cd119ddae7594d.png" />情報研シリーズ24 「ビッグデータが拓く医療AI」</a>
		<a href="https://edx.nii.ac.jp/"><img src="/upload/edxarchives148.png" />教育機関DXシンポ<br>アーカイブス</a>
		<a href="/event/other/decs/"><img src="/upload/banner_decs_148.png" />教育機関DXシンポ</a>
		<a href="/csp/" target="_blank"><img src="/upload/banner_csp_s.jpg" />コンピュータサイエンスパーク</a>
</div>
</section>

<div class="bd-gray-top bd-gray-bottom">
	<ul class="menuBoxFooter padding-none-sp cf">
		<li class="bd-gray-left bg-light-gray"><a href="/news/">ニュース<div class="nextPage noClick hidePC"><i class="ion-android-arrow-dropright"></i></div></a></li>
		<li class="bd-gray-left bg-light-gray"><a href="/event/">イベント<div class="nextPage noClick hidePC"><i class="ion-android-arrow-dropright"></i></div></a></li>
		<li class="bd-gray-left bg-light-gray"><a href="/policy/">サイトポリシー<div class="nextPage noClick hidePC"><i class="ion-android-arrow-dropright"></i></div></a></li>
		<li class="bd-gray-left bg-light-gray"><a href="/link/">リンク<div class="nextPage noClick hidePC"><i class="ion-android-arrow-dropright"></i></div></a></li>
		<li class="bd-gray-left bg-light-gray bd-gray-right"><a href="/about/recruit/">採用情報<div class="nextPage noClick hidePC"><i class="ion-android-arrow-dropright"></i></div></a></li>
		<li class="bd-gray-left bg-light-gray bd-gray-right hidePC"> </li>
	</ul>
</div>
<section id="footer" class="table padding-top-default padding-bottom-lg padding-side-default-sp block-sp">
	<div class="padding-right-lg padding-bottom-default padding-top-default padding-none-sp cf">
		<div>
			<div class="padding-bottom-default bd-gray-bottom cf">
				<div class="float-right float-none-sp text-center-sp padding-tb-lg-sp cf">
					<a href="https://www.facebook.com/jouhouken/" class="social-box social-box-facebook noAfter" target="_blank"><i class="ion-social-facebook"></i></a>
					<a href="https://twitter.com/jouhouken" class="social-box social-box-twitter noAfter"><i class="ion-social-twitter" target="_blank"></i></a>
					<a href="https://www.youtube.com/user/jyouhougaku" class="social-box social-box-youtube noAfter"><i class="ion-social-youtube" target="_blank"></i></a>
				</div>
				<div class="float-left float-none-sp">
					<a href="/">
						<img class="block float-left margin-right-default niiLogo" src="/_img/_logo/niiLogoSmall.gif" alt="niiLogoSmall" />
						<div class="float-left line-height-small text-black fontB padding-top-sm-sp text-lg-sp"><small class="hideSP">大学共同利用機関法人 情報・システム研究機構</small><br class="hideSP" />
						国立情報学研究所 <br class="hidePC" /><small class="fontR text-default-sp">〒101-8430 東京都千代田区一ツ橋2-1-2</small></div>
					</a>
				</div>
			</div>
			<div class="copy float-left fontL">
				Copyright&copy; National Institute of Informatics
			</div>
			<div class="staffOnly float-right small">
				<a href="https://staff.nii.ac.jp/auth/shibboleth" class="fontB">STAFF ONLY</a>
			</div>
		</div>
	</div>
	<div class=" footerLink padding-left-default bd-gray-left bd-none-sp padding-none-sp cf">
		<a href="http://www.rois.ac.jp/" target="_blank">情報・システム研究機構</a>
		<a href="http://www.nipr.ac.jp/" target="_blank">国立極地研究所</a>
		<a href="http://www.ism.ac.jp/" target="_blank">統計数理研究所</a>
		<a href="https://www.nig.ac.jp/nig/ja/" target="_blank">国立遺伝学研究所</a>
	</div>
</section>
<div id="toPageTop"><i class="ion-chevron-up"></i></div>
</div><!-- /#mainContents -->
<div class="modalBack"></div>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<script src="/_js/slick/slick.min.js" type="text/javascript" charset="utf-8"></script>
<link rel="stylesheet" type="text/css" href="/userfiles/js/shadowbox/shadowbox.css" />
<script type="text/javascript" src="/userfiles/js/shadowbox/shadowbox.js"></script>
<script type="text/javascript">Shadowbox.init();</script>
<script src="/_js/_main.js"></script>
</body>
</html>

GET以外のメソッド(POST, PUT, DELETE, HEAD, ...)でリクエストを行う場合は以下のように呼び出すことができます。

r = requests.post(url)
r = requests.put(url)
r = requests.delete(url)
r = requests.head(url)

Vaultサーバにアクセスする

Vaultサーバに対してHTTP APIでアクセスして値の格納、取得などの操作を行ってみます。

VaultサーバのHTTP APIはシークレットエンジン毎にそれぞれ用意されています。

  1. KV シークレットエンジン Version 1 API
  2. Cubbyhole シークレットエンジン API

ここではVCPでの利用機会が多いと思われる Cubbyholeシークレットエンジンの例を紹介します。

値を格納する

まずは以下のような設定で値を格納してみます。

  • シークレットエンジン
    • cubbyhole
  • 格納場所
    • vcp/my-secret
  • 格納データ(Key=Value)
    • foo=bar
    • zip=zap
In [9]:
# HTTP APIのURL
url = '{addr}/v1/{engine}/{path}'.format(
    addr=vault_address,
    engine='cubbyhole',    # シークレットエンジンの指定
    path='vcp/my-secret',  # 格納場所の指定
)
print(url)

# 格納データを dictに設定する
payload = {
    'foo': 'bar',
    'zip': 'zap',
}

# アクセストークンをHTTPヘッダに設定する
custom_headers = {
    'X-Vault-Token': vcc_access_token,
}

# 値を格納する HTTP APIを呼び出す
r = requests.post(url, headers=custom_headers, json=payload)
r
https://10.0.0.1:8443/v1/cubbyhole/vcp/my-secret
Out[9]:
<Response [204]>

HTTP APIの URL が http://xxx.xxx.xxx.xxx:8200/v1/cubbyhole/vcp/my-secret として表示されているはずです。その後に204のステータスコードがレスポンスとして表示されていれば cubbyhole への値の格納は成功です。

cubbyholeに値を格納するAPIについてもう少し詳しくみてみます。

APIの詳細についてはリンク先の公式ドキュメントを参照してください。

まず、Vaultサーバに値を格納する場合の HTTP メソッドですが、POST, PUT のいずれかを用います。どちらを用いても同じですが、上の例では POSTを使用しています。

Requestsライブラリで HTTPメソッドのPOSTリクエストを行うには urlを指定して post() を呼び出します。

r = requests.post(url, ...)

値の格納が成功した場合のレスポンスのステータスコードは 204 になります。

シークレットエンジンと格納場所の指定は POSTを行う URLで設定します。URLを以下のように指定します。

{vaultサーバのアドレス}/v1/{シークレットエンジン}/{格納場所}

例えば、先程の例のように cubbyholevcp/my-secret に格納する場合は

http://xxx.xxx.xxx.xxx:8200/v1/cubbyhole/vcp/my-secret

のようになります。格納場所の指定には vcp/my-secretのようにパスライクな値を指定することができます。

次にVaultサーバに格納するデータの指定方法ですが、HTTPの本文(メッセージボディー)に json 形式でキー、バリューを記述します。キー、バリューの組は複数の組を記述することができます。

Requests ライブラリでPOSTリクエストの本文をjson形式で指定するには post()jsonパラメータにキー、バリューの dict を設定します。

requests.post(..., json={
    'key1': 'value1',
    'key2': 'value2',
})

最後にVaultサーバのHTTP APIにアクセスするためのアクセストークンの指定方法について記します。アクセストークンはHTTPリクエストの X-Vault-Token ヘッダーに指定します。

Requests ライブラリでHTTPリクエストにカスタムヘッダーを指定するには、post()headersパラメータにヘッダーの dict を設定します。

requests.post(..., headers={'X-Vault-Token': 'xxxxxxxxxx'})

値を取得する

先程Vaultサーバに格納した値を取得してみます。

値を格納する場合の HTTPメソッドは POST, PUTでしたが、値を取得するAPIでは GET を用います。また成功した場合のステータスコードは 200 になります。

URLとヘッダーの指定方法は、値を格納するHTTP APIの場合に記したものと同様です。

In [10]:
# URLは先ほどと同じなので設定済みの値をそのまま利用している
# アクセストークンを設定設定したヘッダーについても同様

# URLを表示する
print(url)

# 値を取得する HTTP APIを呼び出す
r = requests.get(url, headers=custom_headers)
r
https://10.0.0.1:8443/v1/cubbyhole/vcp/my-secret
Out[10]:
<Response [200]>

取得した値はHTTPレスポンスの本文に json 形式で格納されています。

Requestsライブラリではレスポンスの本文から json 形式のデータを取り出すための関数 json()が用意されています。json()を呼び出してVaultサーバからのレスポンスを取得してみます。

In [11]:
r.json()
Out[11]:
{'request_id': '6164269c-3b75-4ab2-5f1b-cd10f63e0f21',
 'lease_id': '',
 'renewable': False,
 'lease_duration': 0,
 'data': {'foo': 'bar', 'zip': 'zap'},
 'wrap_info': None,
 'warnings': None,
 'auth': None}

レスポンスの本文にはキー、バリューの値だけではなくそれに付随するメタデータも含まれています。キー、バリューは data に対応する部分なので、そこだけを表示させてみます。

In [12]:
r.json()['data']
Out[12]:
{'foo': 'bar', 'zip': 'zap'}

先程設定したキー、バリューが取得できることが確認できました。

一覧取得

Vaultサーバの指定した場所に格納されているエントリの一覧を取得してみます。

エントリの一覧を取得するにはHTTPのメソッドに LIST を指定します。このメソッドは HTTP の標準メソッドではないので Requests ライブラリで呼び出すには request()関数を利用します。

r = requests.request('LIST', ...)

指定する URL にはエントリの一覧を取得するパスを指定します。先程の実行例では vcp/ を指定しています。

格納場所の指定には、値を格納したパスではなく、親ディレクトリに相当するパスを指定する必要があります。

In [13]:
# HTTP APIのURL
url_p = '{addr}/v1/{engine}/{path}'.format(
    addr=vault_address,
    engine='cubbyhole',   # シークレットエンジンの指定
    path='vcp/',          # 一覧取得対象の指定
)
# URLを表示する
print(url_p)

# エントリの一覧を取得する HTTP APIを呼び出す
# アクセストークンは先ほどと同じなので設定済みの値をそのまま利用している
r = requests.request('LIST', url_p, headers=custom_headers)
r
https://10.0.0.1:8443/v1/cubbyhole/vcp/
Out[13]:
<Response [200]>

一覧の取得に成功したするとレスポンスのステータスコードは 200になります。

取得結果はレスポンスの本文に json 形式で格納されています。そのうち、エントリの一覧情報は data 要素にあります。

In [14]:
r.json()['data']
Out[14]:
{'keys': ['my-secret']}

URLに親ディレクトリ相当のパスではなく、値が格納されているパスを指定するとエラー404になります。

In [15]:
# URLを表示する
print(url)

r = requests.request('LIST', url, headers=custom_headers)
print(r)
https://10.0.0.1:8443/v1/cubbyhole/vcp/my-secret
<Response [404]>

値の削除

先程格納した値を削除してみます。

削除するには DELETEメソッドを用います。URLとヘッダーの指定は値の設定、取得の場合と同様です。

In [16]:
# URLは先ほどと同じなので設定済みの値をそのまま利用している
# アクセストークンを設定設定したヘッダーについても同様

# URLを表示する
print(url)

# 値を削除する HTTP APIを呼び出す
r = requests.delete(url, headers=custom_headers)
r
https://10.0.0.1:8443/v1/cubbyhole/vcp/my-secret
Out[16]:
<Response [204]>

削除に成功した場合のステータスコードは 204です。

削除できたことを確認するために格納されているエントリの一覧取得を行ってみます。 vcp/に格納したエントリが全て無くなっているので 404 がレスポンスとして返ってくるはずです。

In [17]:
# URLを表示する
print(url_p)

# 一覧取得
r = requests.request('LIST', url_p, headers=custom_headers)
print(r)
https://10.0.0.1:8443/v1/cubbyhole/vcp/
<Response [404]>

AWSの認証情報を Vaultサーバから読み込むようにVCP SDKの設定を変更する

AWS の認証情報を Vault サーバに格納する

VCP SDKの設定ファイルに書き込まれているAWSの認証情報をVaultサーバに格納します。

AWSのアクセスキー、シークレットキーをVaultサーバに格納するために、まずはPythonの変数にそれぞれの値を設定します。

vcp_config.ymlで確認したAWSのアクセスキーの値を入力してください。

In [18]:
import getpass
aws_access_key = getpass.getpass() 
········

同様にAWSのシークレットキーの値を入力してください。

In [19]:
aws_secret_key = getpass.getpass()
········

VaultのHTTP APIを呼び出し、AWSのアクセスキーとシークレットキーを Vaultサーバに格納します。格納場所はそれぞれ以下のようにします。

  • アクセスキー
    • cubbyhole/aws/access_key
  • シークレットキー
    • cubbyhole/aws/secret_key

まずアクセスキーをVaultサーバに格納します。

In [20]:
# 格納データを dictに設定する
# VCコントローラ のフォーマットに合わせるためにキーの名前は value にする
payload = {
    'value': aws_access_key,
}

# HTTP APIのURL
url = '{addr}/v1/{engine}/{path}'.format(
    addr=vault_address,
    engine='cubbyhole',
    path='aws/access_key',
)
print(url)

# 値の格納
# アクセストークンは先ほどと同じなので設定済みの値をそのまま利用している
r = requests.post(url, headers=custom_headers, json=payload)
r
https://10.0.0.1:8443/v1/cubbyhole/aws/access_key
Out[20]:
<Response [204]>

値の格納が成功したこと(レスポンスが 204であること)を確認します。

次にシークレットキーも同様に値の格納を行います。

In [21]:
# 格納データを dictに設定する
# VCコントローラのフォーマットに合わせるためにキーの名前は value にする
payload = {
    'value': aws_secret_key,
}

# HTTP APIのURL
url = '{addr}/v1/{engine}/{path}'.format(
    addr=vault_address,
    engine='cubbyhole',
    path='aws/secret_key',
)
print(url)

# 値の格納
# アクセストークンは先ほどと同じなので設定済みの値をそのまま利用している
r = requests.post(url, headers=custom_headers, json=payload)
r
https://10.0.0.1:8443/v1/cubbyhole/aws/secret_key
Out[21]:
<Response [204]>

値の格納が成功したこと(レスポンスが 204であること)を確認します。

Vaultサーバに格納されたエントリの一覧を取得して、それぞれの値が所定の場所に格納されていることを確認します。

In [22]:
# HTTP APIのURL
url_p = '{addr}/v1/{engine}/{path}'.format(
    addr=vault_address,
    engine='cubbyhole',
    path='aws/',
)
print(url_p)

# 一覧の取得
r = requests.request('LIST', url_p, headers=custom_headers)
print(r)

# 取得した一覧の表示
print(r.json()['data'])
https://10.0.0.1:8443/v1/cubbyhole/aws/
<Response [200]>
{'keys': ['secret_key', 'access_key']}

認証情報をVaultサーバから取得するように設定する

認証情報をVaultサーバから取得するようにVCP SDKの設定ファイルvcp_config.ymlを変更します。

vcp_config.ymlでは、実際の値がVaultサーバに格納されていることを示すために以下のような記法が利用できます。

vault://(シークレットエンジン)/(格納場所のパス)

先程AWSのアクセスキーを Vault サーバ cubbyholeシークレットエンジン の aws/access_key に格納しましたが、この格納場所は

vault://cubbyhole/aws/access_key

と記すことができます。

では、実際に vcp_config.ymlの設定を変更する作業を行ってみます。

まず、元の設定ファイルを一時的に退避する作業ディレクトリを作成します。

In [23]:
import tempfile

work_dir = tempfile.mkdtemp()
print(work_dir)
/tmp/tmp3zyi79cg

現在のVCP SDKの設定ファイルvcp_config.ymlを作業ディレクトリにコピーします。

In [26]:
!cp /notebooks/notebook/vcp_config/vcp_config.yml {work_dir}

次のセルを実行すると表示されるリンクをから vcp_config.yml が編集できます。AWSに対応する設定を以下のように変更してください。

aws:
    access_key: vault://cubbyhole/aws/access_key
    secret_key: vault://cubbyhole/aws/secret_key

設定ファイルは YAML フォーマットなのでインデントにはタブではなくスペースを用いてください。また、この例では aws: の前にはスペースなし、access_key:, secret_key: の前にはスペース4つを入れてください。

In [27]:
%run scripts/nbutils.py

nb_html_link('/notebooks/notebook/vcp_config/vcp_config.yml', 'vcp_config.yml')
Out[27]:

設定ファイルが正しいフォーマットで保存されたことを確認するために VCP SDKで設定ファイルを読み込んでみます。フォーマットに誤りがある場合は次のセルを実行するとエラーになりますので、先程のリンクから再度編集しなおしてください。

In [28]:
from vcpsdk.vcpsdk import VcpConfigYaml

# VCP SDK の設定ファイルを読み込む
config = VcpConfigYaml(vcp.config_dir).load_config('vcp_config')

元のファイルを復元してから編集しなおしたい場合は次のセルのコメント # を外して実行してください。

編集済のファイルを上書きしてしまいますので、注意して操作してください。

In [ ]:
#!cp {work_dir}/vcp_config.yml /notebooks/notebook/vcp_config/

ここまでの作業でVCP SDKの設定ファイルvcp_config.ymlを認証情報が直接記載されないように変更できました。

VCノード(Amazon EC2インスタンス)を起動できることを確認する

設定変更が正しくおこなわれたことを確認するためにVCノード(Amazon EC2インスタンス)をVCP SDKで起動してみます。

VCノードを起動する

UnitGroupを作成します。

vcp はアクセストークンの値をチェックしたときに作成したものを利用しています。

In [42]:
unit_group = vcp.create_ugroup(
    'handson102_0'       # UnitGroupの名前
)

UnitGroup, Unit, Nodeの状態を確認しておきます。

In [43]:
from IPython.display import display

# UnitGroupの一覧を DataFrame で表示する
display(vcp.df_ugroups())

# Unitの一覧を DataFrame で表示する
display(unit_group.df_units())

# Nodeの一覧を DataFrame で表示する
display(unit_group.df_nodes())
vcno vctype owner vcname state vcid cdate
0 8 compute nobody handson102_0 RUNNING c06a5b39... 2022/09/27 15:32:57 UTC
vctype vcno vcname vc_state vcid cdate unit_name unit_state
[]

sshでログインするための秘密鍵のパスを設定します。

In [44]:
import os
ssh_private_key = os.path.expanduser('~/.ssh/id_rsa')

VCノードに登録する公開鍵のパスを設定します。

In [45]:
ssh_public_key = os.path.expanduser('~/.ssh/id_rsa.pub')

spec を設定します。

In [46]:
# specの取得
spec = vcp.get_spec('aws', 'small')

# SSHの公開鍵を spec に設定する
spec.set_ssh_pubkey(ssh_public_key)

# 設定内容の表示
print(spec)
========================
aws
------------------------

    cci_version: "1.1"
    name: 
    description: 
    private_network: default
    num_nodes: 1
    image: vcp/base:1.8.1-alpine3.13-x86_64
    recovery_mode: none
    docker_opt: {}
    params:
        {'v': [], 'e': ['AUTHORIZED_KEYS=c3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBREFRQUJBQUFCZ1FEWjZ4bElJSVZtclZmMTg3TlhqSDlSNytiWURNZlYzODluNnkySlVBajRPWTdsajFBR1gzd3pDbEczcjNUYlJrY05oakQ3Q0NjalAyaHVlUVlPazhzbXd4UjFWWDgvRlRoU21VSTh3MERJWEc1ZExsTW1JWWdYVVRZZ2U4bjU1YTdHRGcwV0hCdG1JeWh2Q0lEeXNGVm1QWGg0clozNVFEalprVWM5VUxTQTVHK2Vya1lWUHZNVHhXRjczdGZHc05yTm14eHM0YzNvVjQ3aEhpVzU0VnNvWXNyZk9GK1BSZVFBSHpzY0tJUTcrVHlmUEpPbjh5MHcwRElrZGdhd2J1WDdWbU1FT05MbVoyTkhaRys2eWlyclF4TitzRE9nQnhGV3RNUzZlazVwWG8vT0VydzZhemFNcmcwRU1RdCtwSnRUR2UzdWI1L0JmQXM1ckY5d1RBWXp1cG4vUE91d0Jnak1uWUFkemY5dXZWYkNVck13QUxNQjREYzdkQXU2bHU5UGljakdFaEE5d1pLcWgxWm9uZFBqdWt5RzhNOTFvRUdEMTZoaXpZY3JKYVBGeHJxRTB1Y3grZGZ6bFhSall2OUlwYVNTa01IMDZaclc2SnJLcGNGMHE4UnBSNTgveWhPclJWbHNWM0hRUXgxd1N6WDdybGpCUVBVSW5FMGhqcU09IGpvdnlhbkBlY2ZmNTkyODNmOTYK']}

    instance_type: m4.large
    volume_size: 16
    volume_type: gp2
    volume_id: []
    cloud_image: default
    ip_address_list: []
    tags: {}
========================

Unitの作成とVCノードの起動を行います。

VCノードの起動には1分半~2分程度かかります。

In [47]:
unit = unit_group.create_unit('aws-server', spec)
2022-09-28 00:32:58,898 - INFO - BOOTING ... 0 sec
2022-09-28 00:33:04,003 - INFO - BOOTING ... 5 sec
2022-09-28 00:33:09,113 - INFO - BOOTING ... 10 sec
2022-09-28 00:33:14,236 - INFO - BOOTING ... 15 sec
2022-09-28 00:33:19,354 - INFO - BOOTING ... 20 sec
2022-09-28 00:33:24,470 - INFO - BOOTING ... 25 sec
2022-09-28 00:33:29,584 - INFO - BOOTING ... 30 sec
2022-09-28 00:33:34,700 - INFO - BOOTING ... 35 sec
2022-09-28 00:33:39,812 - INFO - BOOTING ... 40 sec
2022-09-28 00:33:44,931 - INFO - BOOTING ... 45 sec
2022-09-28 00:33:50,041 - INFO - BOOTING ... 50 sec
2022-09-28 00:33:55,158 - INFO - BOOTING ... 55 sec
2022-09-28 00:34:00,269 - INFO - BOOTING ... 60 sec
2022-09-28 00:34:05,383 - INFO - BOOTING ... 65 sec
2022-09-28 00:34:10,510 - INFO - BOOTING ... 70 sec
2022-09-28 00:34:15,626 - INFO - BOOTING ... 75 sec
2022-09-28 00:34:20,767 - INFO - BOOTING ... 80 sec
2022-09-28 00:34:25,888 - INFO - BOOTING ... 85 sec
2022-09-28 00:34:31,004 - INFO - BOOTING ... 90 sec
2022-09-28 00:34:36,117 - INFO - BOOTING ... 95 sec
2022-09-28 00:34:41,230 - INFO - BOOTING ... 100 sec
2022-09-28 00:34:46,344 - INFO - BOOTING ... 105 sec
2022-09-28 00:34:51,476 - INFO - BOOTING ... 110 sec
2022-09-28 00:34:56,592 - INFO - BOOTING ... 115 sec
2022-09-28 00:35:01,714 - INFO - BOOTING ... 120 sec
2022-09-28 00:35:06,867 - INFO - BOOTING ... 125 sec
2022-09-28 00:35:12,164 - INFO - BOOTING ... 130 sec
2022-09-28 00:35:17,278 - INFO - BOOTING ... 135 sec
2022-09-28 00:35:22,388 - INFO - BOOTING ... 140 sec
2022-09-28 00:35:27,502 - INFO - BOOTING ... 145 sec
2022-09-28 00:35:32,616 - INFO - BOOTING ... 150 sec
2022-09-28 00:35:37,735 - INFO - BOOTING ... 155 sec
2022-09-28 00:35:42,845 - INFO - BOOTING ... 160 sec
2022-09-28 00:35:47,965 - INFO - BOOTING ... 165 sec
2022-09-28 00:35:53,074 - INFO - BOOTING ... 170 sec
2022-09-28 00:35:58,192 - INFO - BOOTING ... 175 sec
2022-09-28 00:36:03,301 - INFO - BOOTING ... 180 sec
2022-09-28 00:36:08,419 - INFO - BOOTING ... 185 sec
2022-09-28 00:36:13,526 - INFO - BOOTING ... 190 sec
2022-09-28 00:36:18,651 - INFO - BOOTING ... 195 sec
2022-09-28 00:36:23,769 - INFO - BOOTING ... 200 sec
2022-09-28 00:36:34,898 - INFO - unit aws-server is RUNNING

設定変更が正しくおこなわれていた場合 VCノードの起動に成功します。

Vaultサーバに格納した認証情報に誤りがありVCノードの起動に失敗した場合は以下のようなメッセージが表示されます。

2019-XX-XX XX:XX:XX,XXX - INFO - unit aws-server is ERROR
2019-XX-XX XX:XX:XX,XXX - ERROR - [Vc]
+ type[compute] name[handson102] vcno(000) state[ERROR] vcid[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]

[VcUnit]
+ type[compute] name[aws-server]  state[ERROR]
*** HAS ERROR:
---
2019/XX/XX XX:XX:XX UTC: * provider.aws: version = "~> 1.29"
2019/XX/XX XX:XX:XX UTC: * provider.aws: InvalidClientTokenId: The security token included in the request is invalid.

この場合は、次のセルのコメントを外してVCの削除を行って、 AWS の認証情報を Vault サーバに格納するの手順から再度実行してください。

In [48]:
# unit_group.cleanup()

設定ファイルvcp_config.ymlの記述に誤りがありVCノードの起動に失敗した場合は以下のようなメッセージが表示されます。

2019-XX-XX XX:XX:XX,XXX - ERROR - add unit failed: http_status(403)
NoneType
2019-XX-XX XX:XX:XX,XXX - ERROR - 2019/XX/XX XX:XX:XX UTC: VCPVaultReadException: xxxxxxxx-x:cubbyhole/XXX/XXX vault read is failed: ROR - 2019/XX/XX XX:XX:XX UTC: VCPVaultReadException: xxxxxxxx-x:cubbyhole/XXX/XXX vault read is failed:

この場合は、次のセルのコメントを外して設定ファイルvcp_config.ymlの復元と VCの削除を行って、 認証情報をVaultサーバから取得するように設定するの手順から再度実行してください。

In [49]:
#!cp {work_dir}/vcp_config.yml /notebooks/notebook/vcpsdk/vcpsdk/config/ 
# unit_group.cleanup()

VCノードの起動に成功した場合は、Unit, VCノードの一覧を表示させてみます。

In [50]:
# Unitの一覧を DataFrame で表示する
display(unit_group.df_units())

# Nodeの一覧を DataFrame で表示する
display(unit_group.df_nodes())
vctype vcno vcname vc_state vcid cdate unit_name unit_state
0 compute 8 handson102_0 RUNNING c06a5b39... 2022/09/27 15:32:57 UTC aws-server RUNNING
vcno vcname unit_name unit_state node_no node_id node_state cloud_instance_address cloud_instance_id cloud_instance_name volumes
0 8 handson102_0 aws-server RUNNING 1 69470994... RUNNING 172.30.2.7 i-0eea84db32c631d3f VCP-c80e43c2-c06a5b39 none

~/.ssh/known_hosts にVCノードのホストキーを登録します。

In [51]:
from time import sleep

def check_update_known_hosts(ipaddr):
    # VCノード起動直後だと sshd サービスが開始されておらずに known_hosts が更新されない場合がある
    # ssh-keyscan が値を取得できるまで何度かリトライする
    for x in range(10):
        out = ! echo $(ssh-keyscan {ipaddr} 2> /dev/null | wc -l)
        update_lines = int(out[0])
        if update_lines > 0:
            break
        sleep(1)
    else:
        raise RuntimeError("ERROR: timeout!")    

!touch ~/.ssh/known_hosts
for addr in unit_group.find_ip_addresses():
    !ssh-keygen -R {addr}
    check_update_known_hosts(addr)
    !ssh-keyscan -H {addr} >> ~/.ssh/known_hosts
Host 172.30.2.7 not found in /home/jovyan/.ssh/known_hosts
# 172.30.2.7:22 SSH-2.0-OpenSSH_8.4
# 172.30.2.7:22 SSH-2.0-OpenSSH_8.4
# 172.30.2.7:22 SSH-2.0-OpenSSH_8.4
# 172.30.2.7:22 SSH-2.0-OpenSSH_8.4
# 172.30.2.7:22 SSH-2.0-OpenSSH_8.4

ssh でログインして操作する

起動したVCノードに対して uname -a, dh -h, free などのコマンドを実行してみます。

In [52]:
# VCノードのIPアドレスの取得
ip_address = unit_group.find_ip_addresses().pop()
print(ip_address)

# sshに指定するオプションの設定
ssh_opts = f'-i {ssh_private_key} -l root'

print('-' * 40)

# uname -a の実行
!ssh {ssh_opts} {ip_address} uname -a

print('-' * 40)

# df -h の実行
!ssh {ssh_opts} {ip_address} df -h

print('-' * 40)

# free の実行
!ssh {ssh_opts} {ip_address} free
172.30.2.7
----------------------------------------
Linux ip-172-30-2-7 5.11.0-1022-aws #23~20.04.1-Ubuntu SMP Mon Nov 15 14:03:19 UTC 2021 x86_64 Linux
----------------------------------------
Filesystem                Size      Used Available Use% Mounted on
overlay                  15.4G      4.0G     11.4G  26% /
tmpfs                     3.9G         0      3.9G   0% /sys/fs/cgroup
devtmpfs                  3.9G         0      3.9G   0% /dev
tmpfs                     3.9G         0      3.9G   0% /dev/shm
/dev/root                15.4G      4.0G     11.4G  26% /etc/resolv.conf
/dev/root                15.4G      4.0G     11.4G  26% /etc/hostname
/dev/root                15.4G      4.0G     11.4G  26% /etc/hosts
/dev/root                15.4G      4.0G     11.4G  26% /var/lib/docker
----------------------------------------
              total        used        free      shared  buff/cache   available
Mem:        8140916      353916     4370452         920     3416548     7487768
Swap:             0           0           0

VCP SDKの設定ファイルに直接AWSの認証情報を書き込むことをせずにVCノードが起動できることを確認できました。

後始末

起動したVCノードを全て削除します。

In [53]:
unit_group.cleanup()
2022-09-28 00:36:48,022 - INFO - aws-server is DELETING ... 0 sec
2022-09-28 00:36:53,137 - INFO - aws-server is DELETING ... 5 sec
2022-09-28 00:36:58,249 - INFO - aws-server is DELETING ... 10 sec
2022-09-28 00:37:03,372 - INFO - aws-server is DELETING ... 15 sec
2022-09-28 00:37:08,482 - INFO - aws-server is DELETING ... 20 sec
2022-09-28 00:37:13,601 - INFO - aws-server is DELETING ... 25 sec
2022-09-28 00:37:18,716 - INFO - aws-server is DELETING ... 30 sec
2022-09-28 00:37:23,835 - INFO - aws-server is DELETING ... 35 sec
2022-09-28 00:37:28,950 - INFO - aws-server is DELETING ... 40 sec
2022-09-28 00:37:34,064 - INFO - aws-server is DELETING ... 45 sec
2022-09-28 00:37:39,176 - INFO - aws-server is DELETING ... 50 sec
2022-09-28 00:37:44,287 - INFO - aws-server is DELETING ... 55 sec
2022-09-28 00:37:49,361 - INFO - cleanup completed. vc handson102_0 is cleanup(no unit)

編集前の設定ファイルvcp_config.ymlを退避してある作業ディレクトリを削除します。

In [54]:
!rm -rf {work_dir}