After struggling with this problem in my mind for a while, I finally had the opportunity to experiment with Cloud Init and come up with a working solution for securely (I think) deploying code and credentials to a stock Ubuntu Instance on EC2.
My primary goals are:
- Must use an stock AMI with no customization
- Human readable user-data that contains appName, environment, and role.
- user-data must be easily modified by a developer for their own app or environment
(No forcing them to base64 encode, gzip, or use special tools)
- Must be portable between providers.
The example works with EC2, but initial ‘include’ file can be customized for each provider or OS.
The diagram below shows how this is to be accomplished
I’ve successfully deployed several instances using this method and it seems to work well. Getting the cloud init include file, and the script
On Debian-based systems, files in /etc/cron.d:
– must be owned by root
– must not be group or world writable
– may be symlinked, but the destination must follow the ownership and file permissions above
– Filenames must contain ONLY letters, numbers, underscores and hyphens. (not periods)
– must contain a username in the 6th column
From the man page:
Files in this directory have to be owned by root, do not need to be executable (they are configuration files, just like /etc/crontab) and must conform to the same naming convention as used by run-parts(8): they must consist solely of upper- and lower-case letters, digits, underscores, and hyphens. This means that they cannot contain any dots.
The man page also provides this explanation to this strange rule:
For example, any file containing dots will be ignored. This is done to prevent cron from running any of the files that are left by the Debian package management
system when handling files in /etc/cron.d/ as configuration files (i.e. files ending in .dpkg-dist, .dpkg-orig, and .dpkg-new).