NRIネットコム Blog

NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

AWS CloudFormation StackSetsの仕組み・機能、マネジメントコンソールとAPIの関係、デプロイターゲットのアカウントフィルター、パラメータの意味・役割に関するまとめ

小西秀和です。
今回はマルチアカウント管理でよく使うAWS CloudFormation StackSetsについて仕組み・機能、マネジメントコンソールとAPIの関係、デプロイターゲットのアカウントフィルター、パラメータの意味・役割にフォーカスしてまとめました。
なお、AWS CloudFormation StackSetsのテンプレートにユーザーが定義するものは「テンプレートのパラメータ」と呼ぶことにして、AWS CloudFormation StackSetsのサービスに対して設定する「StackSetのパラメータ」、「スタックインスタンスのパラメータ」とは区別して表現します。

今回の記事の内容は次のような構成になっています。

AWS CloudFormation StackSetsとは

AWS CloudFormation StackSetsは予め指定した管理アカウントからAWS CloudFormationテンプレートを使用して、複数のAWSアカウントおよび各AWSアカウント内の複数のAWSリージョンでAWS CloudFormationスタックを作成、更新、削除する機能です。
StackSetを作成すると指定したAWSアカウントおよびAWSリージョンへStackSetに関連づけたAWS CloudFormationスタックがデプロイされ、AWS CloudFormationテンプレートに定義されたAWSリソースやAWSリソース同士の関連付けなどを作成、更新、削除します。

StackSetではAWSアカウントとAWSリージョンの組み合わせ(例:AWSアカウント123456789012のAWSリージョンap-northeast-1)を1つのスタックインスタンスとして管理します。
また、StackSetではStackSetの作成(CreateStackSet)、更新(UpdateStackSet)、削除(DeleteStack)、ドリフト検出(DetectStackSetDrift)やStackSetで管理する各スタックインスタンスの作成(CreateStackInstances)、更新(UpdateStackInstances)、削除(DeleteStackInstances)などのAPI実行に関する進捗や結果をOperationとして管理します。

AWS CloudFormation StackSetsのパーミッションモデル(許可モデル)

AWS CloudFormation StackSetsでは「パーミッションモデル(許可モデル)」(PermissionModel)という管理アカウントやデプロイするAWSアカウントの管理および権限付与の方法が2つあります。

サービスマネージド型(SERVICE_MANAGED)

サービスマネージド型は全ての機能の有効化したAWS Organizationsで管理するAWSアカウントへ組織単位(OU)またはAWSアカウント単位でスタックインスタンスをデプロイするパーミッションモデルです。
サービスマネージド型ではAWS CloudFormation StackSetsの機能で必要なIAMロールを作成し、AWS Organizationsの管理アカウントでStackSetsを管理します(メンバーアカウントにStackSetsの管理を委任することもできます)。
また、AWS Organizationsへ後から追加されるAWSアカウントにもスタックインスタンスとしてStackSetを自動デプロイする設定を有効化できます

セルフマネージド型(SELF_MANAGED)

セルフマネージド型は必要なIAMロールを作成するアクセス許可を持つ任意のAWSアカウントにAWSアカウント単位でスタックインスタンスをデプロイするパーミッションモデルです。
セルフマネージド型ではAWSが提供しているAWS CloudFormationテンプレートまたは手動で必要なIAMロールを作成し、指定したAWSアカウントでStackSetsを管理します。

サービスマネージド型におけるAWS CloudFormation StackSetsの概念図

以降では主にAWS Organizationsとあわせてマルチアカウント管理などで使用する「サービスマネージド型(SERVICE_MANAGED)」を想定して記事を記載しています。
次の概念図はAWS CloudFormation StackSetsでテンプレートから作成されるスタックをサービスマネージド型のパーミッションモデルで2つの組織単位(OU)および2つのリージョン(us-east-1、ap-northeast-1)にデプロイしている例です。

サービスマネージド型におけるAWS CloudFormation StackSetsのデプロイ例
サービスマネージド型におけるAWS CloudFormation StackSetsのデプロイ例

AWS CloudFormation StackSetsの管理アカウントの特定のリージョンからStackSetを作成して管理します。
管理アカウントのどのリージョンからStackSetを作成しても、複数メンバーアカウントの複数リージョンへスタックをデプロイできます。
ただし、どのStackSetを管理アカウントのどのリージョンで作成したのかがわかるように管理した方がよいでしょう。

AWS CloudFormation StackSetsにおけるAPI(AWS SDK・AWS CLI含む)のOperationとAWSマネジメントコンソールとの関係性

ここではAWS CloudFormation StackSetsのAPI(AWS SDK・AWS CLI含む)で実行できるOperationの特徴やAWSマネジメントコンソールとの関係性をまとめました。
また、StackSetをデプロイする対象を条件により指定するデプロイ設定(DeploymentTargets)で使えるアカウントフィルタータイプ(AccountFilterType)の特徴についても記載しています。

AWS SDK・AWS CLIなどのAPIを使用したStackSet、スタックインスタンスを作成・更新・削除するフローのパターン

AWS SDKやAWS CLIなどのAPIレベルでAWS CloudFormation StackSetsを使用する基本的なフローのパターンには次のようなものが挙げられます。

  • CreateStackSetでStackSetを作成する → 作成したStackSetへCreateStackInstancesでスタックインスタンスを追加する
  • 作成したStackSetへ更にCreateStackInstancesでスタックインスタンスを追加する
  • 作成したStackSetへCreateStackInstancesでパラメータの値をStackSetと異なる値で上書きしてスタックインスタンスを追加する
  • UpdateStackSetでStackSetを更新(テンプレート、パラメータキーの更新含む)して一部またはすべてのスタックインスタンスに更新を反映する
  • UpdateStackInstancesで一部またはすべてのスタックインスタンスのパラメータの値をStackSetと異なる値で上書きして更新する
  • DeleteStackInstancesでStackSetに関連付いている一部のスタックインスタンスを削除する
  • DeleteStackInstancesでStackSetに関連付いているすべてのスタックインスタンスを削除する → DeleteStackでStackSetを削除する
  • DetectStackSetDriftでStackSetに関連付いているすべてのスタックインスタンスのドリフト(スタックで管理している構成と実際のAWSリソースの構成の差異)を検出する

AWS CloudFormation StackSetsを理解するのに重要なデプロイ機能のポイント

