GraphQL によるデータ取得
Shisho Cloud では、リソースの検査や、評価結果(decision)の登録は、ワークフローにて定義されています。また、その検査に必要な検査/監査対象のデータに関しては、ワークフロー内に GraphQL クエリ形式で定義されています。本ページでは、Shisho Cloud における GraphQL の仕様について説明します。なお、ワークフローの詳細については、こちらのページ で詳しく説明しているので、参照してください。
GraphQL は API 向けに作られたクエリ言語で、クライアントが必要とするデータのみを取得できるなど、柔軟なアプローチが特徴です。詳しくは GraphQL (英語)をご参照ください。
ワークフローと GraphQL クエリ
ワークフローは複数の ジョブ(Job)を持ち、各ジョブの decide/notify ブロック に、input ブロックがあります。その input ブロックに記述されているのが GraphQL クエリで、検査/監査対象のデータを定義しています。 Shisho Cloud は、このようなクエリの定義に従って各ジョブごとにデータを取得し、その取得したデータをポリシーコードに入力します。
jobs:
- id: example
name: Example Job
decide:
input:
schema: |
query {
...
}
- id: notify
name: Notify Job Status
decide:
input:
schema: |
query {
...
}
例えば以下の GraphQL クエリは、AWS アカウント内の VPC がデフォルトかどうかを示す isDefault を取得しています。
jobs:
- id: example
name: Example Job
decide:
input:
schema: |
query {
aws {
accounts {
network {
vpcs {
metadata {
id
}
isDefault
}
}
}
}
}
GraphQL クエリの検索条件
通常、リソースは全件取得されますが、 いくつかのフィールドでは特定のリソースのみを取得するための検索条件(condition)を指定できるinputフィールドを持ち、これにより特定のリソースのみ取得できます。
下記のケースでは、AWSNetworkCondition を利用し、特定のリージョン(regions)、ap-northeast-1, us-west-2の 「AWS VPC リソース」("aws-vpc")のみを取得できます。
type AWSNetwork {
"""
VPC networks
"""
vpcs(condition: AWSNetworkCondition): [AWSVPC!]!
@resource(kind: "aws-vpc")
...
}
input AWSNetworkCondition {
"""
Regions of networks
If no list is specified (i.e. null), this field returns networks in *any* zone.
"""
regions: [AWSRegion!] @testdata(constraint: { array: { length: 2 } })
}
jobs:
- id: example
name: Example Job
decide:
input:
schema: |
query {
aws {
accounts {
network {
vpcs (condition: { regions: ["ap-northeast-1", "us-west-2"] }){
metadata {
id
}
isDefault
}
}
}
}
}
shishoctl CLI による GraphQL クエリの実行
shishoctl CLI は Shisho Cloud を操作するための CLI です。 様々なコマンドを用意していますが、その中には GraphQL クエリを実行するためのコマンドもあります。
shishoctl query run --org <ORGANIZATION_ID> <GRAPHQL_QUERY_FILE_NAME>.graphql
例えば、以下のようなコマンドを実行することで、shisho-cloud-demoという組織に対して、 example.graphql というファイルに記述された GraphQL クエリを実行できます。
shishoctl query run --org shisho-cloud-demo example.graphql
query {
aws {
accounts {
network {
vpcs {
metadata {
id
}
isDefault
}
}
}
}
}
shishoctl CLI についての詳細は、こちら をご参照ください。
発展: GraphQL ディレクティブ(directives)
Shisho Cloud は GraphQL をスキーマ/クエリ言語として採用し、ユーザーが検査/監査したいデータを簡単に定義・取得できるようにしています。いま、スキーマにはいくつかの GraphQL ディレクティブ(directive)が定義されており、これによりスキーマからデータ取得ロジッ クの仕様が読み解きやすいようになっています。また、クエリ時にも Shisho Cloud 独特の GraphQL ディレクティブを用いて、検査/監査データ取得の挙動をカスタマイズできるようになっています。
本セクションでは、Shisho Cloud が対応している GraphQL ディレクティブについて説明します。
なお、下記の説明文において、リソースというキーワードが出てきます。Shisho Cloud では 監査対象データのエンティティをリソースと定義しています。リソースの詳細については、こちら をご参照ください。
GraphQL スキーマ内に付与されたディレクティブ
GraphQL ディレクティブは、GraphQL スキーマ内の GraphQL オブジェクトやフィールドに対して付与されることがあります。Shisho Cloud においても同様で、スキーマ内におけるディレクティブは、主にオブジェクトやフィールドの仕様を表現するために用いられています。以下では Shisho Cloud で定義されている GraphQL ディレクティブのうち、主としてスキーマで 用いられる想定のものを列挙します。
@resource
@resource ディレクティブはリソースの種別(resource kind)を明示するために利用されます。以下の例では、vpcs フィールドが、Shisho Cloud 内で「AWS VPC リソース」("aws-vpc")として扱われるリソースを返却することがスキーマ内で明示されています。
type AWSNetwork {
"""
VPC networks
"""
vpcs(condition: AWSNetworkCondition): [AWSVPC!]!
@resource(kind: "aws-vpc")
...
}
@canBePartial
@canBePartial ディレクティブは、リソースの一部のみを取得できるかどうかを示すために利用されます。このディレクティブがスキーマ上で付与されたフィールドに対しては、ある方法でクエリ発行時に リソース ID を指定することで、当該リソースに関するデータのみが取得できるようになります。この方法は「 GraphQL クエリの検索条件」セクションで説明した検索条件(condition)とはまた別の形で、取得するリソースを絞り込む仕組みで、Shisho Cloud が再診断を高速に提供するために暗黙のうちに利用されています。