0

私は、RDSバックアップ用のラムダ関数を作成するCloudFormationスクリプトを持っています。 CloudFormationテンプレートからラムダ関数にサーバーのリストを渡すにはどうすればよいですか?今はハードコーディングされており、理想的ではないと思います。CloudFormation:ラムダ関数へのリストの受け渡し

CloudFormationスクリプト

{ "AWSTemplateFormatVersion": "2010-09-09", 
    "Parameters": { 
    "ruleName": { 
     "Description": "Name for CloudWatch Rule.", 
     "Type": "String" 
    }, 
    "cronSchedule": { 
     "Description": "Cron Schedule Expression", 
     "Type": "String", 
     "Default": "cron(0 05 * * ? *)" 
    }, 
    "bucketName" : { 
     "Description": "S3 Bucket storing the lambda script", 
     "Type": "String" 
    }, 
    "lambdaTimeout": { 
     "Description": "Timeout for Lambda", 
     "Type": "String", 
     "Default": "3" 
    }, 
    "instanceList":{ 
     "Description": "", 
     "Type": "String" 
    } 
    }, 
    "Resources": { 
    "cloudWatchRule": { 
     "Type": "AWS::Events::Rule", 
     "DependsOn": "lambdaFunction", 
     "Properties": { 
     "Description": "Cron Schedule", 
     "Name": { 
      "Ref": "ruleName" 
     }, 
     "ScheduleExpression": { 
      "Ref": "cronSchedule" 
     }, 
     "State": "ENABLED", 
     "Targets": [ 
      { 
      "Arn":{ 
       "Fn::GetAtt": ["lambdaFunction","Arn"] 
      }, 
      "Id": { 
       "Ref": "lambdaFunction" 
      } 
      } 
     ] 
     } 
    }, 
    "lambdaFunction": { 
     "Type":"AWS::Lambda::Function", 
     "DependsOn": [ 
     "lambdaRdsBackupRole", 
     "rdsBackupExecutionPolicy" 
     ], 
     "Properties":{ 
     "Code": { 
      "S3Bucket": { 
      "Ref": "bucketName" 
      }, 
      "S3Key": "lambdaFunctions/rdsBackup.zip" 
     }, 
     "Role": { 
      "Fn::GetAtt": ["lambdaRdsBackupRole", "Arn"] 
     }, 
     "Handler": "rdsBackup.lambda_handler", 
     "Environment":{ 
      "Variables": { 
      "dbInstances": { 
       "Ref": "instanceList" 
      } 
      } 
     }, 
     "Runtime": "python3.6", 
     "MemorySize": 128, 
     "Timeout": { 
      "Ref": "lambdaTimeout" 
     } 
     } 
    }, 
    "lambdaRdsBackupRole": { 
     "Type": "AWS::IAM::Role", 
     "Properties": { 
     "AssumeRolePolicyDocument": { 
      "Version": "2012-10-17", 
      "Statement": [ 
      { 
       "Effect": "Allow", 
       "Principal": { 
       "Service": [ 
        "lambda.amazonaws.com" 
       ] 
       }, 
       "Action": [ 
       "sts:AssumeRole" 
       ] 
      } 
      ] 
     }, 
     "Path": "/" 
     } 
    }, 
    "rdsBackupExecutionPolicy": { 
     "DependsOn": [ 
     "lambdaRdsBackupRole" 
     ], 
     "Type": "AWS::IAM::Policy", 
     "Properties": { 
     "PolicyName": "lambdaRdsBackupRolePolicy", 
     "Roles": [ 
      { 
      "Ref": "lambdaRdsBackupRole" 
      } 
     ], 
     "PolicyDocument": { 
      "Version": "2012-10-17", 
      "Statement": [ 
      { 
       "Effect": "Allow", 
       "Action": [ 
       "logs:CreateLogGroup", 
       "logs:CreateLogStream", 
       "logs:PutLogEvents" 
       ], 
       "Resource": "arn:aws:logs:*:*:*" 
      }, 
      { 
       "Effect": "Allow", 
       "Action": [ 
       "rds:AddTagsToResource", 
       "rds:DeleteDBSnapshot" 
       ], 
       "Resource": "arn:aws:rds:*:*" 
      }, 
      { 
       "Effect": "Allow", 
       "Action": [ 
       "rds:ListTagsForResource", 
       "rds:CreateDBSnapshot" 
       ], 
       "Resource": "arn:aws:rds:*:*" 
      }, 
      { 
       "Effect": "Allow", 
       "Action": [ 
       "rds:DescribeDBSnapshots" 
       ], 
       "Resource": "*" 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

私は、このセクションを追加しましたが、私はそれが正しいかどうかなりわからないんだけど、それがあれば、私はまだどこここから行くと非常によくわからないんだけど。

"Environment":{ 
      "Variables": { 
      "dbInstances": { 
       "Ref": "instanceList" 
      } 
      } 
     }, 

ラムダ関数

import boto3 
import datetime 


def lambda_handler(event, context): 
    print("Connecting to RDS") 
    client = boto3.client('rds') 

    # Instance to backup 
    dbInstances = ['testdb', 'testdb2'] 

    for dbInstance in dbInstances: 
     print("RDS snapshot backups started at %s...\n" % datetime.datetime.now()) 

     for snapshot in client.describe_db_snapshots(DBInstanceIdentifier=dbInstance, MaxRecords=50)['DBSnapshots']: 
      try: 
       createTs = snapshot['SnapshotCreateTime'].replace(tzinfo=None) 
       if createTs < datetime.datetime.now() - datetime.timedelta(days=30): 
        print("Deleting snapshot id:", snapshot['DBSnapshotIdentifier']) 
        client.delete_db_snapshot(
         DBSnapshotIdentifier=snapshot['DBSnapshotIdentifier'] 
        ) 
      except Exception as e: 
       print("Error: "+ str(e)) 
       pass 

     client.create_db_snapshot(
      DBInstanceIdentifier=dbInstance, 
      DBSnapshotIdentifier=dbInstance+'{}'.format(datetime.datetime.now().strftime("%y-%m-%d-%H")), 
      Tags=[ 
       { 
        'Key': 'Name', 
        'Value': 'dbInstance' 

       }, 
      ] 
     ) 

答えて

2

おそらくこれを行うにはいくつかの方法があります。気になるものがいくつか以下に挙げられています。

1)変数をクラウドフォーメーションテンプレートに追加するように設定されている場合は、pythonスクリプトをクラウドフォーメーションテンプレートにインラインで追加して、変数をテンプレートとして渡すことができます。 http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-code.html

2)ラムダ関数の環境変数を作成し、実行するたびに(コンソールまたはコマンドラインのいずれかで)環境変数を新しいデータベースインスタンスで更新できます。 http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html#cfn-lambda-function-environment

3)API Gatewayのようなものを使用して、ラムダ関数に結びつけることができます。 POST要求の配列をラムダ関数に渡すことができます。 http://docs.aws.amazon.com/apigateway/latest/developerguide/getting-started.html

最終目標を知らなくても、これらのいずれかを他のものよりも推奨することは困難です。

関連する問題