AWS Config を使用して、サポートされていないリソースタイプの設定ルールを作成するにはどうすればよいですか?

最終更新日: 2021 年 7 月 28 日

AWS Config でサポートされていないリソースタイプの設定ルールを作成したいのですが。どうすればできますか?

簡単な説明

AWS Config では、AWS リソースが指定された設定に従っているかどうかを検証するための設定ルールを作成できます。デフォルトでは、AWS Config がサポートする AWS リソースタイプの数は限られています。ただし、AWS Config でサポートされていないリソースタイプのカスタム設定ルールを作成することもできます。

カスタム設定ルールがデプロイされると、リソースを評価するために AWS Lambda 関数が作成されます。サポートされていないリソースタイプを評価し、コンプライアンス結果をカスタム設定ルールに戻す Lambda 関数を作成できます。

解決方法

注記: 次の手順とコード例では、サポートされていないリソースである Amazon Cognito を評価するためのカスタム設定ロールを作成します。

前提条件

Lambda 関数用に AWS Identity and Access Management (IAM) ロールを作成すると、Lambda で必要な API コールを実行できます。

1.    IAM コンソールを開き、ナビゲーションペインから [ロール] を選択します。

2.    [Create role (ロールの作成)] を選択します。

3.    [Choose a use case (ユースケースを選択)] について、[Common use cases (一般的ユースケース)] の下で Lambda を選択します。

4.    [Next: Permissions] を選択します。

5.    [Create policy (ポリシーの作成)] を選択します。

注記: 新しいタブに [ Create policy (ポリシーの作成)] ページが開きます。このプロセスで後ほど元のタブに戻ります。

6.    [JSON] タブを選択してから以下のポリシーを入力します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "config:PutEvaluations",
        "cognito-idp:ListUserPools"
      ],
      "Resource": "*"
    }
  ]
}

7.    [Next: Tags (次のステップ: タグ)]、[Next: Review (次へ: 見直し)] の順に選択します。

8.    [Name (名前)] にポリシー名を入力します。

9.    [Create policy (ポリシーの作成)] を選択します。

10.    ステップ 5 から [Create role (ロールの作成)] タブに戻り、ポリシーリストの右側にある更新アイコンを選択します。

11.    新しいポリシー名を見つけて選択してから [Next: Tags (次へ: タグ)] を選択します。

12.    [Next: Review (次へ: 見直し)] を選択します。

13.    [Role name (ロール名)] に lambda-role と入力します。

14.    [Create role (ロールの作成)] を選択します。

カスタム設定ルールの Lambda 関数を作成する

1.    Lambda コンソールを開きます。

2.    [Create function (関数を作成)] を選択します。

3.    [Author from scratch (最初から作成)] を選択します。
[Function name (関数名)] には、関数の名前を入力します。
[Runtime (ランタイム)] で Python 3.8 を選択します。

4.    [Permissions] で [Change default execution role (デフォルト実行ロールを変更)] を選択します。
[Execution role (実行ロール)] で [Use an existing role] を選択します。
[Existing role] について、Lambda で必要な API コールを実行できるように作成したロールをこの記事の [Prerequisites (前提条件)] セクションで選択します。

5.    [Create function (関数を作成)] を選択します。

6.    [Code source] については、Lambda コンソールで lambda_function.py ファイルを開き、デフォルトコードを次のように置き換えて [Deploy (デプロイ)] を選択します。

注記: 次のコード例では、 MFA: OFF を持つすべてのAmazon Cognito ユーザープール を検索し、結果に NON_COMPLIANT のマークを付けます。サポートされていない他のサービスおよび目的に合わせてこのガイダンスをカスタマイズするための情報とリソースについては、「PutEvaluations API および AWS።።Account リソースタイプの値」セクションを参照してください。

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: MIT-0

import json
import boto3

def lambda_handler(event,context):
  cognito = boto3.client('cognito-idp')
  userpools = cognito.list_user_pools(
    MaxResults=5
    )
  userpool_list = userpools['UserPools']
  userpool_ids = []
  
  for i in userpool_list:
    userpool_ids.append(i['Id'])
  
  evaluations = []
  orderingtime = json.loads(event['invokingEvent'])['notificationCreationTime']
  
  for j in userpool_ids:
     userpool_describe = cognito.describe_user_pool(
        UserPoolId = j
      )
     userpool_MFA = userpool_describe['UserPool']['MfaConfiguration']
     if userpool_MFA == 'OFF':
       evaluations.append(
          {
          'ComplianceResourceType': 'AWS::::Account',
          'ComplianceResourceId': j,
          'ComplianceType': 'NON_COMPLIANT',
          'Annotation': 'Test',
          'OrderingTimestamp': orderingtime
          }
        )
     else:
       evaluations.append(
          {
          'ComplianceResourceType': 'AWS::::Account',
          'ComplianceResourceId': j,
          'ComplianceType': 'COMPLIANT',
          'Annotation': 'Test',
          'OrderingTimestamp': orderingtime
          }
        )
  
  result_token = event['resultToken']
  config = boto3.client('config')
  response = config.put_evaluations(
              Evaluations = evaluations,
              ResultToken = result_token,
              TestMode = False
            )

