2017-07-17 36 views
1

次のCloudFormationテンプレートがあります。 (AWS LambdaでC#Web APIを実行するために作成されたテンプレートにデフォルトで基づいていますが、関連性がない可能性があります)。CloudFormation:リソースが存在しない場合は作成しますが、削除しない場合は

AWSラムダ関数を作成します。既存のリソースの名前が引数として指定されていない場合は、IAMロールとDynamoDBテーブルも作成されます。

その部分は機能します。役割と表に名前が指定されていない場合は、それらが作成されます。

この時点でのテンプレートを実行して、私の役割とテーブルが存在するため、名前を引数として指定すると、問題が発生します。ただし、CloudFormationを2回実行すると、初めて作成したリソース(ロールとテーブル)が削除されます。

テンプレートが存在しない場合は新しいリソースを作成し、存在する場合は削除しないようにテンプレートを設定する方法はありますか?

私はCloudFormationで多くのことをしていませんでしたが、私はドキュメントを読んでいました。私が見つけた最も近いものはsetting a stack policyでしたが、テンプレートの一部ではないようです。事実の後、私は管理コンソールでこれを行う必要があるように見えます。

{ 
    "AWSTemplateFormatVersion" : "2010-09-09", 
    "Transform" : "AWS::Serverless-2016-10-31", 
    "Description" : "...", 

    "Parameters" : { 
    "ShouldCreateTable" : { 
     "Type" : "String",   
     "AllowedValues" : ["true", "false"], 
     "Description" : "If true then the underlying DynamoDB table will be created with the CloudFormation stack." 
    }, 
    "TableName" : { 
     "Type" : "String", 
     "Description" : "Name of DynamoDB table to be used for underlying data store. If left blank a new table will be created.", 
     "MinLength" : "0" 
    }, 
    "ShouldCreateRole" : { 
     "Type" : "String",   
     "AllowedValues" : ["true", "false"], 
     "Description" : "If true then the role for the Lambda function will be created with the CloudFormation stack." 
    }, 
    "RoleARN" : { 
     "Type" : "String", 
     "Description" : "ARN of the IAM Role used to run the Lambda function. If left blank a new role will be created.", 
     "MinLength" : "0" 
    } 
    }, 

    "Conditions" : { 
    "CreateDynamoTable" : {"Fn::Equals" : [{"Ref" : "ShouldCreateTable"}, "true"]}, 
    "TableNameGenerated" : {"Fn::Equals" : [{"Ref" : "TableName"}, ""]}, 
    "CreateRole":{"Fn::Equals" : [{"Ref" : "ShouldCreateRole"}, "true"]}, 
    "RoleGenerated" : {"Fn::Equals" : [{"Ref" : "RoleARN"}, ""]} 
    }, 

    "Resources" : { 

    "Get" : { 
     "Type" : "AWS::Serverless::Function", 
     "Properties": { 
     ... 
     "Role": {"Fn::If" : ["CreateRole", {"Fn::GetAtt":["LambdaRole", "Arn"]}, {"Ref":"RoleARN"}]}, 
     "Environment" : { 
      "Variables" : { 
      "AppDynamoTable" : { "Fn::If" : ["CreateDynamoTable", {"Ref":"DynamoTable"}, { "Ref" : "TableName" } ] } 
      } 
     }, 
     ... 
     } 
    }, 

    "LambdaRole":{ 
     "Type":"AWS::IAM::Role", 
     "Condition":"CreateRole", 
     "Properties":{ 
      "ManagedPolicyArns":["arn:aws:iam::aws:policy/AWSLambdaFullAccess"], 
      "AssumeRolePolicyDocument": { 
       "Version" : "2012-10-17", 
       "Statement": [ { 
        "Effect": "Allow", 
        "Principal": { 
        "Service": [ "lambda.amazonaws.com" ] 
        }, 
        "Action": [ "sts:AssumeRole" ] 
       } ] 
      }, 
      "Policies": [ { 
       "PolicyName": "root", 
       "PolicyDocument": { 
         "Version": "2012-10-17", 
         "Statement": [ 
          { 
           "Effect": "Allow", 
           "Action": [ 
            "dynamodb:Query", 
            "dynamodb:Scan", 
            "dynamodb:PutItem", 
            "dynamodb:GetItem", 
            "dynamodb:UpdateItem", 
            "dynamodb:DeleteItem", 
            "logs:CreateLogGroup", 
            "logs:CreateLogStream", 
            "logs:PutLogEvents" 
           ], 
           "Resource": [ 
            "*" 
           ] 
          } 
         ] 
        } 
       } 
      ] 
     } 
    }, 

    "DynamoTable" : { 
     "Type" : "AWS::DynamoDB::Table", 
     "Condition" : "CreateDynamoTable", 
     "Properties" : { 
      "TableName" : { "Fn::If" : ["TableNameGenerated", {"Ref" : "AWS::NoValue" }, { "Ref" : "TableName" } ] }, 
      "AttributeDefinitions": [ 
       { "AttributeName" : "id", "AttributeType" : "S" } 
      ], 
      "KeySchema" : [ 
       { "AttributeName" : "id", "KeyType" : "HASH"} 
      ],   
      "ProvisionedThroughput" : { "ReadCapacityUnits" : "5", "WriteCapacityUnits" : "5" } 
     } 
    } 
    }, 

    "Outputs" : { 
    "UnderlyingDynamoTable" : { 
     "Value" : { "Fn::If" : ["CreateDynamoTable", {"Ref":"DynamoTable"}, { "Ref" : "TableName" } ] } 
    }, 
    "LambdaRole" : { 
     "Value" : {"Fn::If" : ["CreateRole", {"Fn::GetAtt":["LambdaRole", "Arn"]}, {"Ref":"RoleARN"} ] } 
    } 
    } 
} 

私はちょうど作成ステップを削除して、API Gatewayの前に手動でリソースを作成し、それは私が可能なはずやろうとしていますどのように思えることができます。

答えて

2

既存のスタックを更新するときは、パラメータを変更しないでください。スタックを更新している場合でも、ShouldCreateTabletrueに設定してください。

はい、テーブルがすでに存在していてもそれを実行する必要がある場合は、スタックを更新して「テーブルを作成」​​すると直感的です。

  1. スタックが作成されると、あなたはtrueShouldCreateTableを設定し、テンプレートが、それは条件付きのロジックだ適用され、それは管理対象リソースを所有していて、テーブルを作成します。

    理由はこれです。

  2. ShouldCreateTablefalseに設定すると、テンプレートで条件付きロジックが適用され、管理対象テーブルが不要になったと判断されます。リソースは削除する必要があります。テーブルが同じであることを認識しません。あなたのテンプレートを使用する場合は、あなたがを作成し、独自のテーブルを提供している場合

、唯一ShouldCreateTable == falseを言います。

関連する問題