【新機能】AWS CloudFormationにNAT Gateway, Container Registry, EMR, Elasticsearch Service等が追加!

AWS CloudFormation

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、せーのです。今日はCloudFormationのアップデートをご紹介致します。新サービス、新機能等色々ありますのでおさらいしていきましょう。

新サービス

NAT Gateway

NAT GatewayはAWSフルマネージドのNATサービスです。サブネットごとにNATインスタンスが立てられます。

{
  "Type" : "AWS::EC2::NatGateway",
  "Properties" : {
    "AllocationId" : String,
    "SubnetId" : String
  }
}

パラメータは[AllocationId]と[SubnetId]です。[AllocationId]にはNATにつけるEIPのアロケーションを、[SubnetId]はNATを立てたいサブネットのIDを入れます。それぞれを同時にテンプレートで立てるとするとこうなります。

"NAT" : {
  "DependsOn" : "VPCGatewayAttach",
  "Type" : "AWS::EC2::NatGateway",
  "Properties" : {
    "AllocationId" : { "Fn::GetAtt" : ["EIP", "AllocationId"]},
    "SubnetId" : { "Ref" : "Subnet"}
  }
},
"EIP" : {
  "Type" : "AWS::EC2::EIP",
  "Properties" : {
    "Domain" : "vpc"
  }
},
"Route" : {
  "Type" : "AWS::EC2::Route",
  "Properties" : {
    "RouteTableId" : { "Ref" : "RouteTable" },
    "DestinationCidrBlock" : "0.0.0.0/0",
    "NatGatewayId" : { "Ref" : "NAT" }
  }
}

Amazon ECR

Amazon ECRはAWSのDockerコンテナサービスです。Dockerのコンテナイメージをアップロードすればサーバーの構築はAWSがいい感じにしてくれる、という夢のあるサービスですね。

{
  "Type" : "AWS::ECR::Repository",
  "Properties" : {
    "RepositoryName" : String,
    "RepositoryPolicyText" : JSON object
  }
}

テンプレートでは名前の他にPolicyをJSONの形で書くことになります。名前は一度Stackすると変更出来ませんので注意してください。Policyにはこのレポジトリを「誰が」「どの程度」操作できるのか、という権限を書きます。サンプルがここにまとまっていますので最初はこちらを参考にすると良いでしょう。

"MyRepository": {
  "Type": "AWS::ECR::Repository",
  "Properties": {
    "RepositoryName" : "test-repository",
    "RepositoryPolicyText" : {
      "Version": "2008-10-17",
      "Statement": [
        {
          "Sid": "AllowPushPull",
          "Effect": "Allow",
          "Principal": {
            "AWS": [
              "arn:aws:iam::123456789012:user/Bob",
              "arn:aws:iam::123456789012:user/Alice"
            ]
          },
          "Action": [
            "ecr:GetDownloadUrlForLayer",
            "ecr:BatchGetImage",
            "ecr:BatchCheckLayerAvailability",
            "ecr:PutImage",
            "ecr:InitiateLayerUpload",
            "ecr:UploadLayerPart",
            "ecr:CompleteLayerUpload"
          ]
        }
      ]
    }
  }
}

Amazon EMR

Amazon EMRはHadoop、Apache Spark等の分散構成が簡単に構築できるサービスです。

{
  "Type" : "AWS::EMR::Cluster",
  "Properties" : {
    "AdditionalInfo" : JSON object,
    "Applications" : [ Applications, ... ],
    "BootstrapActions" [ Bootstrap Actions, ... ],
    "Configurations" : [ Configurations, ... ],
    "Instances" : JobFlowInstancesConfig,
    "JobFlowRole" : String,
    "LogUri" : String,
    "Name" : String,
    "ReleaseLabel" : String,
    "ServiceRole" : String,
    "Tags" : [ Resource Tag, ... ],
    "VisibleToAllUsers" : Boolean
  }
}

テンプレート上でもクラスタ構成時にマネージメントコンソール上で指定できるプロパティがほぼそのまま指定できます。下はマスターノードが1つ、コアノードが2つ、IAM RoleはDefaultを使ったサンプルです。

"TestCluster": {
  "Type": "AWS::EMR::Cluster",
  "Properties": {
    "Instances": {
      "MasterInstanceGroup": {
        "InstanceCount": 1,
        "InstanceType": "m3.xlarge",
        "Market": "ON_DEMAND",
        "Name": "Master"
      },
      "CoreInstanceGroup": {
        "InstanceCount": 2,
        "InstanceType": "m3.xlarge",
        "Market": "ON_DEMAND",
        "Name": "Core"
      },
      "TerminationProtected" : true
    },
    "Name": "TestCluster",
    "JobFlowRole" : "EMR_EC2_DefaultRole",
    "ServiceRole" : "EMR_DefaultRole",
    "ReleaseLabel" : "emr-4.2.0",
    "Tags": [
      {
        "Key": "IsTest",
        "Value": "True"
      }
    ]
  }
}

Amazon Elasticsearch Service

Amazon ESはElasticsearchやKibanaを使ったデータのプロット、グラフ表現が簡単に行えるサービスです。