前述のコードは、3 つの主要なステップを実行します。

  • インベントリを作成するすべてのリソースを一覧表示します。
  • インベントリ内の各リソースを指定された設定に照らして評価します。
  • AWS Config への PutEvaluations API コールを使用した評価に基づいて、コンプライアンスステータスを返します。

カスタム定期設定ルールを作成する

AWS Config でカスタム定期設定ルールを作成する必要があります。次に、前のセクションで作成した Lambda 関数にカスタムルールを関連付けます。手順については、「カスタムルールの作成」を参照してください。

重要: 後のステップで新しいカスタム設定ルールの ARN に注意してください。

AWS Config サービスで Lambda 関数の呼び出しを承認する

1.    Lambda コンソールを開いてからナビゲーションペインで [Functions (関数)] を選択します。

2.    Lambda 関数のハイパーリンクされた 関数名を選択して関数の詳細を開きます。

3.    [Configuration (設定)] タブで [アクセス許可] を選択します。

4.    [Resource-based policy (リソースベースのポリシー)] で [Add permissions (アクセス許可を追加)] を選択します。
[Policy statement (ポリシーステートメント)] で [AWS のサービス] を選択します。
[Service (サービス)] で [Other (その他)] を選択します。
[Principal (プリンシパル)] に config.amazonaws.com と入力します。
前のセクションで作成したカスタム設定ルールの ARN を [ソース ARN] に入力します。
注記
: カスタム設定ルール ARN を見つけるには、AWS Config コンソールを開き、ナビゲーションペインで [Rules (ルール)] を選択します。ハイパーリンクルールの [Name (名前)] を選択してから Config rule ARN をコピーします。
[Action (アクション)] で lambda:InvokeFunction を選択します。
[Statement ID (ステートメント ID)] に一意の ID を入力します。

5.    [Save (保存)] を選択します。

PutEvaluations API とAWS::::Account リソースタイプ値

この記事の手順と例では、 MFA: OFF を持つすべての Amazon Cognito ユーザープール を検索し、結果に NON_COMPLIANT のマークを付けます。ただし、サポートされていないリソースタイプでは、特定の要件を満たすようにプロセスを変更できます。AWS::::Account リソースタイプを使用するコード例については、 aws-config-rules GitHub ページを参照してください。

PutEvaluations API コールには次のパラメータが含まれます。

{
   "Evaluations": [ 
    { 
     "Annotation": "string",
     "ComplianceResourceId": "string",
     "ComplianceResourceType": "string",
     "ComplianceType": "string",
     "OrderingTimestamp": number
    }
   ],
   "ResultToken": "string",
   "TestMode": boolean
}

サポートされていないリソースタイプについては、 ComplianceResourceType の値として AWS።።Account を入力する必要があります。AWS።።Account リソースタイプは、特定のリソースではなくアカウント全体について\報告します。

例:

{
  'ComplianceResourceType': 'AWS::::Account',
  'ComplianceResourceId': 'Resource Id',
  'ComplianceType': 'COMPLIANT'|'NON_COMPLIANT',
  'Annotation': 'string',
  'OrderingTimestamp': number
}

サポートされていないリソースが AWS። Account ではなく ComplianceResourceType 値として入力されると、次のエラーが発生します。

  • コンソールで:「利用可能な結果はありません」
  • Lambda CloudWatch Logs:「エラー: ClientError: PutEvaluations オペレーションの呼び出し時にエラー (InternalFailure) が発生しました (最大再試行回数に到達: 4)」
  • CloudTrail (PutEvaluations API):「エラー: ClientError: putEvaluations オペレーションの呼び出し時にエラー (InternalFailure) が発生しました (最大再試行回数に到達: 4)

AWS።።Account リソースタイプの値を使用する場合は、以下の点に注意してください。

1.    このリソースタイプの設定項目は記録されません。

2.    AWS።Config።ResourceCompliance の下のコンプライアンス設定項目は、このリソースタイプでは記録されません。

3.    このリソースタイプでは、リソースタイムラインは使用できません。

4.    AWS マネジメントコンソールでは、このリソースタイプの [Manage Resource (リソースの管理)] ボタンは使用できません。


この記事は役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?