上記のようにAWS CloudFormation StackSetsのStackSet、スタックインスタンスの作成、更新などに使用するAPIにはある程度の使用パターンがあります。
AWS CloudFormation StackSetsにはこれらのAPIでStackSetをデプロイする組織単位(OU)、AWSアカウント、リージョンを指定する機能があります。
この記事ではデプロイに関して次のように呼ぶことにして説明していきます。

「デプロイターゲット」(DeploymentTargets):組織単位(OU)、AWSアカウントを直接指定またはアカウントフィルターの条件で絞り込んだ対象。
「デプロイ範囲」:上記の「デプロイターゲット」(DeploymentTargets)にリージョンを加えた対象。

特にAWS CloudFormation StackSetsを理解するのに重要なデプロイ機能のポイントは次の点です。

  • CreateStackSetはStackSetの設定、テンプレートおよびテンプレートのパラメータの設定を作成するだけでスタックインスタンスは作成しない
  • CreateStackInstancesでのみStackSetへ組織単位(OU)・AWSアカウント、AWSリージョンを指定してスタックインスタンスとして追加できる
  • UpdateStackSetStackSetの全体的な設定(StackSetのパラメータ、テンプレート、テンプレートのパラメータなどの全体設定)を更新し、組織単位(OU)・AWSアカウント、AWSリージョンを指定して、すでに追加されているスタックインスタンスのうち全部または一部に反映する
  • UpdateStackInstancesはStackSetで設定されたテンプレートのパラメータに対する上書きパラメータを、組織単位(OU)・AWSアカウント、AWSリージョンを指定して、すでに追加されているスタックインスタンスのうち全部または一部に反映する
  • CreateStackInstancesUpdateStackSetUpdateStackInstancesDeleteStackInstancesでは組織単位(OU)、AWSアカウント、フィルター条件AccountFilterTypeでデプロイ先を指定するデプロイターゲット(DeploymentTargetsパラメータ)が使用できる(詳細は後述)。
  • UpdateStackSetUpdateStackInstancesといった更新系のAPIではDeploymentTargets(AccountFilterTypeを含む)に新しい組織単位(OU)・AWSアカウント、AWSリージョンを指定してもスタックインスタンスの追加はできない
    ※スタックインスタンスの追加はCreateStackInstancesでしかできない。
    UpdateStackSetUpdateStackInstancesはすでに追加されているスタックインスタンスのみをデプロイ範囲にできる(絞り込みのみ)。
  • 自動デプロイが有効になっているとDeploymentTargets(AccountFilterTypeを含む)によってデプロイターゲットを絞り込んでテンプレートを更新した場合も、その最新のOperationで更新したテンプレートがStackSetに後から追加されるAWSアカウントに適用される。
    ※StackSetに定義できるテンプレートは最新の1つだけ。
    ※更新時に存在し、デプロイ範囲ではなかったスタックインスタンスは更新前のテンプレートによるリソース状態を保持する。
    ※更新後に追加したスタックインスタンスは更新後のテンプレートが適用される。
  • DeleteStackでStackSetを削除するためには、先にDeleteStackInstancesでStackSetに関連付いているすべてのスタックインスタンスを削除する必要がある。

AWS CloudFormation StackSetsにおけるAWSマネジメントコンソールのアクションとAPIの関係性

AWS CloudTrailのイベント履歴を見るとAWSマネジメントコンソールのアクションではStackSetおよびStackSetに関連づいているスタックインスタンスに対して概ね次のように作成・更新・削除に関連するAPIを使用しています。

AWSマネジメントコンソールのアクション アクション内で実行されるAPI
StackSetの作成(Create StackSet) CreateStackSet → CreateStackInstances
StackSetにスタックを追加(Add stacks to StackSet) CreateStackInstances
StackSetの詳細を編集(Edit StackSet details) UpdateStackSet(AutoDeploymentのパラメータ変更以外)
StackSetのパラメータを上書き(Override StackSet parameters) UpdateStackInstances
StackSetからスタックを削除(Delete stacks from StackSet) DeleteStackInstances
自動デプロイを編集(Edit automatic deployment)
※自動デプロイ(Automatic deployment)の有効・無効、アカウント削除の動作(Account removal behavior)のスタック削除・保持を設定する操作。
UpdateStackSet(AutoDeploymentのEnabledとRetainStacksOnAccountRemovalのパラメータ変更)
ドリフトの検出(Detect drift) DetectStackSetDrift
StackSetの削除(Delete StackSet) DeleteStack

このように、AWSマネジメントコンソールでは「StackSetの作成」でStackSetのテンプレートなどの設定とテンプレートを展開して適用するOUやAWSアカウントの追加を同時にできます。
ただし、「StackSetの作成」をしたあとのStackSetの更新の場面では上記のようにAWSマネジメントコンソールのアクションに対応するAPIが分かれていることに注意が必要です。
特に本記事執筆時点でStackSetのテンプレート更新とスタックインスタンスとして組織単位(OU)やAWSアカウントを追加することは同時にはできないためそれぞれ別に実行する必要があります。

デプロイターゲット(DeploymentTargets)とアカウントフィルタータイプ(AccountFilterType)

AWS CloudFormation StackSetsにおけるAWSマネジメントコンソールのアクションとAPIの関係性を整理したところで、双方で指定するデプロイターゲット(DeploymentTargets)の特にアカウントフィルタータイプ(AccountFilterType)について説明します。
「AWS CloudFormation StackSetsを理解するのに重要なデプロイ機能のポイント」で前述したようにCreateStackInstancesUpdateStackSetUpdateStackInstancesDeleteStackInstancesのAPIに対応する次のAWSマネジメントコンソールのアクションではアカウントフィルタータイプ(AccountFilterType)を含むデプロイターゲット(DeploymentTargets)が指定できます。

  • 「StackSetの作成」(CreateStackInstances実行部分)
  • 「StackSetにスタックを追加」(CreateStackInstances)
  • 「StackSetの詳細を編集」(UpdateStackSet)
  • 「StackSetのパラメータを上書き」(UpdateStackInstances)
  • 「StackSetからスタックを削除」(DeleteStackInstances)

次に「StackSetにスタックを追加」、「StackSetの詳細を編集」、「StackSetのパラメータを上書き」、「StackSetからスタックを削除」の概要とパーミッションモデルが「サービスマネージド型」の場合に適用できるAccountFilterType(詳細は後述のパラメータ一覧を参照)の適用範囲についてまとめます。