{
  "Type" : "AWS::Elasticsearch::Domain",
  "Properties" : {
    "AccessPolicies" : JSON object,
    "AdvancedOptions" : Advanced Options,
    "DomainName" : String,
    "EBSOptions" : EBS Options,
    "ElasticsearchClusterConfig" : Elasticsearch Cluster Config,
    "SnapshotOptions" : Snaptshot Options,
    "Tags" : [ Resource Tag, ... ]
  }
}

EMR同様ここで使用するインスタンスのサイズやEBSの種類、アクセスポリシー等を入力します。

"ElasticsearchDomain": {
  "Type": "AWS::Elasticsearch::Domain",
  "Properties": {
    "ElasticsearchClusterConfig": {
      "DedicatedMasterEnabled": "true",
      "InstanceCount": "2",
      "ZoneAwarenessEnabled": "true",
      "InstanceType": "m3.medium.elasticsearch",
      "DedicatedMasterType": "m3.medium.elasticsearch",
      "DedicatedMasterCount": "3"
    },
    "EBSOptions": {
      "EBSEnabled": true,
      "Iops": 0,
      "VolumeSize": 20,
      "VolumeType": "gp2"
    },
    "SnapshotOptions": {
      "AutomatedSnapshotStartHour": "0"
    },
    "AccessPolicies": {
      "Version": "2012-10-17",
      "Statement": [{
        "Effect": "Allow",
        "Principal": {
          "AWS": "*"
        },
        "Action": "es:*",
        "Resource": "*"
      }]
    },
    "AdvancedOptions": {
      "rest.action.multi.allow_explicit_index": "true"
    },
    "Tags": [{
      "Key": "type",
      "Value": "test"
    }]
  }
}

新機能

CloudTrail マルチリージョンON

CloudTrailはAWS上でいつ、誰が、どんなAPIを叩いたかを証跡として記録するサービスです。以前はひとつずつリージョンを選択肢てCloudTrailをONにしていましたが、今年のはじめに全リージョンを一括でONすることが出来るようになりました。

{
  "Type" : "AWS::CloudTrail::Trail",
  "Properties" : {
    "CloudWatchLogsLogGroupArn" : String,
    "CloudWatchLogsRoleArn" : String,
    "EnableLogFileValidation" : Boolean,
    "IncludeGlobalServiceEvents" : Boolean,
    "IsLogging" : Boolean,
    "IsMultiRegionTrail" : Boolean,
    "KMSKeyId" : String,
    "S3BucketName" : String,
    "S3KeyPrefix" : String,
    "SnsTopicName" : String,
    "Tags" : [ Resource Tag, ... ]
  }
}

この[IsMultiRegionTrail]を"true"に設定すればOKです。

AWS Config グローバルリソースタイプ設定

AWS ConfigはAWSにて構築した構成の情報を管理し、変更があった時に通知したり、履歴を保持、検索したり、リソース同士の関係性を確認したりできる構成管理サービスです。

{
  "AllSupported" : Boolean,
  "IncludeGlobalResourceTypes" : Boolean,
  "ResourceTypes" : [ String, ... ]  
}

[AllSupported]を"true"にするとAWS Configがサポートしている全てのリソースタイプを記録する、という指定ができました。新たに加わった[IncludeGlobalResourceTypes]によってグローバルリソースタイプ、つまりIAM User, IAM Group, IAM Roleやカスタムポリシーも一気に指定することが出来るようになりました。ちなみに[IncludeGlobalResourceTypes]が"true"の場合、[AllSupported]も"true"にする必要があります。

RDS暗号化

RDSは、、、もうわかりますね。

{
  "Type" : "AWS::RDS::DBCluster",
  "Properties" :
  {
    "AvailabilityZones" : [ String, ... ],
    "BackupRetentionPeriod" : Integer,
    "DatabaseName" : String,
    "DBClusterParameterGroupName" : String,
    "DBSubnetGroupName" : String,
    "Engine" : String,
    "EngineVersion" : String,
    "KmsKeyId" : String,
    "MasterUsername" : String,
    "MasterUserPassword" : String,
    "Port" : Integer,
    "PreferredBackupWindow" : String,
    "PreferredMaintenanceWindow" : String,
    "SnapshotIdentifier" : String,
    "StorageEncrypted" : Boolean,
    "Tags" : [ Resource Tag, ... ],
    "VpcSecurityGroupIds" : [ String, ... ]
  }
}

今回新たに加わったのは[StorageEncrypted]です。ここにKMSのキーID[arn:aws:kms:us-east-1:012345678910:key/abcd1234-a123-456a-a12b-a123b4cd56ef、みたいな]をいれる事によって暗号化されます。

Update Stack時にタグを編集

Update Stackをかける時にCloudFormationのタグを追加、削除、変更することが出来るようになりました。

Delete Stack時にリソースを保持

Delete Stackをした時に残っていてはいけないリソースがあったためにDelete Stackが失敗することがあります。例えばテンプレートにてセキュリティグループを書いていた場合、そのセキュリティグループを使ったEC2インスタンスが残っていたらDelete Stackは失敗します。その際にこの[RetainResources]のパラメータを指定してあげると、そのリソースを残したまま残りをDelete Stackすることが出来るようになりました。

まとめ

いかがでしたか。アップデートになった新サービス、新機能をざっと見ていきました。CloudFormationの使い所が増えましたね!

参考リンク