Ошибка форматирования YAML в облачной информации. Как исправить эту ошибку? - PullRequest
0 голосов
/ 14 июля 2020

Я пишу шаблон на основе YAML для облачной информации, но мне нужно исправить эту ошибку, которая не позволяет шаблону работать на aws. Когда вставлен валидатор yaml, он работает, но aws в настоящее время не принимает это:

Properties:
  Code:
    Zipfile:|
import json
import boto3

s3 = boto3.client('s3')

def lambda_handler(event, context):
    # Get bucket name from the S3 event
    print(event)

    bucket_name = event['detail']['requestParameters']['bucketName']

    # Create a bucket policy
    bucket_policy =json.dumps({
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "MustBeEncryptedAtRest",
                "Effect": "Deny",
                "Principal": "*",
                "Action": "s3:PutObject",
                "Resource": [
                    "arn:aws:s3:::{}".format(bucket_name),
                    "arn:aws:s3:::{}/*".format(bucket_name)
                ],
                "Condition": {
                    "StringNotEquals": {
                        "s3:x-amz-server-side-encryption": [
                          -----
                            "aws:kms"
                        ]
                    }
                }
            },
            {
                "Sid": "MustBeEncryptedInTransit",
                "Effect": "Deny",
                "Principal": "*",
                "Action": "s3:*",
                "Resource": [
                    "arn:aws:s3:::{}".format(bucket_name),
                    "arn:aws:s3:::{}/*".format(bucket_name)
                ],
                "Condition": {
                    "Bool": {
                        "aws:SecureTransport": "false"
                        }
                }
            } ] })


    # Set the new policy
    s3.put_bucket_policy(Bucket=bucket_name, Policy=bucket_policy),

  Handler: lambda_handler,
  Role: -----
  Runtime: python3.7

Type: AWS::Events::Rule
Properties:
  EventPattern:  {
                    "source": [
                        "aws.s3"
                    ],
                    "detail-type": [
                        "AWS API Call via CloudTrail"
                    ],
                    "detail": {
                        "eventSource": [
                            "s3.amazonaws.com"
                        ],
                        "eventName": [
                            "CreateBucket"
                        ]
                    }
                }


Что мне делать, чтобы это исправить? Я попытался поместить его в валидатор yaml, но сообщение об ошибке указывает на строку 1, столбец 1, и я полностью выполнил документацию aws, но что-то похоже не так. Все ли должно быть в строке, как в формате JSON?

1 Ответ

1 голос
/ 14 июля 2020

Похоже, у вас есть 2 ресурса в этом шаблоне без указания отдельных ресурсов. Я отформатировал для вас ниже.

С YAML было несколько проблем, первая - это выравнивание структуры, тогда как в JSON {} и [] вложенные уровни определяются вместе с отступом YAML. with : используется для обеспечения структуры.

Если вы сохраните Lambda с отступом от параметра ZipFile, это будет успешно разрешено при форматировании. Кроме того, EventPattern в вашем CloudWatch Event не может использовать JSON, вместо этого он должен преобразовать формат в YAML для этого шаблона.

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  LambdaFunction:
    Type: 'AWS::Lambda::Function'
    Properties:
      Code:
        ZipFile: |
          import json
          import boto3

          s3 = boto3.client('s3')

          def lambda_handler(event, context):
            # Get bucket name from the S3 event
            print(event)

            bucket_name = event['detail']['requestParameters']['bucketName']

            # Create a bucket policy
            bucket_policy =json.dumps({
              "Version": "2012-10-17",
              "Statement": [
                {
                  "Sid": "MustBeEncryptedAtRest",
                  "Effect": "Deny",
                  "Principal": "*",
                  "Action": "s3:PutObject",
                  "Resource": [
                    "arn:aws:s3:::{}".format(bucket_name),
                    "arn:aws:s3:::{}/*".format(bucket_name)
                  ],
                  "Condition": {
                    "StringNotEquals": {
                      "s3:x-amz-server-side-encryption": [
                        -----
                        "aws:kms"
                      ]
                    }
                  }
                },
                {
                  "Sid": "MustBeEncryptedInTransit",
                  "Effect": "Deny",
                  "Principal": "*",
                  "Action": "s3:*",
                  "Resource": [
                    "arn:aws:s3:::{}".format(bucket_name),
                    "arn:aws:s3:::{}/*".format(bucket_name)
                  ],
                  "Condition": {
                    "Bool": {
                      "aws:SecureTransport": "false"
                      }
                  }
                } ] })


            # Set the new policy
            s3.put_bucket_policy(Bucket=bucket_name, Policy=bucket_policy),
      Handler: lambda_handler
      Role: '-----'
      Runtime: python3.7
  EventRule:
    Type: 'AWS::Events::Rule'
    Properties:
      EventPattern:
        source:
          - aws.s3
        detail-type:
          - AWS API Call via CloudTrail
        detail:
          eventSource:
            - s3.amazonaws.com
          eventName:
            - CreateBucket

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...