アクション(該当するAPI)概要AccountFilterTypeを組織単位(OU)で使用した場合の適用範囲の例
「StackSetの作成」
(CreateStackInstances実行部分)
CreateStackSetで作成されたStackSetのテンプレートや設定でスタックインスタンス(組織単位(OU)・AWSアカウント、AWSリージョン)を追加する。 NONE(なし):新たに組織単位(OU)内のすべてのAWSアカウントを追加する。
INTERSECTION(共通集合):新たに組織単位(OU)内にある指定した一部のAWSアカウントのみを追加する。
DIFFERENCE(差分):新たに組織単位(OU)内にある指定した一部のAWSアカウント以外を追加する。
UNION(和集合):※本記事執筆時点で作成のOperationではUNIONによるアカウントフィルターは許可されていない
「StackSetにスタックを追加」
(CreateStackInstances)
「StackSetの詳細を編集」
(UpdateStackSet)
現在StackSetをデプロイしているスタックインスタンス(組織単位(OU)・AWSアカウント、AWSリージョン)の範囲内で、指定したスタックインスタンスに対してStackSetのテンプレートなどの設定を更新する。 NONE(なし):すでに追加しているスタックインスタンスの範囲内で、指定した組織単位(OU)内のすべてのAWSアカウントを更新する。
INTERSECTION(共通集合):すでに追加しているスタックインスタンスの範囲内で、指定した組織単位(OU)内にある一部のAWSアカウントのみを更新する。
DIFFERENCE(差分):すでに追加しているスタックインスタンスの範囲内で、指定した組織単位(OU)内にある一部のAWSアカウント以外を更新する。
UNION(和集合):すでに追加しているスタックインスタンスの範囲内で、複数の組織単位(OU)のうち、指定した組織単位(OU)にある全部のAWSアカウントと別の組織単位(OU)内にある一部のAWSアカウントを更新する。
「StackSetのパラメータを上書き」
(UpdateStackInstances)
現在StackSetをデプロイしているスタックインスタンス(組織単位(OU)・AWSアカウント、AWSリージョン)の範囲内で、指定したスタックインスタンスに対してStackSetのテンプレートのパラメータを上書き更新する。
「StackSetからスタックを削除」
(DeleteStackInstances)
現在StackSetをデプロイしているスタックインスタンス(組織単位(OU)・AWSアカウント、AWSリージョン)の範囲内で、指定したスタックインスタンスを削除する。 NONE(なし):すでに追加しているスタックインスタンスの範囲内で、指定した組織単位(OU)内のすべてのAWSアカウントを削除する。
INTERSECTION(共通集合):すでに追加しているスタックインスタンスの範囲内で、指定した組織単位(OU)内にある一部のAWSアカウントのみを削除する。
DIFFERENCE(差分):すでに追加しているスタックインスタンスの範囲内で、指定した組織単位(OU)内にある一部のAWSアカウント以外を削除する。
UNION(和集合):すでに追加しているスタックインスタンスの範囲内で、複数の組織単位(OU)のうち、指定した組織単位(OU)にある全部のAWSアカウントと別の組織単位(OU)内にある一部のAWSアカウントを削除する。

AWSマネジメントコンソールでStackSetと各スタックインスタンスをまとめて処理できる仕様は便利である一方で、StackSetとスタックインスタンスの関係性が把握しにくい側面もあるため、特にOUやAWSアカウントへの適用範囲や更新される内容を詳細に把握したい場合はAPIレベルで仕様を確認するとわかりやすいです。

アカウントフィルタータイプ(AccountFilterType)の種類と特徴の概念図

上記で説明したアカウントフィルタータイプ(AccountFilterType)のうちINTERSECTION(共通集合)、DIFFERENCE(差分)、UNION(和集合)について、更新のOperation(UpdateStackSetUpdateStackInstances)でデプロイ対象を絞り込む例を次に概念図で示します。
前提として「組織単位(OU) X」に所属するメンバーアカウント(A、B、C)と「組織単位(OU) Y」に所属するメンバーアカウント(D、E、F)の2つのリージョン(us-east-1、ap-northeast-1)へStackSetがすでにデプロイされている状態とします。

INTERSECTION(共通集合)

「組織単位(OU) X」をターゲットとして、アカウントフィルターINTERSECTION(共通集合)で「組織単位(OU) X」の一部である「メンバーアカウント A」、「メンバーアカウント B」を指定したデプロイターゲットによる更新の例。
「組織単位(OU) X」の「メンバーアカウント A」、「メンバーアカウント B」が更新される。

INTERSECTION(共通集合)を使用したデプロイターゲットの例
INTERSECTION(共通集合)を使用したデプロイターゲットの例

※「組織単位(OU) X」と「組織単位(OU) Y」の両方をターゲットとして、アカウントフィルターINTERSECTION(共通集合)で「組織単位(OU) X」の一部である「メンバーアカウント A」、「メンバーアカウント B」を指定して更新する場合も「組織単位(OU) X」の「メンバーアカウント A」、「メンバーアカウント B」だけが更新される。

DIFFERENCE(差分)

「組織単位(OU) X」をターゲットにして、アカウントフィルターDIFFERENCE(差分)で「組織単位(OU) X」の一部である「メンバーアカウント A」を指定したデプロイターゲットによる更新の例。
「組織単位(OU) X」の「メンバーアカウント A」以外のメンバーアカウントが更新される。

DIFFERENCE(差分)を使用したデプロイターゲットの例
DIFFERENCE(差分)を使用したデプロイターゲットの例

※「組織単位(OU) X」と「組織単位(OU) Y」の両方をターゲットにして、アカウントフィルターDIFFERENCE(差分)で「組織単位(OU) X」の一部である「メンバーアカウント A」を指定して更新する場合は、「組織単位(OU) X」の「メンバーアカウント A」以外のメンバーアカウントに加えて「組織単位(OU) Y」のすべてのメンバーアカウントが更新される。

UNION(和集合)

「組織単位(OU) X」をターゲットにして、アカウントフィルターUNION(和集合)で「組織単位(OU) Y」の一部である「メンバーアカウント D」を指定したデプロイターゲットによる更新の例。
「組織単位(OU) X」のすべてのメンバーアカウントに加えて「組織単位(OU) Y」の一部である「メンバーアカウント D」が更新される。

UNION(和集合)を使用したデプロイターゲットの例
UNION(和集合)を使用したデプロイターゲットの例

