1
0

More than 1 year has passed since last update.

Selefra-selefra がプロバイダーからデータを取得する方法

Last updated at Posted at 2023-06-25

banner1.jpg

Selefraでは、ポリシーのコード化のためにデータを収集するためにプロバイダを使用しています。プロバイダは、クラウドサービスやソフトウェアサービス(SaaS)プロバイダが提供する公式のAPIドキュメンテーションに基づいて書かれたコードスニペットです。Selefraを使用する際、ユーザーはプロバイダコードを記述し、それを実行してクラウドにリクエストを送信しデータを取得します。取得したデータは、事前に定義された形式でPostgreSQLデータベースに格納されます。

AWSプロバイダでリソースを取得する

AWSのリソースを例にすると、ユーザーは特定のAWSサービスをデータ収集のために選択することができます。以下に、データ収集のためにAWS SDK("github.com/aws/aws-sdk-go-v2/aws/service/s3")を使用する例を示します。

func (x *TableAwsS3BucketsGenerator) GetDataSource() *schema.DataSource {
    return &schema.DataSource{
        Pull: func(ctx context.Context, clientMeta *schema.ClientMeta, client any, task *schema.DataSourcePullTask, resultChannel chan<- any) *schema.Diagnostics {

            diagnostics := schema.NewDiagnostics()

            cl := client.(*aws_client.Client)
            svc := cl.AwsServices().S3
            response, err := svc.ListBuckets(ctx, nil, func(options *s3.Options) {
                options.Region = listBucketRegion(cl)
            })
            if err != nil {
                return schema.NewDiagnosticsErrorPullTable(task.Table, err)
            }

            var wg sync.WaitGroup
            buckets := make(chan types.Bucket)
            errs := make(chan error)
            for i := 0; i < fetchS3BucketsPoolSize; i++ {
                wg.Add(1)
                go fetchS3BucketsWorker(ctx, client, buckets, errs, resultChannel, &wg)
            }
            go func() {
                defer close(buckets)
                for _, bucket := range response.Buckets {
                    select {
                    case <-ctx.Done():
                        return
                    case buckets <- bucket:
                    }
                }
            }()
            done := make(chan struct{})

            go func() {
                for err = range errs {
                    diagnostics.AddErrorPullTable(task.Table, err)
                }
                close(done)
            }()
            wg.Wait()
            close(errs)
            <-done

            return diagnostics
        },
    }
}

この例では、AWS S3 SDKを使用してAWS S3バケットのリストを取得しています。ListBucketsメソッドを利用し、ゴルーチンを使用して各バケットの詳細情報を並行して取得しています。取得した情報は事前に定義されたデータ構造に格納されます。この関数は、バケットリストを取得するためのメソッド

を含むschema.DataSource型のポインタを返します。

AWSプロバイダでローカルデータストレージ構造を作成する

もちろん、データを収集するためのAPIについての理解が必要です。データを事前に保存するテーブル構造を定義する必要があります。

func GenTables() []*schema.Table {
    return []*schema.Table{
        table_schema_generator.GenTableSchema(&amp.TableAwsAmpWorkspacesGenerator{}),
        table_schema_generator.GenTableSchema(&eks.TableAwsEksClustersGenerator{}),
        // 430行のコードは省略
        table_schema_generator.GenTableSchema(&kinesis.TableAwsKinesisStreamsGenerator{}),
        table_schema_generator.GenTableSchema(&cloudfront.TableAwsCloudfrontCachePoliciesGenerator{})
    }
}

テーブル構造は非常に大きくなる場合がありますが、GPTを使用して処理することができます。さらに、手動で監査を行う必要があります。

AWSの他のリソース(例:S3バケット、RDSデータベース、Lambda関数など)のデータを取得するために、必要に応じてプロバイダコードを記述することができます。各サービスについてのAPIメソッドやパラメータについては、AWSの公式ドキュメンテーションを参照し、それに応じてプロバイダコードを記述することをおすすめします。

プロバイダコードを使用することで、SelefraはAWSサービスにリクエストを送信し、必要なデータを取得します。このデータは事前に定義された形式でPostgreSQLデータベースに格納され、ポリシー分析や意思決定支援のために使用されます。

提供された例のコードはデモンストレーションの目的であり、実際のプロバイダコードは使用するAWSサービスやAPIによって異なる場合があります。特定のサービスに特化したプロバイダコードを記述するために、AWSの公式ドキュメンテーションを参照することをおすすめします。

結論

これは、Selefraのようなポリシーのコード化製品でクラウドリソースからデータを取得する方法の詳細な説明です。リトライメカニズムやエラーハンドリングなど、ビジネスロジックに固有の詳細な部分がありますが、それに応じて対応することができます。また、公式リポジトリを訪れてオープンソースのプロバイダコードを表示することもできます。最新の情報を入手したり、オープンソース製品Selefraを体験したりするには、次のリンクを参照してください:

GitHub: https://github.com/selefra/selefra

Slack: https://selefra.io/community/join

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0