Set an environment variables in the custom json in opsworks

671 views Asked by At

I am working on a AWS cloudformation template that creates an opsworks stack. In my stack, I will have one instance (Ubuntu 14.04) , all the applications and packages that will be installed in the instance are configured in the chef cookbook provided from an S3 bucket. I need to set an environment variable in my instance and its value is to be set by a parameter of the cloudformation template, this is the template:

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "AWS CloudFormation Template : Stack OpsWorks Slave pour deployer les instances script",


  "Mappings": {

    "Region2Principal": {

      "us-east-1": {
        "EC2Principal": "ec2.amazonaws.com",
        "OpsWorksPrincipal": "opsworks.amazonaws.com"
      },

      "us-west-2": {
        "EC2Principal": "ec2.amazonaws.com",
        "OpsWorksPrincipal": "opsworks.amazonaws.com"
      },

      "us-west-1": {
        "EC2Principal": "ec2.amazonaws.com",
        "OpsWorksPrincipal": "opsworks.amazonaws.com"
      },

      "eu-west-1": {
        "EC2Principal": "ec2.amazonaws.com",
        "OpsWorksPrincipal": "opsworks.amazonaws.com"
      }
    },

    "AWSInstanceType2Arch" : {

           "t1.micro"    : { "Arch" : "PV64"   },
           "t2.micro"    : { "Arch" : "HVM64"  },
           "m1.small"    : { "Arch" : "PV64"   },
           "m1.large"    : { "Arch" : "PV64"   },
           "m4.large"    : { "Arch" : "HVM64"  },
           "m4.xlarge"   : { "Arch" : "HVM64"  },
           "m4.2xlarge"  : { "Arch" : "HVM64"  },
           "m4.4xlarge"  : { "Arch" : "HVM64"  },
           "m4.10xlarge" : { "Arch" : "HVM64"  },
           "m4.16xlarge" : { "Arch" : "HVM64"  },
           "c3.large"    : { "Arch" : "HVM64"  },
           "c3.xlarge"   : { "Arch" : "HVM64"  },
           "c3.2xlarge"  : { "Arch" : "HVM64"  },
           "c3.4xlarge"  : { "Arch" : "HVM64"  },
           "c3.8xlarge"  : { "Arch" : "HVM64"  },
           "c4.large"    : { "Arch" : "HVM64"    },
           "c4.xlarge"   : { "Arch" : "HVM64"  },
           "c4.2xlarge"  : { "Arch" : "HVM64"  },
           "c4.4xlarge"  : { "Arch" : "HVM64"  },
           "c4.8xlarge"  : { "Arch" : "HVM64"  }
    },

    "AWSRegionArch2AMI" : {

      "us-east-1" : { "PV64" : "ami-5fb8c835", "HVM64" : "ami-60b6c60a" },
      "us-west-1" : { "PV64" : "ami-56ea8636", "HVM64" : "ami-d5ea86b5" },
      "eu-west-1" : { "PV64" : "ami-95e33ce6", "HVM64" : "ami-bff32ccc" },
      "us-west-2" : { "PV64" : "ami-d93622b8", "HVM64" : "ami-f0091d91" }
    }

  },


  "Parameters": {

    "OpsWorksStackColor": {
        "Description": "RGB Color to use for OpsWorks Stack",
        "Type": "String",
        "Default": "rgb(38, 146, 168)"
    },

    "Region" : {
        "Type":"String",
        "Description": "Region location of the template resources",
        "Default": "eu-west-1",
        "AllowedValues" : [ "us-east-1", "us-west-1", "us-west-2", "eu-west-1" ]
    },

    "SecurityGroupIds": {
        "Description": "Security groups that can be used to access the EC2 instances, do not select more than 5 SG",
        "Type": "List<AWS::EC2::SecurityGroup::Id>",
        "ConstraintDescription": "must be list of EC2 security group ids"
    },

    "VpcId": {
        "Type": "AWS::EC2::VPC::Id",
        "Description": "VPC associated with the provided subnets",
        "Default": "vpc-69e3320c",
        "ConstraintDescription": "must be an existing VPC ID"
    },

    "SubnetId": {
        "Type": "String",
        "Default": "subnet-6820eb31",
        "ConstraintDescription": "must be an existing subnet ID"
    },

    "InstanceType": {
        "Type": "String",
        "Default": "c3.large",
        "AllowedValues" : ["t2.micro", "m1.small", "m1.large","m4.large","m4.xlarge","m4.2xlarge","m4.4xlarge","m4.10xlarge","m4.16xlarge","c4.large" , "c4.xlarge" ,"c4.2xlarge" , "c4.4xlarge","c4.8xlarge" , "c3.large" , "c3.xlarge", "c3.2xlarge", "c3.4xlarge" ,"c3.8xlarge"],
        "ConstraintDescription": "must be a valid EC2 instance type"
    },

    "KeyPairName": {
        "Type": "AWS::EC2::KeyPair::KeyName",
        "Default": "test-generic-ec2",
        "ConstraintDescription": "must be the name of an existing EC2 KeyPair"
    },

    "CookbookS3" : {
        "Type": "String",
        "Default": "https://s3-eu-west-1.amazonaws.com/MybucketJRBLO.cookbooks/cookbook-v2.tar.gz",
        "ConstraintDescription": "the Url to the cookbook"
    },

    "CookbookS3AccessID": {
        "Type": "String",
        "ConstraintDescription": "username to the appropriate IAM access key ID"
    },

    "CookbookS3AccessKey": {
        "Type": "String",
        "NoEcho" : "true",
        "ConstraintDescription": "password to the appropriate IAM secret access key"
    },


    "Environnement" : {
        "Description": "The Environnement variable ",
        "Type": "String",
        "Default": "test",
        "AllowedValues" : ["dev", "test", "int", "prod"]
    }

  },

  "Conditions" : {
    "CreateProdResources" : { "Fn::Not" : [{  "Fn::Equals" : [ {"Ref" : "Environnement"},"test" ] }] }
  },

  "Resources": {

    "MabStack": {
        "Type": "AWS::OpsWorks::Stack",
        "Properties": {
         "AgentVersion" : "LATEST",
         "Name": { "Ref": "AWS::StackName" },
         "Attributes": { "Color": { "Ref": "OpsWorksStackColor" } },
         "ChefConfiguration": {},
         "ConfigurationManager": { "Name": "Chef", "Version": "12" },
         "CustomCookbooksSource": {
           "Type": "s3",
           "Password" : { "Ref": "CookbookS3AccessKey" },
           "Username" : { "Ref": "CookbookS3AccessID" },
           "Url": { "Ref": "CookbookS3" }
         },
         "CustomJson":  { "awscli": { "profils": {
                          "default": {"role_arn": { "Fn::GetAtt": [ "OpsWorksInstanceProfile", "Arn" ] } }
                                  }
                     }


             ,

        "chef_environment": {"Ref" : "Environnement"}

         },
         "DefaultInstanceProfileArn": { "Fn::GetAtt": [ "OpsWorksInstanceProfile","Arn" ] },
         "DefaultOs": "Ubuntu 14.04 LTS",
         "DefaultRootDeviceType": "ebs",
         "DefaultSshKeyName": { "Ref": "KeyPairName" },
         "DefaultSubnetId" : {"Ref" : "SubnetId" },
         "ServiceRoleArn": { "Fn::GetAtt": ["OpsWorksServiceRole", "Arn"] },
         "UseCustomCookbooks": true,
         "UseOpsworksSecurityGroups" : true,
         "VpcId" : { "Ref" : "VpcId" }
        }
    },

    "MabLayer": {
        "Type": "AWS::OpsWorks::Layer",
        "DependsOn" : "OpsWorksServiceRole",
        "Properties": {
         "AutoAssignElasticIps" : false,
         "AutoAssignPublicIps" : true,
         "CustomRecipes" : {
           "Configure" : ["cassandra-php-driver::configure"],
           "Setup"     : ["cassandra-php-driver::setup", "security::setup"]
        },
         "CustomSecurityGroupIds" : { "Ref" : "SecurityGroupIds" },
         "EnableAutoHealing" : true,
         "InstallUpdatesOnBoot": false,
         "LifecycleEventConfiguration": {
           "ShutdownEventConfiguration": {
           "DelayUntilElbConnectionsDrained": false,
           "ExecutionTimeout": 120 }
         },
         "Name": "script-node",
         "Shortname" : "node",
         "StackId": { "Ref": "MabStack" },
         "Type": "custom",
         "UseEbsOptimizedInstances": true,
         "VolumeConfigurations": [ {
           "Iops": 10000,
           "MountPoint": "/dev/sda1",
           "NumberOfDisks": 1,
           "Size": 20,
           "VolumeType": "gp2"
         }]
      }
    },

    "OpsWorksServiceRole": {
        "Type": "AWS::IAM::Role",
        "Properties": {
         "AssumeRolePolicyDocument": {
          "Version" : "2012-10-17",
          "Statement": [ {
            "Effect": "Allow",
            "Principal": { "Service": [ { "Fn::FindInMap": [ "Region2Principal",{ "Ref": "AWS::Region" },"OpsWorksPrincipal" ] } ] },
                             "Action" : [ "sts:AssumeRole" ]
          } ]
            },
         "Path": "/",
         "Policies": [ {
          "PolicyName": "opsworks-service",
          "PolicyDocument": {
          "Version" : "2012-10-17",
          "Statement": [ {
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*"
            } ]
          }
          } ]
        }
    },

    "OpsWorksInstanceRole": {
        "Type": "AWS::IAM::Role",
        "Properties": {
         "AssumeRolePolicyDocument": {
          "Version" : "2012-10-17",
          "Statement": [ {
              "Effect": "Allow",
              "Principal": { "Service" : [ { "Fn::FindInMap": [ "Region2Principal", { "Ref": "AWS::Region" },"EC2Principal" ] } ] },
                             "Action"  : [ "sts:AssumeRole" ]
          }]
         },
         "Path": "/",
         "Policies": [{
          "PolicyName": "aws-opsworks-instance",
          "PolicyDocument": {
            "Statement": [{
              "Effect": "Allow",
              "Action": "*",
              "Resource": "*"
            }]
          }
         }]
        }
    },

    "OpsWorksInstanceProfile": {
        "Type": "AWS::IAM::InstanceProfile",
        "Properties": {
         "Path": "/",
         "Roles": [ { "Ref": "OpsWorksInstanceRole" } ]
      }
    },



    "MabInstance": {
        "Type": "AWS::OpsWorks::Instance",
        "Properties": {
         "Hostname": "Script",
         "RootDeviceType": "ebs",
         "StackId": {"Ref": "MabStack"},
         "LayerIds": [{"Ref": "MabLayer"}],
         "InstanceType": {"Ref" : "InstanceType"}
        }
    },

    "MabApp": {
        "Type": "AWS::OpsWorks::App",
        "Properties": {
         "AppSource" : {
          "Type" : "git",
          "Url" : "git://github.com:soumab/JRLapplication.git",
          "Revision" : "develop"
         },
         "Description": "Dataimport and connectors",
         "Name" : "JRL-App",
         "Shortname" : "JRL_app",
         "StackId" : {"Ref": "MabStack"},
         "Type" : "other"
        }
    },


  }




} 

I want my instance to have this environment variable :

export $Apps_ENV = "test" / "int" / "prod"

so the value depends on what the user will select. How to set this variable ? Is it possible through CustomJson ? Or directly in the cookbook ? please help. Thank you.

1

There are 1 answers

0
JavaQueen On BEST ANSWER

I successfly acheived what I wanted by the following settings:

I added this to CustomJson in my template :

  "settings" : {  "var" : {
                            "default": { "Apps_ENV": {"Ref" : "Environnement"} } }
                          }

And I added a cookbook as following

settings/recipes/defaults.rb : 



template '/etc/environment' do
  source 'env.erb'
  owner 'root'
  group 'root'
  mode '0755'
end

and settings/templates/default/env.erb:

<% node['settings']['var'].each do |var_name, var_att| %>
<%= sprintf("[%s]", var_name) %>
  <% var_att.each do |attr_name, attr_value| %>
<%= sprintf("%s=%s", attr_name, attr_value) %>
  <% end
end %>