※「組織単位(OU) X」と「組織単位(OU) Y」の両方をターゲットにして、アカウントフィルターUNION(和集合)で「組織単位(OU) Y」の一部である「メンバーアカウント D」を指定して更新する場合は、「組織単位(OU) Y」の「メンバーアカウント D」を含む「組織単位(OU) X」と「組織単位(OU) Y」のすべてのメンバーアカウントが更新される。

AWS CloudFormation StackSets作成時、更新時、参照時のパラメータ一覧と設定内容(意味・役割)

ここではAWS CloudFormation StackSets作成時、更新時、参照時のパラメータ一覧と設定内容(意味・役割)についてまとめました。
パラメータ名をスペースでインデントしているものについては、直前にあるインデントがないパラメータの連想配列(辞書型、ハッシュ、マップ)要素として定義されているものです。

StackSetの作成時(CreateStackSet)、更新時(UpdateStackSet)、削除時(DeleteStackSet)に指定するパラメータ(設定項目)一覧

パラメータ名 コンソールでの名称
意味・役割・設定内容
ユーザーが値を指定可能なOperation
StackSetName ・StackSet名(StackSet name)
作成するリージョンで一意となるStackSetの名称。更新、削除のOperationではStackSet名で対象のStackSetを一意に特定する。
作成、更新、削除
(更新、削除では編集不可)
StackId
新しいスタックセットにインポートする場合に指定するスタックID(ARN)。
作成
Description ・StackSetの説明
ユーザーが任意の情報を記載できるStackSetの説明。
作成、更新
TemplateBody
StackSetのテンプレートを直接文字列型で指定する場合に使用。TemplateBodyまたはTemplateURLのいずれかを指定する必要があり、両方は指定できない。
作成、更新
TemplateURL ・Amazon S3テンプレートのURL(Amazon S3 template URL)
StackSetのテンプレートがあるAmazon S3のURLを指定する場合に使用。TemplateBodyまたはTemplateURLのいずれかを指定する必要があり、両方は指定できない。
作成、更新
Parameters ・パラメータ(Parameters)
StackSetで使用するテンプレートのパラメータ。基本的にはユーザーが定義したテンプレートのパラメータに従って指定する。
作成、更新
  ParameterKey
StackSetで使用するテンプレートのパラメータのキー。
作成、更新
  ParameterValue
StackSetで使用するテンプレートのパラメータのキーに対する値を指定する。
作成、更新
  UsePreviousValue
スタックの更新中にスタックがパラメーターキーで使用している既存のパラメーター値を使用するかどうかの指定。
True:既存の値を使用する。
False:既存の値を使用しない。
作成、更新
  ResolvedValue
読み取り専用のSSMパラメータキーに対応する値。テンプレートのSSMパラメータタイプでのみ使用する。
作成、更新
Capabilities
テンプレートにIAMユーザーを作成するなどAWSアカウントに影響がある特定の機能を含むリソースがあることを明示的に認識するために指定する必要がある項目。
CAPABILITY_IAM:IAMリソース(AWS::IAM::AccessKey、AWS::IAM::Group、AWS::IAM::InstanceProfile、AWS::IAM::Policy、AWS::IAM::Role、AWS::IAM::User、AWS::IAM::UserToGroupAddition等)を作成する。
CAPABILITY_NAMED_IAM:IAMリソース(AWS::IAM::AccessKey、AWS::IAM::Group、AWS::IAM::InstanceProfile、AWS::IAM::Policy、AWS::IAM::Role、AWS::IAM::User、AWS::IAM::UserToGroupAddition等)をカスタム名を指定して作成する。
CAPABILITY_AUTO_EXPAND:CloudFormationによってホストされるマクロ(AWS::Include、AWS::Serverless)を含む。
作成、更新
AdministrationRoleARN ・IAM管理ロールARN(IAM admin role ARN)
StackSets管理アカウントでStackSetを作成・更新するために使用するIAMロールのARN。StackSets管理アカウント内で特定のStackSetを管理できるIAMロールを指定する場合などに使用する。
作成、更新
ExecutionRoleName ・IAM実行ロール名(IAM execution role name)
StackSetでスタックをデプロイする対象の各AWSアカウントで実際にStackSetのスタックを実行するIAMロールの名称。
作成、更新
PermissionModel ・アクセス許可モデル
管理アカウントやデプロイするAWSアカウントの管理および権限付与の方法。スタックインスタンスが関連づいている場合は更新不可。
SERVICE_MANAGED:サービスマネージド型のアクセス許可。
SELF_MANAGED:セルフマネージド型のアクセス許可。
作成、更新
AutoDeployment ・デプロイ設定(Deployment configuration)
PermissionModelがSERVICE_MANAGEDの場合に、StackSetのターゲットとして指定した組織または組織単位(OU)へ後から追加されたAWSアカウントにStackSetを自動的にデプロイするどうかを設定する(次のEnabledで設定)。
また、アカウント削除時にスタックを保持するかどうかを設定する(次のRetainStacksOnAccountRemovalで設定)。
作成、更新
  Enabled ・自動デプロイ(Automatic deployment)
True:自動デプロイを有効化。
False:自動デプロイを無効化。
作成、更新
  RetainStacksOnAccountRemoval ・アカウント削除時にスタックを保持(Retain stacks on account removal)
True:アカウント削除時にスタックを保持する。
False:アカウント削除時にスタックを保持しない。
作成、更新
ManagedExecution ・マネージド型の実行(Managed execution)
StackSetsの実行時に競合しないOperationを同時に実行し、競合するOperationをキューに入れるかどうかを設定する(次のActiveで設定)。
作成、更新
  Active ・マネージド型の実行(Managed execution)
True:StackSetsの実行時に競合しないOperationを同時に実行し、競合するOperationをキューに入れる。
False:StackSetsの実行時に一度に1つのOperationを要求順に実行する。
作成、更新
ClientRequestToken
リクエストを再試行する可能性がある場合にAWS CloudFormation StackSetsが同じ名前で別のStackSetを作成しようとしていないことを認識できるように指定するトークン。
作成
Tags ・タグ(Tags)
StackSetにつけるタグ(次のKeyとValueで設定)。
作成、更新
  Key ・キー(Key)
StackSetにつけるタグのキー。
作成、更新
  Value ・値(Value)
