17

cfnスクリプトのタグを使用してリソースにタグを付けています。

"Tags" : [ { "Key" : "Owner",       "Value" : "my name" },
           { "Key" : "Name",        "Value" : "instance name" } 
           { "Key" : "DateCreated", "Value" : <something goes here> } 
         ],

上記の例のように、現在の日付でタグを作成したいと思います。出来ますか?

4

2 に答える 2

14

「カスタムリソース」を使用して、タイムスタンプ(またはその他の値)を生成できます。

カスタムリソースはCloudFormationの新機能(2014年頃に導入)であり、基本的にラムダ関数を呼び出して、CloudFormationが言語サポートを提供していないリソース(外部のリソースでもかまいません)を「作成」、「更新」、または「削除」できます。 AWS)。

スタックの他の部分で使用するためにいくつかの値を計算するためだけにカスタムリソースを頻繁に使用します。たとえば、!Join頻繁に使用する必要があり、一度計算したい計算値を保持する「変数」を作成するために使用します。 。

カスタムリソースを使用して、タイムスタンプを生成するだけで簡単にできます。これは、私が実際に本番環境で使用しているものに非常に近いサンプルコードです。

「リソース」実装を作成する

Resources:
  ValueFunc:
    Type: AWS::Lambda::Function
    Properties:
      Code:
        ZipFile: >
          var r = require('cfn-response');
          exports.handler = function(ev, ctx) {
            ev.ResourceProperties.Time = new Date().toISOString();
            r.send(ev, ctx, r.SUCCESS, ev.ResourceProperties);
          }; 
      Handler: index.handler
      Runtime: nodejs6.10
      Timeout: 30
      Role: !GetAtt ValueFunctionExecutionRole.Arn

  ValueFunctionExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal: { Service: [ lambda.amazonaws.com ] }
            Action: sts:AssumeRole
      Policies:
        - PolicyName: 
            Fn::Sub: "value-custom-res-${AWS::StackName}-${AWS::Region}"
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - logs:CreateLogGroup
                  - logs:CreateLogStream
                  - logs:PutLogEvents
                Resource: "arn:aws:logs:*:*:*"
              - Effect: Allow
                Action: cloudformation:DescribeStacks
                Resource: "arn:aws:cloudformation:*:*:*"

次に、タイムスタンプを生成する場所で、次のようにします(ここから取得したスケジュールされたアクションの例)。

作成時間を計算するカスタムリソースを作成します

GetTimeThisTime:
  Type: Custom::Value
  Properties:
    ServiceToken: !GetAtt ValueFunc.Arn

Time属性を使用して作成されたタイムスタンプを読み取ります

ScheduledActionUp: 
  Type: AWS::AutoScaling::ScheduledAction
  Properties:
    AutoScalingGroupName: !Ref WebServerGroup
    DesiredCapacity: 2
    StartTime: !GetAtt GetTimeThisTime.Time
    Recurrence: "0 7 * * *"

スタック作成のさまざまな時点で複数のタイムスタンプを生成するには、作成のタイミングを設定する論理エンティティに依存する新しい「カスタム値」を作成するだけです。

于 2018-03-28T14:37:46.620 に答える
12

@Guyによるアドバイスは正しいです。スタックのプロパティから、スタックの作成タイムスタンプにアクセスできます。

それでもパラメータとしてタグを指定する必要がある場合は、次の方法で指定できます。現在、JSON構文は非常に限られた関数のセットをサポートしています。このため、テンプレートを動的に変更する可能性は非常に小さいです。これを必要なタグに導入する唯一の方法は、テンプレート自体に別のパラメーターを追加することです。スタックを初期化する方法に応じて、動的に指定されるパラメーターをスクリプト化するか、Webコンソールで提供することができます。

たとえば、テンプレートにこれがある場合:

  "Parameters" : {
    "CreationDate" : {
      "Description" : "Date",
      "Type" : "String",
      "Default" : "2013-03-20 21:15:00",
      "AllowedPattern" : "^\\d{4}(-\\d{2}){2} (\\d{2}:){2}\\d{2}$",
      "ConstraintDescription" : "Date and time of creation"
    }
  },

後で、次のようなタグでRefキーワードを使用して参照できます。

 "Tags" : [ { "Key" : "Owner",       "Value" : "my name" },
            { "Key" : "Name",        "Value" : "instance name" },
            { "Key" : "DateCreated", "Value" : { "Ref" : "CreationDate" } } 
          ],

AWSコンソールからスタックを作成する場合、現在の時刻を自動的に割り当てるのは簡単ではありませんが、CLIツールを使用する場合は、次のようにcfn-create-stackを呼び出すことができます。

  cfn-create-stack MyStack --template-file My.template --parameters "CreationDate=$(date +'%F %T')"

お役に立てれば!

于 2013-03-26T23:57:30.217 に答える