Не в состоянии перечислить события. ресурс = список (событие ['деталь'] ['запросПараметры'] ['оценки']) [0] - PullRequest
0 голосов
/ 17 марта 2020

Получение приведенной ниже ошибки при попытке перечислить события S3.

Response:
{
  "errorMessage": "'detail'",
  "errorType": "KeyError",
  "stackTrace": [
    [
      "/var/task/lambda_function.py",
      30,
      "lambda_handler",
      "resource = list(event['detail']['requestParameters']['evaluations'])[0]"
    ]
  ]
}

Request ID:
"6ee059f2-556c-4483-a45f-f90238ed727e"

Function Logs:
START RequestId: 6ee059f2-556c-4483-a45f-f90238ed727e Version: $LATEST
'detail': KeyError
Traceback (most recent call last):
  File "/var/task/lambda_function.py", line 30, in lambda_handler
    resource = list(event['detail']['requestParameters']['evaluations'])[0]
KeyError: 'detail'

END RequestId: 6ee059f2-556c-4483-a45f-f90238ed727e
REPORT RequestId: 6ee059f2-556c-4483-a45f-f90238ed727e  Duration: 1491.42 ms    Billed Duration: 1500 ms    Memory Size: 128 MB Max Memory Used: 74 MB  Init Duration: 165.73 ms

Код:

   import boto3
    from botocore.exceptions import ClientError
    import json
    import os
    ACL_RD_WARNING = "The S3 bucket ACL allows public read access."
    PLCY_RD_WARNING = "The S3 bucket policy allows public read access."
    ACL_WRT_WARNING = "The S3 bucket ACL allows public write access."
    PLCY_WRT_WARNING = "The S3 bucket policy allows public write access."
    RD_COMBO_WARNING = ACL_RD_WARNING + PLCY_RD_WARNING
    WRT_COMBO_WARNING = ACL_WRT_WARNING + PLCY_WRT_WARNING
    def policyNotifier(bucketName, s3client):
        try:
            bucketPolicy = s3client.get_bucket_policy(Bucket = bucketName)
            # notify that the bucket policy may need to be reviewed due to security concerns
            sns = boto3.client('sns')
            subject = "Potential compliance violation in " + bucketName + " bucket policy"
            "Potential bucket policy compliance violation. Please review: " + json.dumps(bucketPolicy['Policy']),
            # send SNS message with warning and bucket policy
            response = sns.publish(
                TopicArn = os.environ['TOPIC_ARN'],
                Subject = subject,
                Message = message
            )
        except ClientError as e:
            # error caught due to no bucket policy
            print("No bucket policy found; no alert sent.")
    def lambda_handler(event, context):
        # instantiate Amazon S3 client
        s3 = boto3.client('s3')
        resource = list(event['detail']['requestParameters']['evaluations'])[0]
        bucketName = resource['complianceResourceId']
        complianceFailure = event['detail']['requestParameters']['evaluations'][0]['annotation']
        if(complianceFailure == ACL_RD_WARNING or complianceFailure == ACL_WRT_WARNING):
            s3.put_bucket_acl(Bucket = bucketName, ACL = 'private')
        elif(complianceFailure == PLCY_RD_WARNING or complianceFailure == PLCY_WRT_WARNING):
            policyNotifier(bucketName, s3)
        elif(complianceFailure == RD_COMBO_WARNING or complianceFailure == WRT_COMBO_WARNING):
            s3.put_bucket_acl(Bucket = bucketName, ACL = 'private')
            policyNotifier(bucketName, s3)
        return 0  # done

Скопированный код из https://aws.amazon.com/blogs/security/how-to-use-aws-config-to-monitor-for-and-respond-to-amazon-s3-buckets-allowing-public-access/

Когда я проверяю лямбда-функцию. Ошибка выше.

Новое в python. Пожалуйста, помогите мне решить проблему.

1 Ответ

1 голос
/ 17 марта 2020

В вашем коде вы предполагаете, что следующий путь всегда существует в event: event['detail']['requestParameters']['evaluations']. Ошибка говорит вам, что event на самом деле не содержит detail ключ.

Что вы должны сделать, это:

  1. Убедитесь, что ваше тестовое событие соответствует событиям реальной жизни, которые вы ожидаете для запуска вашей лямбды с помощью
  2. Если это произойдет, сначала напечатайте event, чтобы увидеть ее структуру:
import json
...
print(json.dumps(event, indent=2))

Вполне возможно, что формат события изменился с 2018 года, когда эта статья было написано.

В любом случае хорошей идеей будет заключить этот оператор в блок try ... except, чтобы перехватить KeyError и корректно завершить работу
...