StackSetにつけるタグのキーに対する値。
作成、更新
DeploymentTargets ・デプロイ設定(Deployment configuration)
PermissionModelがSERVICE_MANAGEDの場合に、StackSetの更新を反映する組織単位(OU)またはAWSアカウントを部分的に変更する場合に設定する(次のAccounts、AccountsUrl、OrganizationalUnitIds、AccountFilterTypeで設定)。
StackSetのテンプレート(またはテンプレートのパラメータ)に更新がある場合は更新前にすべてのスタックインスタンスのステータスがOUTDATEDとなり、更新対象となる組織単位(OU)またはAWSアカウントのスタックインスタンスを更新する。
StackSetのテンプレート(またはテンプレートのパラメータ)に更新がない場合は更新対象となる組織単位(OU)またはAWSアカウント以外の既存のスタックインスタンスはそのままのステータスとなる。
更新
  Accounts ・アカウント番号(Account numbers)
更新対象のアカウント番号の配列。AccountFilterTypeを指定する場合にも使用。
更新
  AccountsUrl
更新対象のアカウント番号を返すAmazon S3 URL。
更新
  OrganizationalUnitIds ・組織単位(OU)(Organizational units(OUs))
更新対象の組織Root IDまたは組織単位(OU)IDの配列。
更新
  AccountFilterType ・アカウントフィルタータイプ(Account filter type)
更新対象となるAWSアカウンまたは組織単位(OU)の条件をフィルターで指定する設定。
NONE(なし):指定した組織単位(OU)のAWSアカウントにデプロイする。
INTERSECTION(共通集合):指定した組織単位(OU)のAWSアカウントのうち、Accountsパラメータで指定されたAWSアカウントにデプロイする
DIFFERENCE(差分):指定した組織単位(OU)のAWSアカウントのうち、Accountsパラメータで指定されたAWSアカウント以外にデプロイする(停止中のAWSアカウントやOU内の特定のAWSアカウントを除外可能)。
UNION(和集合):APIのデフォルト設定。指定した組織単位(OU)のAWSアカウントに加えて、Accountsパラメータで指定された他の組織単位(OU)にあるAWSアカウントにもデプロイする(更新対象のOU全体に加えて別のOUにある個々のAWSアカウントを1つのリクエストで更新可能)。
更新
Accounts ・アカウント番号(Account numbers)
PermissionModelがSELF_MANAGEDの場合にStackSetをデプロイするAWSアカウント番号を配列で指定する。
更新
Regions ・リージョン(Regions)
既にデプロイしているリージョンのうち、StackSetの更新を反映するリージョンを部分的に指定する場合に設定するリージョンの配列。
StackSetのテンプレート(またはテンプレートのパラメータ)に更新がある場合は更新前にすべてのスタックインスタンスのステータスがOUTDATEDとなり、更新対象となるリージョンのスタックインスタンスを更新する。
StackSetのテンプレート(またはテンプレートのパラメータ)に更新がない場合は更新対象となるリージョン以外の既存のスタックインスタンスはそのままのステータスとなる。
更新
OperationPreferences ・デプロイオプション(Deployment options)
StackSetのOperationを実行する方法の設定(次のRegionConcurrencyType、RegionOrder、FailureToleranceCount、FailureTolerancePercentage、MaxConcurrentCount、MaxConcurrentPercentageで指定)。
更新
  RegionConcurrencyType ・リージョンの同時実行(Region Concurrency)
StackSetのOperationを複数のリージョンへ同時に並列で実行するかどうかの設定。
SEQUENTIAL:順次実行。
PARALLEL:並列実行。
更新
  RegionOrder ・リージョンの指定(Specify regions)
StackSetのOperationを実行するリージョンの順序を設定する配列。
更新
  FailureToleranceCount ・障害耐性 数値(Failure tolerance Number)
StackSetのOperationの失敗を許容するリージョンごとのAWSアカウント数。StackSetのOperationの失敗数がこの閾値を超えて、あるAWSアカウントのリージョンで停止した場合は後続のリージョンではOperationが実行されない。
更新
  FailureTolerancePercentage ・障害耐性 割合(Failure tolerance Percentage)
StackSetのOperationの失敗を許容するリージョンごとのAWSアカウントの割合。StackSetのOperationの失敗割合がこの閾値を超えて、あるAWSアカウントのリージョンで停止した場合は後続のリージョンではOperationが実行されない。
更新
  MaxConcurrentCount ・同時アカウントの最大数 数値(Maximum concurrent accounts Number)
StackSetのOperationを複数のAWSアカウントへ同時に並列で実行するAWSアカウント数の最大値。
更新
  MaxConcurrentPercentage ・同時アカウントの最大数 割合(Maximum concurrent accounts Percentage)
StackSetのOperationを複数のAWSアカウントへ同時に並列で実行するAWSアカウント数の最大割合。
更新
OperationId
リクエストを再試行する可能性がある場合にAWS CloudFormation StackSetsが重複してStackSetを更新しようとしていないことを認識できるように指定する冪等トークン。指定しない場合は自動生成。
更新
CallAs
PermissionModelがSERVICE_MANAGEDの場合に、StackSetsをAWS Organizationsの管理アカウントで実行しているか、StackSetsの権限を委任されたメンバーアカウントで実行しているかを指定する。
SELF(デフォルト):AWS Organizationsの管理アカウントで実行。
DELEGATED_ADMIN:StackSetsの権限を委任されたメンバーアカウントで実行。
作成、更新、削除

スタックインスタンスの作成時(CreateStackInstances)、更新時(UpdateStackInstances)、削除時(DeleteStackInstances)に指定するパラメータ(設定項目)一覧

パラメータ名 コンソールでの名称
意味・役割・設定内容
ユーザーが値を指定可能なOperation
StackSetName ・StackSet名(StackSet name)
作成するリージョンで一意となるStackSetの名称。スタックインスタンスの作成、更新、削除のOperationではStackSet名で対象のStackSetを一意に特定する。
作成、更新、削除
(指定のみで編集不可)
ParameterOverrides ・上書きの指定(Specify overrides)
StackSetで使用するテンプレートのパラメータを対象のスタックインスタンスごとに上書きする場合に指定する。基本的にはユーザーが定義したテンプレートのパラメータに従って指定する。
作成、更新
  ParameterKey ・名前(Name)
上書き対象のパラメータのキーを指定する。
作成、更新
  ParameterValue ・値の上書き(Override value)
上書き対象のパラメータのキーに対する値を指定する。
作成、更新
  UsePreviousValue
スタックの更新中にスタックがパラメーターキーで使用している既存のパラメーター値を使用するかどうかの指定。
True:既存の値を使用する、False:既存の値を使用しない
作成、更新
  ResolvedValue
読み取り専用のSSMパラメータキーに対応する値。テンプレートのSSMパラメータタイプでのみ使用する。
作成、更新
DeploymentTargets ・デプロイ設定(Deployment configuration)
PermissionModelがSERVICE_MANAGEDの場合に、StackSetの更新を反映する組織単位(OU)またはAWSアカウントを部分的に変更する場合に設定する(次のAccounts、AccountsUrl、OrganizationalUnitIds、AccountFilterTypeで設定)。
StackSetのテンプレート(またはテンプレートのパラメータ)に更新がある場合は更新前にすべてのスタックインスタンスのステータスがOUTDATEDとなり、更新対象となる組織単位(OU)またはAWSアカウントのスタックインスタンスを更新する。
StackSetのテンプレート(またはテンプレートのパラメータ)に更新がない場合は更新対象となる組織単位(OU)またはAWSアカウント以外の既存のスタックインスタンスはそのままのステータスとなる。
作成、更新、削除
  Accounts ・アカウント番号(Account numbers)
更新対象のアカウント番号の配列。AccountFilterTypeを指定する場合にも使用。
作成、更新、削除
  AccountsUrl
更新対象のアカウント番号を返すAmazon S3 URL。
作成、更新、削除
  OrganizationalUnitIds ・組織単位(OU)(Organizational units(OUs))
更新対象の組織Root IDまたは組織単位(OU)の配列
作成、更新、削除
  AccountFilterType ・アカウントフィルタータイプ(Account filter type)
作成・更新対象となるAWSアカウンまたは組織単位(OU)の条件をフィルターで指定する設定。
NONE(なし):指定した組織単位(OU)のAWSアカウントにデプロイする。
INTERSECTION(共通集合):指定した組織単位(OU)のAWSアカウントのうち、Accountsパラメータで指定されたAWSアカウントにデプロイする
DIFFERENCE(差分):指定した組織単位(OU)のAWSアカウントのうち、Accountsパラメータで指定されたAWSアカウント以外にデプロイする(停止中のAWSアカウントやOU内の特定のAWSアカウントを除外可能)。
UNION(和集合):APIのデフォルト設定。指定した組織単位(OU)のAWSアカウントに加えて、Accountsパラメータで指定された他の組織単位(OU)にあるAWSアカウントにもデプロイする(更新対象のOU全体に加えて別のOUにある個々のAWSアカウントを1つのリクエストで更新可能。作成のOperationではUNIONによるアカウントフィルターは許可されていない)。
作成、更新、削除
Accounts ・アカウント番号(Account numbers)
PermissionModelがSELF_MANAGEDの場合にStackSetをデプロイするAWSアカウント番号を配列で指定する。
作成、更新、削除
Regions ・リージョン(Regions)
既にデプロイしているリージョンのうち、StackSetの更新を反映するリージョンを部分的に指定する場合に設定するリージョンの配列。
StackSetのテンプレート(またはテンプレートのパラメータ)に更新がある場合は更新前にすべてのスタックインスタンスのステータスがOUTDATEDとなり、更新対象となるリージョンのスタックインスタンスを更新する。
StackSetのテンプレート(またはテンプレートのパラメータ)に更新がない場合は更新対象となるリージョン以外の既存のスタックインスタンスはそのままのステータスとなる。
作成、更新、削除
OperationPreferences ・デプロイオプション(Deployment options)
StackSetのOperationを実行する方法の設定(次のRegionConcurrencyType、RegionOrder、FailureToleranceCount、FailureTolerancePercentage、MaxConcurrentCount、MaxConcurrentPercentageで指定)。
作成、更新、削除
  RegionConcurrencyType リージョンの同時実行(Region Concurrency)
StackSetのOperationを複数のリージョンへ同時に並列で実行するかどうかの設定。
SEQUENTIAL:順次実行。
PARALLEL:並列実行。
作成、更新、削除
  RegionOrder ・リージョンの指定(Specify regions)
StackSetのOperationを実行するリージョンの順序を設定する配列。
作成、更新、削除
  FailureToleranceCount ・障害耐性 数値(Failure tolerance Number)
StackSetのOperationの失敗を許容するリージョンごとのAWSアカウント数。StackSetのOperationの失敗数がこの閾値を超えて、あるAWSアカウントのリージョンで停止した場合は後続のリージョンではOperationが実行されない。
作成、更新、削除
  FailureTolerancePercentage ・障害耐性 割合(Failure tolerance Percentage)
StackSetのOperationの失敗を許容するリージョンごとのAWSアカウントの割合。StackSetのOperationの失敗割合がこの閾値を超えて、あるAWSアカウントのリージョンで停止した場合は後続のリージョンではOperationが実行されない。
作成、更新、削除
  MaxConcurrentCount ・同時アカウントの最大数 数値(Maximum concurrent accounts Number)
StackSetのOperationを複数のAWSアカウントへ同時に並列で実行するAWSアカウント数の最大値。
作成、更新、削除
  MaxConcurrentPercentage ・同時アカウントの最大数 割合(Maximum concurrent accounts Percentage)
StackSetのOperationを複数のAWSアカウントへ同時に並列で実行するAWSアカウント数の最大割合。
作成、更新、削除
OperationId
リクエストを再試行する可能性がある場合にAWS CloudFormation StackSetsが重複してStackSetにOperationを実行しようとしていないことを認識できるように指定する冪等トークン。指定しない場合は自動生成。
作成、更新、削除
CallAs
PermissionModelがSERVICE_MANAGEDの場合に、StackSetsをAWS Organizationsの管理アカウントで実行しているか、StackSetsの権限を委任されたメンバーアカウントで実行しているかを指定する。
SELF(デフォルト):AWS Organizationsの管理アカウントで実行。
DELEGATED_ADMIN:StackSetsの権限を委任されたメンバーアカウントで実行。
作成、更新、削除

StackSetの参照時(DescribeStackSet)に取得できるパラメータ(設定項目)一覧

パラメータ名 コンソールでの名称
意味・役割・設定内容
ユーザーが値を指定可能なOperation
StackSetARN ・StackSet ARN
StackSetのARN。arn:aws:cloudformation:<リージョン名>:<AWSアカウント番号>:stackset/<StackSetName>:12345678-1234-1234-1234-123456789012の形式。
StackSetId StackSet ID
StackSetのID。<StackSetName>:12345678-1234-1234-1234-123456789012の形式。
StackSetName ・StackSet名(StackSet name)
作成したリージョンで一意となるStackSetの名称。
作成、更新、削除
(更新、削除では指定のみ)
Description ・StackSetの説明(StackSet description)
ユーザーが任意の情報を記載できるStackSetの説明。
作成、更新
Status ・StackSetのステータス(StackSet status)
ACTIVE:StackSetが動作中。
DELETED:StackSetが削除済。
TemplateBody ・テンプレート(Template)
StackSetで使用しているテンプレートの内容。
作成、更新
Parameters ・パラメータ(Parameters)
StackSetで使用しているテンプレートのパラメータ。
作成、更新
  ParameterKey ・キー(Key)
StackSetで使用しているテンプレートのパラメータのキー。
作成、更新
  ParameterValue ・値(Value)
StackSetで使用するテンプレートのパラメータのキーに対して設定された値。
作成、更新
  UsePreviousValue
スタックの更新中にスタックがパラメーターキーで使用している既存のパラメーター値を使用するかどうかの指定。
True:既存の値を使用する。
False:既存の値を使用しない。
作成、更新
  ResolvedValue ・解決済みの値(Resolved value)
読み取り専用のSSMパラメータキーに対応する値。テンプレートのSSMパラメータタイプでのみ使用する。
作成、更新
Capabilities
テンプレートにIAMユーザーを作成するなどAWSアカウントに影響がある特定の機能を含むリソースがあることを明示的に認識するために指定する必要がある項目。
CAPABILITY_IAM:IAMリソース(AWS::IAM::AccessKey、AWS::IAM::Group、AWS::IAM::InstanceProfile、AWS::IAM::Policy、AWS::IAM::Role、AWS::IAM::User、AWS::IAM::UserToGroupAddition等)を作成する機能に対応する。
CAPABILITY_NAMED_IAM:IAMリソース(AWS::IAM::AccessKey、AWS::IAM::Group、AWS::IAM::InstanceProfile、AWS::IAM::Policy、AWS::IAM::Role、AWS::IAM::User、AWS::IAM::UserToGroupAddition等)をカスタム名を指定して作成する機能に対応する。
CAPABILITY_AUTO_EXPAND:CloudFormationによってホストされるマクロ(AWS::Include、AWS::Serverless)を含む機能に対応する。
作成、更新
AdministrationRoleARN ・StackSet管理者ロールARN(StackSet admin role ARN)
IAM管理ロールARN(IAM admin role ARN)
StackSets管理アカウントでStackSetを作成・更新するために使用するIAMロールのARN。StackSets管理アカウント内で特定のStackSetを管理できるIAMロールを指定する場合などに使用する。
作成、更新
ExecutionRoleName
StackSetでスタックをデプロイする対象の各AWSアカウントで実際にStackSetのスタックを実行するIAMロールの名称。
作成、更新
StackSetDriftDetectionDetails
StackSetのドリフトステータスに関する詳細情報。
  DriftStatus ・ドリフトステータス(Drift status)
ドリフト検出を実行した結果のステータス。
DRIFTED:関連づくスタックインスタンスで実行しているスタック内の1つ以上のリソースについてドリフト(StackSetの構成と差異)が検出された状態。
IN_SYNC:ドリフトがなくStackSetの構成と一致している状態。
UNKNOWN:将来使用のための予約パラメータ。
NOT_CHECKED:ドリフト検出がまだ実行されていない状態。
  DriftDetectionStatus
スタックセットのドリフト検出Operationのステータス。
COMPLETED:ドリフト検出がすべての関連づくスタックインスタンスで成功した状態。
FAILED:ドリフト検出の失敗が設定した障害耐性を超えて失敗した状態。
PARTIAL_SUCCESS:ドリフト検出の失敗が設定した障害耐性を超えずに部分的に成功した状態。
IN_PROGRESS:ドリフト検出が実行中の状態。
STOPPED:ドリフト検出がユーザーによって停止された状態。
  LastDriftCheckTimestamp ・前回のドリフトチェック時刻(Last drift check time)
タイムスタンプ
  TotalStackInstancesCount
StackSetに対するスタックインスタンスの合計数。
  DriftedStackInstancesCount
StackSetに対するドリフトが検出されたスタックインスタンスの数。
  InSyncStackInstancesCount
StackSetに対するドリフトが検出されなかったスタックインスタンスの数。
  InProgressStackInstancesCount
StackSetに対するドリフト検出を実行中のスタックインスタンスの数。
  FailedStackInstancesCount
StackSetに対するドリフト検出が失敗したスタックインスタンスの数。
AutoDeployment ・デプロイ設定(Deployment configuration)
PermissionModelがSERVICE_MANAGEDの場合に、StackSetのターゲットとして指定した組織または組織単位(OU)へ後から追加されたAWSアカウントにStackSetを自動的にデプロイするどうかを設定する(次のEnabledで設定)。
また、アカウント削除時にスタックを保持するかどうかを設定する(次のRetainStacksOnAccountRemovalで設定)。
作成、更新
  Enabled ・自動デプロイ(Automatic deployment)
True:自動デプロイを有効化。
False:自動デプロイを無効化。
作成、更新
  RetainStacksOnAccountRemoval ・アカウント削除時にスタックを保持(Retain stacks on account removal)
True:アカウント削除時にスタックを保持する。
False:アカウント削除時にスタックを保持しない。
作成、更新
PermissionModel ・アクセス許可モデル(Permission model)
管理アカウントやデプロイするAWSアカウントの管理および権限付与の方法。
SERVICE_MANAGED:サービスマネージド型のアクセス許可。
SELF_MANAGED:セルフマネージド型のアクセス許可。
作成、更新
OrganizationalUnitIds
更新対象の組織Root IDまたは組織単位(OU)の配列。
更新
ManagedExecution ・マネージド型の実行(Managed execution)
StackSetsの実行時に競合しないOperationを同時に実行し、競合するOperationをキューに入れるかどうかを設定する(次のActiveで設定)。
作成、更新
  Active ・マネージド型の実行(Managed execution)
True:StackSetsの実行時に競合しないOperationを同時に実行し、競合するOperationをキューに入れる。
False:StackSetsの実行時に一度に1つのOperationを要求順に実行する。
作成、更新
Tags ・タグ(Tags)
StackSetにつけるタグ(次のKeyとValueで設定)。
作成、更新
  Key ・キー(Key)
StackSetにつけるタグのキー。
作成、更新
  Value ・値(Value)
StackSetにつけるタグのキーに対する値。
作成、更新

スタックインスタンスの参照時(DescribeStackInstance)に取得できるパラメータ(設定項目)一覧

パラメータ名 コンソールでの名称
意味・役割・設定内容
ユーザーが値を指定可能なOperation
StackSetId ・StackSet ID
StackSetのID。<StackSetName>:12345678-1234-1234-1234-123456789012の形式。
StackId ・スタックID(Stack ID)
スタックインスタンスのID。arn:aws:cloudformation:<リージョン名>:<AWSアカウント番号>:stack/<StackSetName>-12345678-1234-1234-1234-123456789012/12345678-1234-1234-1234-123456789012の形式。
Region ・AWSリージョン(AWS region)
スタックインスタンスが関連付けられているAWSリージョン名。
作成、更新
Account ・AWSアカウント(AWS account)
スタックインスタンスが関連付けられているAWSアカウント番号。
作成、更新
OrganizationalUnitId
PermissionModelがSERVICE_MANAGEDの場合に、作成・更新のOperationでDeploymentTargetsへ指定した組織Root IDまたは組織単位(OU) ID。
作成、更新
ParameterOverrides
スタックインスタンスごとに上書きするテンプレートのパラメータ。
作成、更新
  ParameterKey
スタックインスタンスごとに上書きするテンプレートのパラメータのキー。
作成、更新
  ParameterValue
スタックインスタンスごとに上書きするテンプレートのパラメータの値。
作成、更新
  UsePreviousValue
スタックの更新中にスタックがパラメーターキーで使用している既存のパラメーター値を使用するかどうかの指定。
True:既存の値を使用する。
False:既存の値を使用しない。
作成、更新
  ResolvedValue
読み取り専用のSSMパラメータキーに対応する値。テンプレートのSSMパラメータタイプでのみ使用する。
作成、更新
Status
StackSetとスタックインスタンスの同期に関するステータス。
CURRENT:StackSetにおいて最新状態。
OUTDATED:StackSetにおいて最新状態でない。Operation(作成、更新)で該当のスタックインスタンスに対するスタックが失敗した、Operation(作成、更新)で他のスタックインスタンスの失敗によって該当のスタックインスタンスへの実行前に停止した、Operation(作成、更新)が実行中だがまだ該当のスタックインスタンスで実行されていない、といった原因がある。
INOPERABLE:Operation(削除)が失敗した状態。該当のスタックインスタンスは基本的には以降のOperation(更新)から除外されるが、手動でスタックインスタンスの削除が必要な場合もある。
StackInstanceStatus
本記事執筆時点では詳細ステータスのみを持っている。
  DetailedStatus ・詳細ステータス(Detailed Status)
スタックインスタンスのOperationに関する詳細なステータス。
PENDING:該当のスタックインスタンスに対してOperationが未実行の状態。
RUNNING:該当のスタックインスタンスに対してOperationが実行中の状態。
SUCCEEDED:該当のスタックインスタンスに対してOperationが実行済で成功した状態。
FAILED:該当のスタックインスタンスに対してOperationが実行済で失敗した状態。
CANCELLED:該当のスタックインスタンスに対してOperationが実行前にキャンセルされた状態。Operationで障害耐性を超えた、手動でOperationを停止した、といった原因がある。
INOPERABLE:Operation(削除)が失敗した状態。該当のスタックインスタンスは基本的には以降のOperation(更新)から除外されるが、手動でスタックインスタンスの削除が必要な場合もある。
StatusReason ・状況の理由(Status Reason)
スタックインスタンスのステータスの理由。
DriftStatus ・ドリフトステータス(Drift status)
ドリフト検出を実行した結果のステータス。
DRIFTED:スタックインスタンスで実行しているスタック内の1つ以上のリソースについてドリフト(StackSetの構成と差異)が検出された状態。
IN_SYNC:ドリフトがなくStackSetの構成と一致している状態。
UNKNOWN:将来使用のための予約パラメータ。
NOT_CHECKED:ドリフト検出がまだ実行されていない状態。
LastDriftCheckTimestamp ・前回のドリフトチェック時刻(Last drift check time)
スタックインスタンスでドリフト検出のOperationを最後に実行した時刻。
LastOperationId ・最後のオペレーションID(Last operation ID)
スタックインスタンスで最後に実行されたStackSetのOperation ID。
この値がスタックインスタンス間で異なる場合はスタックインスタンスの追加やDeploymentTargets(AccountFilterTypeを含む)による更新など一部のスタックインスタンスにOperationを実行したことを示す。

<参考資料>
AWS Documentation(Working with AWS CloudFormation StackSets - AWS CloudFormation)
AWS CloudFormation API Reference
CloudFormation — Boto3 Docs
Tech Blog with related articles referenced

まとめ

今回はAWS CloudFormation StackSetsの仕組み・機能、マネジメントコンソールとAPIの関係、デプロイターゲットのアカウントフィルター、パラメータの意味・役割についてまとめました。
AWS CloudFormation StackSetsはAWSにおけるマルチアカウントの管理やリソースデプロイメントの利便性を向上させてくれる機能ですが、AWSマネジメントコンソールとAPIの関係やStackSetとスタックインスタンスがもつパラメータの意味や役割を予め知っておくと実際に運用している中で目的に応じた変更を詳細に適用する場合や調査に役立ちます。
AWS CloudFormation StackSetsには今回話題の中心にしたこと以外にも深く知っておくと便利な機能がありますし、これからのアップデートでさらに利便性の高い機能が追加されていくのではないかと考えています。
今後もAWS CloudFormation StackSetsの最新アップデートや活用方法についてウォッチしていきたいと思います。

Written by Hidekazu Konishi
Hidekazu Konishi (小西秀和), a Japan AWS Top Engineer and a Japan AWS All Certifications Engineer

執筆者小西秀和

Japan AWS All Certifications Engineer(AWS認定全冠)の知識をベースにAWSクラウドの活用に取り組んでいます。
Amazon.co.jp: 小西 秀和: books, biography, latest update
NRIネットコムBlog: 小西 秀和: 記事一覧