Ecoer Logo
VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS8.89%
Net Worth
1.280USD
STEEM
6.570STEEM
SBD
0.256SBD
Own SP
13.381SP

Detailed Balance

STEEM
balance
6.570STEEM
market_balance
0.000STEEM
savings_balance
0.000STEEM
reward_steem_balance
0.000STEEM
STEEM POWER
Own SP
13.381SP
Delegated Out
0.000SP
Delegation In
0.000SP
Effective Power
13.381SP
Reward SP (pending)
0.000SP
SBD
sbd_balance
0.256SBD
sbd_conversions
0.000SBD
sbd_market_balance
0.000SBD
savings_sbd_balance
0.000SBD
reward_sbd_balance
0.000SBD
{
  "balance": "6.570 STEEM",
  "savings_balance": "0.000 STEEM",
  "reward_steem_balance": "0.000 STEEM",
  "vesting_shares": "21761.891563 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "0.000000 VESTS",
  "sbd_balance": "0.256 SBD",
  "savings_sbd_balance": "0.000 SBD",
  "reward_sbd_balance": "0.000 SBD",
  "conversions": []
}

Account Info

namernason
id169031
rank107,706
reputation132127824232
created2017-05-24T21:04:45
recovery_accountsteem
proxyNone
post_count46
comment_count0
lifetime_vote_count0
witnesses_voted_for0
last_post2017-10-05T12:35:45
last_root_post2017-09-22T21:55:06
last_vote_time2017-07-04T18:16:00
proxied_vsf_votes0, 0, 0, 0
can_vote1
voting_power0
delayed_votes0
balance6.570 STEEM
savings_balance0.000 STEEM
sbd_balance0.256 SBD
savings_sbd_balance0.000 SBD
vesting_shares21761.891563 VESTS
delegated_vesting_shares0.000000 VESTS
received_vesting_shares0.000000 VESTS
reward_vesting_balance0.000000 VESTS
vesting_balance0.000 STEEM
vesting_withdraw_rate0.000000 VESTS
next_vesting_withdrawal1969-12-31T23:59:59
withdrawn0
to_withdraw0
withdraw_routes0
savings_withdraw_requests0
last_account_recovery1970-01-01T00:00:00
reset_accountnull
last_owner_update1970-01-01T00:00:00
last_account_update2017-05-26T14:01:12
minedNo
sbd_seconds1,085,846,946
sbd_last_interest_payment2017-06-03T22:50:36
savings_sbd_last_interest_payment1970-01-01T00:00:00
{
  "id": 169031,
  "name": "rnason",
  "owner": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM8T1fLvndVZ8ugza43rHGmfbxxtP8xafvYnRqGz2sWBgJCcRwa7",
        1
      ]
    ]
  },
  "active": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM6AJRaY7mu2FqTgJTAWHyTwyjYKhVunGgLyvfz4hoUSpCWZpUrB",
        1
      ]
    ]
  },
  "posting": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM8YrgoiZFKR8PddtiE56zLPzVcWp5ovNtXGSm4miiFTKKgzeKJD",
        1
      ]
    ]
  },
  "memo_key": "STM5wrGzEo5952zWDRw2ftCJpVzcLSsRkxK4WaM8DDzRo75Kvwymb",
  "json_metadata": "{\"profile\":{\"profile_image\":\"https://s3.amazonaws.com/nason.co/assets/custom/images/Rich-Cafe.png\",\"name\":\"Rich Nason\",\"website\":\"http://nason.co\"}}",
  "posting_json_metadata": "{\"profile\":{\"profile_image\":\"https://s3.amazonaws.com/nason.co/assets/custom/images/Rich-Cafe.png\",\"name\":\"Rich Nason\",\"website\":\"http://nason.co\"}}",
  "proxy": "",
  "last_owner_update": "1970-01-01T00:00:00",
  "last_account_update": "2017-05-26T14:01:12",
  "created": "2017-05-24T21:04:45",
  "mined": false,
  "recovery_account": "steem",
  "last_account_recovery": "1970-01-01T00:00:00",
  "reset_account": "null",
  "comment_count": 0,
  "lifetime_vote_count": 0,
  "post_count": 46,
  "can_vote": true,
  "voting_manabar": {
    "current_mana": "21761891563",
    "last_update_time": 1588949925
  },
  "downvote_manabar": {
    "current_mana": "5440472890",
    "last_update_time": 1588949925
  },
  "voting_power": 0,
  "balance": "6.570 STEEM",
  "savings_balance": "0.000 STEEM",
  "sbd_balance": "0.256 SBD",
  "sbd_seconds": "1085846946",
  "sbd_seconds_last_update": "2017-06-21T12:43:42",
  "sbd_last_interest_payment": "2017-06-03T22:50:36",
  "savings_sbd_balance": "0.000 SBD",
  "savings_sbd_seconds": "0",
  "savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
  "savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
  "savings_withdraw_requests": 0,
  "reward_sbd_balance": "0.000 SBD",
  "reward_steem_balance": "0.000 STEEM",
  "reward_vesting_balance": "0.000000 VESTS",
  "reward_vesting_steem": "0.000 STEEM",
  "vesting_shares": "21761.891563 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "0.000000 VESTS",
  "vesting_withdraw_rate": "0.000000 VESTS",
  "next_vesting_withdrawal": "1969-12-31T23:59:59",
  "withdrawn": 0,
  "to_withdraw": 0,
  "withdraw_routes": 0,
  "curation_rewards": 0,
  "posting_rewards": 14633,
  "proxied_vsf_votes": [
    0,
    0,
    0,
    0
  ],
  "witnesses_voted_for": 0,
  "last_post": "2017-10-05T12:35:45",
  "last_root_post": "2017-09-22T21:55:06",
  "last_vote_time": "2017-07-04T18:16:00",
  "post_bandwidth": 0,
  "pending_claimed_accounts": 0,
  "vesting_balance": "0.000 STEEM",
  "reputation": "132127824232",
  "transfer_history": [],
  "market_history": [],
  "post_history": [],
  "vote_history": [],
  "other_history": [],
  "witness_votes": [],
  "tags_usage": [],
  "guest_bloggers": [],
  "rank": 107706
}

Withdraw Routes

IncomingOutgoing
Empty
Empty
{
  "incoming": [],
  "outgoing": []
}
From Date
To Date
steemdelegated 0.000 SP to @rnason
2020/05/08 14:58:45
delegatorsteem
delegateernason
vesting shares0.000000 VESTS
Transaction InfoBlock #43199741/Trx b50203e74073295343fa2ea8f39c54064808ef66
View Raw JSON Data
{
  "trx_id": "b50203e74073295343fa2ea8f39c54064808ef66",
  "block": 43199741,
  "trx_in_block": 25,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-05-08T14:58:45",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "rnason",
      "vesting_shares": "0.000000 VESTS"
    }
  ]
}
2019/05/24 23:08:39
parent authorrnason
parent permlinkdocker-101-lab
authorsteemitboard
permlinksteemitboard-notify-rnason-20190524t230838000z
title
bodyCongratulations @rnason! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@rnason/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table> <sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@rnason) and compare to others on the [Steem Ranking](http://steemitboard.com/ranking/index.php?name=rnason)_</sub> ###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
Transaction InfoBlock #33200743/Trx 15d5bea34e36b1d4e4e48d373ae0f8f7e17f18f7
View Raw JSON Data
{
  "trx_id": "15d5bea34e36b1d4e4e48d373ae0f8f7e17f18f7",
  "block": 33200743,
  "trx_in_block": 7,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2019-05-24T23:08:39",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "docker-101-lab",
      "author": "steemitboard",
      "permlink": "steemitboard-notify-rnason-20190524t230838000z",
      "title": "",
      "body": "Congratulations @rnason! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@rnason/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table>\n\n<sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@rnason) and compare to others on the [Steem Ranking](http://steemitboard.com/ranking/index.php?name=rnason)_</sub>\n\n\n###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}"
    }
  ]
}
2018/05/25 04:13:24
parent authorrnason
parent permlinkdocker-101-lab
authorsteemitboard
permlinksteemitboard-notify-rnason-20180525t041323000z
title
bodyCongratulations @rnason! You have completed some achievement on Steemit and have been rewarded with new badge(s) : 1 Year on Steemit Click on any badge to view your Board of Honor. For more information about SteemitBoard, click [here](https://steemit.com/@steemitboard) If you no longer want to receive notifications, reply to this comment with the word `STOP` > Do you like **SteemitBoard**'s project? **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
Transaction InfoBlock #22729357/Trx 695d74fa9c12caf5cc1691b03c47ede24696c092
View Raw JSON Data
{
  "trx_id": "695d74fa9c12caf5cc1691b03c47ede24696c092",
  "block": 22729357,
  "trx_in_block": 8,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-05-25T04:13:24",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "docker-101-lab",
      "author": "steemitboard",
      "permlink": "steemitboard-notify-rnason-20180525t041323000z",
      "title": "",
      "body": "Congratulations @rnason! You have completed some achievement on Steemit and have been rewarded with new badge(s) :\n\n1 Year on Steemit\nClick on any badge to view your Board of Honor.\nFor more information about SteemitBoard, click [here](https://steemit.com/@steemitboard)\n\nIf you no longer want to receive notifications, reply to this comment with the word `STOP`\n\n> Do you like **SteemitBoard**'s project? **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}"
    }
  ]
}
2018/05/25 00:25:39
parent authorrnason
parent permlinkdocker-101-lab
authorsteemitboard
permlinksteemitboard-notify-rnason-20180525t002540000z
title
bodyCongratulations @rnason! You have received a personal award! [![](https://steemitimages.com/70x70/http://steemitboard.com/@rnason/birthday1.png)](http://steemitboard.com/@rnason) 1 Year on Steemit _Click on the badge to view your Board of Honor. > Do you like **SteemitBoard**'s project? **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
Transaction InfoBlock #22724803/Trx 72268fcdffefbaeeafba238b0a63aaf8d63cdc27
View Raw JSON Data
{
  "trx_id": "72268fcdffefbaeeafba238b0a63aaf8d63cdc27",
  "block": 22724803,
  "trx_in_block": 41,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-05-25T00:25:39",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "docker-101-lab",
      "author": "steemitboard",
      "permlink": "steemitboard-notify-rnason-20180525t002540000z",
      "title": "",
      "body": "Congratulations @rnason! You have received a personal award!\n\n[![](https://steemitimages.com/70x70/http://steemitboard.com/@rnason/birthday1.png)](http://steemitboard.com/@rnason)  1 Year on Steemit\n_Click on the badge to view your Board of Honor.\n\n\n> Do you like **SteemitBoard**'s project? **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}"
    }
  ]
}
steemdelegated 1.251 SP to @rnason
2018/05/17 00:02:21
delegatorsteem
delegateernason
vesting shares2034.832276 VESTS
Transaction InfoBlock #22494348/Trx 4a1b989adcc0b5b8b81c0ec4fad9114983161966
View Raw JSON Data
{
  "trx_id": "4a1b989adcc0b5b8b81c0ec4fad9114983161966",
  "block": 22494348,
  "trx_in_block": 21,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-05-17T00:02:21",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "rnason",
      "vesting_shares": "2034.832276 VESTS"
    }
  ]
}
steemdelegated 5.397 SP to @rnason
2018/05/06 06:31:24
delegatorsteem
delegateernason
vesting shares8777.472866 VESTS
Transaction InfoBlock #22185377/Trx 9a4f8bdcd3c0fd8eec7285f0b6d7567825c8f2a7
View Raw JSON Data
{
  "trx_id": "9a4f8bdcd3c0fd8eec7285f0b6d7567825c8f2a7",
  "block": 22185377,
  "trx_in_block": 21,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-05-06T06:31:24",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "rnason",
      "vesting_shares": "8777.472866 VESTS"
    }
  ]
}
steemdelegated 5.522 SP to @rnason
2017/12/27 21:18:48
delegatorsteem
delegateernason
vesting shares8981.108437 VESTS
Transaction InfoBlock #18463189/Trx 8979f3655e6f1582a37219dd5399931ae4356372
View Raw JSON Data
{
  "trx_id": "8979f3655e6f1582a37219dd5399931ae4356372",
  "block": 18463189,
  "trx_in_block": 21,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-12-27T21:18:48",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "rnason",
      "vesting_shares": "8981.108437 VESTS"
    }
  ]
}
2017/10/05 12:35:45
parent authorbulk-coinz
parent permlinkcryptocurrency-market-scanner-now-live-cryptodrop-net
authorrnason
permlinkre-bulk-coinz-cryptocurrency-market-scanner-now-live-cryptodrop-net-20171005t123546247z
title
bodyIs this offline already, DNS not resolving the domain?
json metadata{"tags":["cryptocurrency"],"app":"steemit/0.1"}
Transaction InfoBlock #16063827/Trx 2f725af4ecfb424588927425c7ef2d45966fa04c
View Raw JSON Data
{
  "trx_id": "2f725af4ecfb424588927425c7ef2d45966fa04c",
  "block": 16063827,
  "trx_in_block": 16,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-10-05T12:35:45",
  "op": [
    "comment",
    {
      "parent_author": "bulk-coinz",
      "parent_permlink": "cryptocurrency-market-scanner-now-live-cryptodrop-net",
      "author": "rnason",
      "permlink": "re-bulk-coinz-cryptocurrency-market-scanner-now-live-cryptodrop-net-20171005t123546247z",
      "title": "",
      "body": "Is this offline already, DNS not resolving the domain?",
      "json_metadata": "{\"tags\":[\"cryptocurrency\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
jeffdudupvoted (5.00%) @rnason / docker-101-lab
2017/09/22 23:21:42
voterjeffdud
authorrnason
permlinkdocker-101-lab
weight500 (5.00%)
Transaction InfoBlock #15702571/Trx 88cc828e4d406edfcba475ff3bb19b92643b960b
View Raw JSON Data
{
  "trx_id": "88cc828e4d406edfcba475ff3bb19b92643b960b",
  "block": 15702571,
  "trx_in_block": 5,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-09-22T23:21:42",
  "op": [
    "vote",
    {
      "voter": "jeffdud",
      "author": "rnason",
      "permlink": "docker-101-lab",
      "weight": 500
    }
  ]
}
2017/09/22 23:11:51
voterphotography-help
authorrnason
permlinkdocker-101-lab
weight10000 (100.00%)
Transaction InfoBlock #15702374/Trx aa5bf8c316ab29b356264dde34e2d8a61cb2ba4d
View Raw JSON Data
{
  "trx_id": "aa5bf8c316ab29b356264dde34e2d8a61cb2ba4d",
  "block": 15702374,
  "trx_in_block": 11,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-09-22T23:11:51",
  "op": [
    "vote",
    {
      "voter": "photography-help",
      "author": "rnason",
      "permlink": "docker-101-lab",
      "weight": 10000
    }
  ]
}
yoloswagsupvoted (100.00%) @rnason / docker-101-lab
2017/09/22 22:21:09
voteryoloswags
authorrnason
permlinkdocker-101-lab
weight10000 (100.00%)
Transaction InfoBlock #15701361/Trx 77463f6d2ff6ce0bf5570f0099267a4e6c809a5b
View Raw JSON Data
{
  "trx_id": "77463f6d2ff6ce0bf5570f0099267a4e6c809a5b",
  "block": 15701361,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-09-22T22:21:09",
  "op": [
    "vote",
    {
      "voter": "yoloswags",
      "author": "rnason",
      "permlink": "docker-101-lab",
      "weight": 10000
    }
  ]
}
davy73upvoted (100.00%) @rnason / docker-101-lab
2017/09/22 21:56:42
voterdavy73
authorrnason
permlinkdocker-101-lab
weight10000 (100.00%)
Transaction InfoBlock #15700872/Trx a708b3f5c548ca76146aad061438b35a5d51ce8c
View Raw JSON Data
{
  "trx_id": "a708b3f5c548ca76146aad061438b35a5d51ce8c",
  "block": 15700872,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-09-22T21:56:42",
  "op": [
    "vote",
    {
      "voter": "davy73",
      "author": "rnason",
      "permlink": "docker-101-lab",
      "weight": 10000
    }
  ]
}
rnasonpublished a new post: docker-101-lab
2017/09/22 21:55:06
parent author
parent permlinkdocker
authorrnason
permlinkdocker-101-lab
titleDocker 101 Lab
body# Containers 101 Lab <br> <center> ![Docker](http://clusterfrak.com/img/vendor/docker.png) <br> For more information on Docker, visit [docker.com](https://www.docker.com/) </center> <br> ## Description: ------- This lab is meant to serve as a docker/containers 101 lab course. The objective of this lab will be to walk through a step by step exercise to help a user new to docker to get a docker image built, pushed to a registry, and deployed on a single non clustered standalone docker host. <br> ## Pre-Requisites: ------- __Pre-Requisites Alternative:__ As an alternative to installing the pre-requisites below, you could build an ec2-linux instance with all of the requirements bundled in. See the bottom of this page in the <b><i>Resources</i></b> section for a packer file that will create a lab builder AMI. <br> __1. &nbsp;&nbsp; Docker for Mac or Docker for Windows:__ The first thing that we will need to complete this lab will be to have a local docker environment running. This can be accomplished by either installing Docker for Mac, Docker for Windows, or the Docker engine installed on Linux. * [Docker for Mac](https://www.docker.com/docker-mac) - https://www.docker.com/docker-mac * [Docker for Windows](https://www.docker.com/docker-windows) - https://www.docker.com/docker-windows * [Docker for Linux](https://github.com/moby/moby/releases) - https://github.com/moby/moby/releases <br> __2. &nbsp;&nbsp; AWS Account:__ You will need to have an active AWS account, as this lab will cover pushing to an ECR (Elastic Container Registry), as well as deploying docker to an EC2 (Elastic Compute Cloud) instance <br> __3. &nbsp;&nbsp; IAM User:__ You will need an IAM user created with a miniumum of EC2 and ECR permissions setup. The user should have programmatic access, and have a generated Access Key, and associated Access Secret Key. <br> ![IAM Permissions](http://clusterfrak.com/img/tuts/container_labs/cl101_IAM_permissions.png) __4. &nbsp;&nbsp; Python and PIP:__ You will need to have python and PIP (Pip Installs Packages) installed on your workstation so we can download and install the AWS CLI tools. This step will be required for obtaining ECR login credentials further down the tutorial. * [Python](https://www.python.org/downloads/) - https://www.python.org/downloads/ * yum/apt-get install -y python-pip <br> __5. &nbsp;&nbsp; Install AWS CLI:__ In order to interact with AWS easier, you should have the awscli tool installed and configured with proper user access and user access secrets. You can configure the access key and access secret key using the ```aws configure``` command once the CLI tools have been installed via python pip <br> ```bash pip3 install awscli ``` ```bash aws configure AWS Access Key ID [None]: AWS Secret Access Key [None]: Default region name [None]: Default output format [None]: ``` <br> __Example:__ ```bash Desktop rnason$ aws configure AWS Access Key ID [None]: ABCDEFGHIJKLMNOPQRST AWS Secret Access Key [None]: **************************************** Default region name [us-east-2]: Default output format [None]: ``` <br> __6. &nbsp;&nbsp; Putty (Windows Only):__ If your using windows, then you will need to have Putty and Putty KeyGen installed on your local windows instance. We will need putty in order to SSH to the docker instances, and Putty KeyGen in order to convert the AWS Key PEM file to a putty required PPK File. <br> * Download the AWS Key Pem file used to launch your instance to your local drive * Download [Putty](https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe) - https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe * Download [PuttyGen](https://the.earth.li/~sgtatham/putty/latest/w64/puttygen.exe) - https://the.earth.li/~sgtatham/putty/latest/w64/puttygen.exe <br> #### Convert the PEM file into Putty PPK files Open PuttyGen, Click on the **Load** button. Browse to the PEM file, and click on Open. Press OK on the import dialog box. ![Putty Load](http://clusterfrak.com/img/tuts/container_labs/cl101_putty_load.png) <br> #### Save the Private Key <table><tr><td>Once Loaded, Click on the **Save Private Key** button to save the private key as a ppk formatted file. Press <b>Yes</b> on the dialog asking if you want to save the file without a passphrase to protect it. </td><td><img src="http://clusterfrak.com/img/tuts/container_labs/cl101_save_key_no_pass.png" alt="Putty Save No Pass"></td></tr></table> ![Putty Private Key Save](http://clusterfrak.com/img/tuts/container_labs/cl101_save_private_key.png) <br> #### Save the Public Key Last Click on the **Save Public Key** button to save the public key. ![Putty Private Key Save](http://clusterfrak.com/img/tuts/container_labs/cl101_save_pub_key.png) <br> #### Keys now ready to use with Putty! Once save, the private key can be used with putty to connect to your EC2 instances. <br> __7. &nbsp;&nbsp; Provision EC2 Instance with Docker installed:__ __Pre-Requisites Alternative:__ <br> The following step is required regardless of using your own workstation with the above pre-reqs installed, or using a separate EC2 bastion host for your build environment. The instance provisioned below will be used to deploy your built docker container image from the ECR registry <br> Provision an instance to run docker. The instance should have a security group that has SSH (port 22) and tcp port 8080 open. ![EC2 SG](http://clusterfrak.com/img/tuts/container_labs/cl101_sg.png) <br> __You can build a docker instance by simply launching your favorite Linux distribution and using the built in package repository to install docker.__ <br> ![RHEL](http://clusterfrak.com/img/vendor/icons/redhat-icon-64.png) RHEL, &nbsp; ![CentOS](http://clusterfrak.com/img/vendor/icons/centos-icon-64.png) CentOS, &nbsp; & &nbsp; ![Amazon Linux](http://clusterfrak.com/img/vendor/icons/amazonlinux-icon-64.png) Amazon Linux <br> ```bash sudo yum install docker ``` <br> #### Amazon Linux ```bash sudo chkconfig docker on sudo /etc/init.d/docker start ``` <br> #### RHEL & CentOS 7 ```bash systemctl enable docker.service systemctl start docker.service ``` <br><br> ![Debian](http://clusterfrak.com/img/vendor/icons/debian-icon-64.png) Debian &nbsp; & &nbsp; ![Ubuntu](http://clusterfrak.com/img/vendor/icons/ubuntu-icon-64.png) Ubuntu <br> ```bash sudo apt-get update sudo sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common sudo curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" sudo apt-get update sudo apt-get install docker-ce ``` <br> #### Test Docker ```bash root@ip-172-31-7-255:~# docker ps --all CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ``` <br><br> ## Creating a Docker Image: ------- __1. &nbsp;&nbsp; Create Dockerfile:__ Open your favorite editor and create a file named <b>Dockerfile</b>. This file will contain a list of all instructions that are required to install your application and build a container image. Copy the following Dockerfile content into your Dockerfile to build a Jenkins container image build. Note that if your using a remote EC2 instance, then you will need to use `vim Dockerfile` and paste the content of the dockerfile below using `ctl+p`, then close the file using `esc`, `:wq!` <br> ![RHEL](http://clusterfrak.com/img/vendor/icons/redhat-icon-64.png) RHEL, &nbsp; ![CentOS](http://clusterfrak.com/img/vendor/icons/centos-icon-64.png) CentOS, &nbsp; & &nbsp; ![Amazon Linux](http://clusterfrak.com/img/vendor/icons/amazonlinux-icon-64.png) Amazon Linux ------- <br> ```dockerfile ############################################################ # Dockerfile to build Jenkins Base Container # Based on: centos:6 ############################################################ # Set the base image to Centos 6.6 Base FROM centos:6 # File Author / Maintainer MAINTAINER Rich Nason [email protected] ################################################################### #************************* APP VERSIONS ************************* ################################################################### ################################################################### #*************** OVERRIDE ENABLED ENV VARIABLES ***************** ################################################################### ################################################################### #****************** ADD REQUIRED APP FILES ********************** ################################################################### ################################################################### #******************* UPDATES & PRE-REQS ************************* ################################################################### # Run Update, and install Jenkins RUN yum clean all && \ yum -y update && \ yum -y install sudo java-1.8.0-openjdk java-1.8.0-openjdk-devel git wget openssh-server net-tools && \ export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk.x86_64 && \ yum clean all && \ rm -fr /var/cache/* ################################################################### #******************* APPLICATION INSTALL ************************ ################################################################### # Add Jenkins Repository RUN cd /etc/yum.repos.d/ && \ wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo && \ rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key RUN yum clean all && \ yum -y install jenkins && \ yum clean all && \ rm -fr /var/cache/* ################################################################### #****************** POST DEPLOY CLEAN UP ************************ ################################################################### # Make SSH Directory, Instruct Jenkins not to prompt for host key verification and set perms RUN mkdir /var/lib/jenkins/.ssh && \ echo "Host *\n\tStrictHostKeyChecking no\n" >> /var/lib/jenkins/.ssh/config RUN mkdir -p /var/cache/jenkins/war || exit 0 && \ mkdir /var/log/jenkins || exit 0 && \ cd /var/cache/jenkins/war && \ jar -xvf /usr/lib/jenkins/jenkins.war && \ chmod a+w ./ # Reset Permissions RUN chown -R jenkins:jenkins /var/cache/jenkins && \ chown jenkins:jenkins /var/log/jenkins && \ chmod -R 775 /var/cache/jenkins && \ chmod -R 777 /var/log/jenkins && \ chown -R jenkins:jenkins /var/lib/jenkins && \ chown -R jenkins:jenkins /var/lib/jenkins/.ssh && \ chmod -R 0700 /var/lib/jenkins/.ssh && \ chmod -R 0600 /var/lib/jenkins/.ssh/* ################################################################### #***************** CONFIGURE START ITEMS ************************ ################################################################### RUN echo "service jenkins start" >> /root/.bashrc CMD /bin/bash ################################################################### #**************** EXPOSE APPLICATION PORTS ********************** ################################################################### # Expose ports to other containers only EXPOSE 8080 ################################################################### #******************* OPTIONAL / LEGACY ************************** ################################################################### ``` <br><br> ![Debian](http://clusterfrak.com/img/vendor/icons/debian-icon-64.png) Debian &nbsp; & &nbsp; ![Ubuntu](http://clusterfrak.com/img/vendor/icons/ubuntu-icon-64.png) Ubuntu ------- <br> ```dockerfile ############################################################ # Dockerfile to build Jenkins Base Container # Based on: debian:stretch ############################################################ # Set the base image to Debian Jessie Base FROM debian:stretch # File Author / Maintainer MAINTAINER Rich Nason [email protected] ################################################################### #************************* APP VERSIONS ************************* ################################################################### ################################################################### #*************** OVERRIDE ENABLED ENV VARIABLES ***************** ################################################################### ################################################################### #****************** ADD REQUIRED APP FILES ********************** ################################################################### ################################################################### #******************* UPDATES & PRE-REQS ************************* ################################################################### # Run Update, and install Jenkins # Clean, Update, Upgrade, and Install... then clear non English local data. openjdk-7-jdk RUN apt-get clean && \ apt-get update && \ apt-get -y upgrade && \ apt-get -y install sudo git wget openssh-server net-tools gnupg2 openjdk-8-jdk && \ apt-get clean && \ rm -fr /var/lib/apt/lists/* ################################################################### #******************* APPLICATION INSTALL ************************ ################################################################### # Add Jenkins Repository RUN wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add - && \ echo "deb http://pkg.jenkins-ci.org/debian binary/" >> /etc/apt/sources.list RUN apt-get clean && \ apt-get update && \ apt-get -y install jenkins && \ apt-get clean && \ rm -fr /var/lib/apt/lists/* ################################################################### #****************** POST DEPLOY CLEAN UP ************************ ################################################################### # Make SSH Directory, Instruct Jenkins not to prompt for host key verification and set perms RUN mkdir /var/lib/jenkins/.ssh && \ echo "Host *\n\tStrictHostKeyChecking no\n" >> /var/lib/jenkins/.ssh/config RUN mkdir -p /var/cache/jenkins/war || exit 0 && \ mkdir /var/log/jenkins || exit 0 && \ cd /var/cache/jenkins/war && \ jar -xvf /usr/lib/jenkins/jenkins.war && \ chmod a+w ./ # Reset Permissions RUN chown -R jenkins:jenkins /var/cache/jenkins && \ chown jenkins:jenkins /var/log/jenkins && \ chmod -R 775 /var/cache/jenkins && \ chmod -R 777 /var/log/jenkins && \ chown -R jenkins:jenkins /var/lib/jenkins && \ chown -R jenkins:jenkins /var/lib/jenkins/.ssh && \ chmod -R 0700 /var/lib/jenkins/.ssh && \ chmod -R 0600 /var/lib/jenkins/.ssh/* ################################################################### #***************** CONFIGURE START ITEMS ************************ ################################################################### RUN echo "service jenkins start" >> /root/.bashrc CMD /bin/bash ################################################################### #**************** EXPOSE APPLICATION PORTS ********************** ################################################################### # Expose ports to other containers only EXPOSE 8080 ################################################################### #******************* OPTIONAL / LEGACY ************************** ################################################################### ``` <br> __2. &nbsp;&nbsp; Build the Container:__ Once the Dockerfile has been saved, you can use it to build a docker image that can be deployed to any environment. We will use the &nbsp;<b>-t</b> &nbsp; flag in the docker build statement to specify an initial tag for the image. ```bash docker build -t lab/jenkins:latest . ``` <br> __NOTE:__ <br> 1. The docker build statement should be ran from the same directory where the Dockerfile was saved. The &nbsp; <b>"&nbsp;.&nbsp;"</b> &nbsp; at the end of the build statement is required, as it tells the Docker daemon to look in the current directory for a file named <b>Dockerfile</b>. <br> 2. Optionally you can use the &nbsp;<b>-f</b> &nbsp; flag to specify the location of the Dockerfile, in which case the Dockerfile does not need to be named Dockerfile as in the example of <code>docker build -t lab/jenkins:latest -f /tmp/myjenkinsfile</code> <br> 3. The container will go through each step from the dockerfile being executed while the image is being built, and will display any console output generated from each step <br> __Response:__ ```bash Removing intermediate container 98025c50a4d6 Step 8/11 : RUN chown -R jenkins:jenkins /var/cache/jenkins && chown jenkins:jenkins /var/log/jenkins && chmod -R 775 /var/cache/jenkins && chmod -R 777 /var/log/jenkins && chown -R jenkins:jenkins /var/lib/jenkins && chown -R jenkins:jenkins /var/lib/jenkins/.ssh && chmod -R 0700 /var/lib/jenkins/.ssh && chmod -R 0600 /var/lib/jenkins/.ssh/* ---> Running in 3fae508bab9a ---> 14ea938c3412 Removing intermediate container 3fae508bab9a Step 9/11 : RUN echo "service jenkins start" >> /root/.bashrc ---> Running in dfa20be95388 ---> 47181701e80c Removing intermediate container dfa20be95388 Step 10/11 : CMD /bin/bash ---> Running in 774ab02d3e59 ---> 37da3651ee62 Removing intermediate container 774ab02d3e59 Step 11/11 : EXPOSE 8080 ---> Running in 7214641391fd ---> c59152af0b38 Removing intermediate container 7214641391fd Successfully built c59152af0b38 Successfully tagged lab/jenkins:latest ``` <br> __3. &nbsp;&nbsp; Check the image:__ When the image has been built successfully, Verify and Run the image. Once it's been ran, we can test its proper functionality by loading Jenkins in a browser. ```bash docker images ``` __Response:__ ```bash Desktop rnason$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE lab/jenkins latest c59152af0b38 10 minutes ago 603MB centos 6 7ea307891843 5 weeks ago 194MB ``` <br> ```bash docker run -it -d --name jenkins -h jenkins -p 8080:8080 lab/jenkins ``` ```bash Desktop rnason$ docker ps --all CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6810ca84f9ff lab/jenkins "/bin/sh -c /bin/bash" 8 seconds ago Up 7 seconds 0.0.0.0:8080->8080/tcp jenkins ``` <br> __Docker Run Flags:__ <br> In the run statement the following flags are used: <br> <b>-it</b> &nbsp; runs the container with an interactive tty. <b>--name</b> &nbsp; will set the container name. <b>-h</b> &nbsp; sets the hostname of the container. <b>-p</b> &nbsp; is used to publish host ports and map them back to the corresponding container ports. (8080:8080 = host:container) <b>-d</b> &nbsp; will launch the container in daemon mode. Without it, the container would launch, and put you directly into the shell. If you are put into the docker container shell, you can exit by pressing <code>CTL P + CTL Q</code>. <br> __4. &nbsp;&nbsp; Launch Jenkins:__ Once the container has been launched open a web browser and go to the host bound port of 8080. The container build is successful if Jenkins loads properly in the browser. <br> ![Leeerooooy Jenkins!!!](http://clusterfrak.com/img/tuts/container_labs/cl101_jenkins_local_load.png) <br> __5. &nbsp;&nbsp; Cleanup:__ After Jenkins has been successfully launched in the browser we can now clean up the running container. We use the <code>docker stop</code> command to stop the running instance, then use <code>docker rm</code> to remove the running instance. Neither of these actions affect the image that we created, only the running instance of that image on our local machine. Once the running instance has been stopped and removed, we can push our tested image to the repository for future deployment. <br> ```bash Desktop rnason$ docker ps --all CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9173a60282ed lab/jenkins "/bin/sh -c /bin/bash" 11 minutes ago Up 11 minutes 0.0.0.0:8080->8080/tcp jenkins ``` ```bash Desktop rnason$ docker stop jenkins jenkins ``` ```bash Desktop rnason$ docker rm jenkins jenkins ``` ```bash Desktop rnason$ docker ps --all CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ``` ```bash Desktop rnason$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE lab/jenkins latest c59152af0b38 10 minutes ago 603MB centos 6 7ea307891843 5 weeks ago 194MB ``` <br> ## Pushing the Image to a Repository: ------- Once the image has been built successfully, we will need a place to store the completed image so that we can deploy it out to our infrastructure. There are several available options for storing images into repositories, for this exercise we will be using Amazon ECR: * [Docker Hub](https://hub.docker.com/) * [Quay Registry](https://quay.io/) * [Amazon ECR](https://aws.amazon.com/ecr/) <br> __1. &nbsp;&nbsp; Log into your AWS Account, and go to the ECS console:__ ![ECS](http://clusterfrak.com/img/tuts/container_labs/cl101_ecs_service.png) <br> __2. &nbsp;&nbsp; Click Getting Started:__ If you have never used ECS or ECR previously, you will be presented with the **Getting Started** page. Click the ![Getting_Started](http://clusterfrak.com/img/tuts/container_labs/cl101_ecs_gs_button.png) button. On the Getting Started screen, Uncheck the *Deploy a sample application onto an Amazon ECS Cluster* leaving only the *Store container images securely with Amazon ECR* option checked, and then press **Continue**. <br> ![Getting Started](http://clusterfrak.com/img/tuts/container_labs/cl101_getting_started_select.png) <br> __3. &nbsp;&nbsp; Name the Registry:__ Next we will need to name the registry. Type the name of your repository in the *Repository Name* field and then press **Next Step**. <br> ![Name Repo](http://clusterfrak.com/img/tuts/container_labs/cl101_repo_setup_01.png) <br> __Repository Name:__ <br> Use only lower case letters and no special symbols in the container registry naming convention. <br> __4. &nbsp;&nbsp; View Repo Instructions:__ Last we will be presented with the information on how to log in and interact with our repository. Read through the instructions, and press the **Done** button once done. <br> __Retrieving Login Instructions:__ <br> If you need to see the instructions again in the future, you can do so by going to the registry in the <b><i>ECR Repositories</b></i> section of the console, selecting the repository, and clicking the <b><i>View Push Commands</b></i> button at the top of the repository view window. <br> ![Repo Info](http://clusterfrak.com/img/tuts/container_labs/cl101_repo_login_info.png) <br> __5. &nbsp;&nbsp; Get Login Creds:__ On your workstation, we will now need to obtain the login command including the credentials for the ECR repository. In order to do so, perform the following command from your workstation. **(You will need the AWS CLI tools for this step)** <br> ```bash aws ecr get-login --no-include-email --region us-west-2 ``` __Response:__ ```bash docker login -u AWS -p eyJwYXlsb2FkIjoiZFlXTzlqUVRkdmxCcjZpaU0xSC9kT292YkR4RmhHMjRsZU9FNGs0czlGa1hzbmtmS05Cb3NqRjRmNTlZY1B4dkc3MU51bFU5eHBNZm8wczhGSUVHb2ljNnVwc0kzNVhkYzhBYjNHT2Z1RTVRMjByK09nLy9yOFlIYWdxWURkU1lLY3FlREh6YzBkazVyakxqRHViVXVXNUZGMjFVQUJsUkFqL3FHbGhSdmFKVXpkSStXdDQ2NHhIQmVQQWZCWmZzY2Y3UGRlMXVMV1dXK0Z2TEFSQnVySFA0UU8yQWl0RnpvSnFabFQ3Qnd6QTkwRW04MUxRWERWanplN0daOFN2SFR3cVNjVnloaXF2bEVpYUN1Z1RKU0hXQlpySWlReUJjU3diZkJaVEJPdWE0MS9pTXJqQXd1c3ZKOWFjVnpTUXFxZGZKZWZ0OXJLTE9NV21YRG9VdzI3RHVhNWNKK1pUdW9WNnBIcVZLMld2QXIwR3Vod1F2UGU2SEx2L0U2YTBJOThmTmtkS1lZUE4wZXd1RmRnUWhQRy9RV0ZBek5DRml6bVJNa2lxZ0FBTnBacVdyTkVvUzJsWkh6K1JOaVBTOG5pSkxIMjlLV3VhcnhlanZwU2VoOEFJb3lIeGk2ZVRyb3FSaXc0Q1lDYkMyWThtQm1xT1dVb0RNTlhTM2dBY1NhNXlrSkhOaHdqRzl3WVdnMkVQam5rY2FIcFJ6Y0VOWGZvZllPQ0laZmtmRHhIS0FHcDY4R21UT0doK0RFMWpSL2pQOGI2UmtuUUFpUXg2Q2JENEtsWUdCcUJQN0szeFl6Nm9ORVUrQ0xVTDRERjh0L3ZtSENReE5GOVlZWlMxQ3o5alFuTjc0VjR2V0d3N0hXOXJ5MjhZTHJkYkNyTFh5K0UvUkJJQ2VEYWNnMmw4MzBaK0JlMHpyNkxHbGE1SjFxTk0wbTVvODNjZ3hvZG10bTAvSjRoWWRpN25lQVVqZUt4UWdZVFBhWGliTHYxNG5Gbmg2bi8wZDYwWitXZGI2a203M3NJdkxrV1FnUng5bHJGd0NkTDhlRjd6REJ5MlBqaVlUNllZTEtHMVQrQnhMaUtLMUZxd2ZNRmoyVjBqOW1Tc3laQ29jYnhQTVozOGJidnV3OHdmRlVjWDdjaXZxNXpwaWU3S2Zoc2t6dnpDOHVTUjBJWisyV29RampJV1dIdnc3MmxWU3NUQU05Y2xZRU0xaGxDUlZvbHE4ZGdaRkJVNytTdzcyQnVMcXI4Vks0STYwa3V6ZUxlbE5pVkIwdWtBaU9sUkZMNVRkWEFYMlA3ZkVNYThjSUgvUXp0eGIzcFhxZ1M5bGc0N1d2ZWpEVFlONXVBMTdIZVVpRFRseTZxT3pBV3d5K2Q5ZUFFNndWNkdmNmpCVEdmL0t0dFlYdThVUWdsY09pQ0djaVZoRWlocmhXejdieGUvMDJKeHZiN0lCVjZCTmJVUzEiLCJkYXRha2V5IjoiQVFFQkFIajZsYzRYSUp3LzdsbjBIYzAwRE1lazZHRXhIQ2JZNFJJcFRNQ0k1OEluVXdBQUFINHdmQVlKS29aSWh2Y05BUWNHb0c4d2JRSUJBREJvQmdrcWhraUc5dzBCQndFd0hnWUpZSVpJQVdVREJBRXVNQkVFRExjK0FTYjhvNjNIZTJtR2N3SUJFSUE3RG8rM3h0NXdTcXZMNy8zeUJhdEViRFlBQUIwN2hicm5kMG5lOXpjSWIwSXV6MUcwTFBtSEtsSTZ0NXdveE4rYlNHbklrOWVWUmFMSlFxdz0iLCJ2ZXJzaW9uIjoiMSIsInR5cGUiOiJEQVRBX0tFWSJ9 https://987303449646.dkr.ecr.us-west-2.amazonaws.com ``` <br> __ECR Region:__ <br> The above command references the us-west-2 region. Ensure that the region reflect the proper region where you created your repository. <br> __6. &nbsp;&nbsp; Perform a docker login:__ On your workstation, use the returned command response to log into your docker repository. <br> ```bash docker login -u AWS -p {{YOUR_LOGIN_KEY}} ``` <br> __Example:__ ```bash docker login -u AWS -p eyJwYXlsb2FkIjoiZFlXTzlqUVRkdmxCcjZpaU0xSC9kT292YkR4RmhHMjRsZU9FNGs0czlGa1hzbmtmS05Cb3NqRjRmNTlZY1B4dkc3MU51bFU5eHBNZm8wczhGSUVHb2ljNnVwc0kzNVhkYzhBYjNHT2Z1RTVRMjByK09nLy9yOFlIYWdxWURkU1lLY3FlREh6YzBkazVyakxqRHViVXVXNUZGMjFVQUJsUkFqL3FHbGhSdmFKVXpkSStXdDQ2NHhIQmVQQWZCWmZzY2Y3UGRlMXVMV1dXK0Z2TEFSQnVySFA0UU8yQWl0RnpvSnFabFQ3Qnd6QTkwRW04MUxRWERWanplN0daOFN2SFR3cVNjVnloaXF2bEVpYUN1Z1RKU0hXQlpySWlReUJjU3diZkJaVEJPdWE0MS9pTXJqQXd1c3ZKOWFjVnpTUXFxZGZKZWZ0OXJLTE9NV21YRG9VdzI3RHVhNWNKK1pUdW9WNnBIcVZLMld2QXIwR3Vod1F2UGU2SEx2L0U2YTBJOThmTmtkS1lZUE4wZXd1RmRnUWhQRy9RV0ZBek5DRml6bVJNa2lxZ0FBTnBacVdyTkVvUzJsWkh6K1JOaVBTOG5pSkxIMjlLV3VhcnhlanZwU2VoOEFJb3lIeGk2ZVRyb3FSaXc0Q1lDYkMyWThtQm1xT1dVb0RNTlhTM2dBY1NhNXlrSkhOaHdqRzl3WVdnMkVQam5rY2FIcFJ6Y0VOWGZvZllPQ0laZmtmRHhIS0FHcDY4R21UT0doK0RFMWpSL2pQOGI2UmtuUUFpUXg2Q2JENEtsWUdCcUJQN0szeFl6Nm9ORVUrQ0xVTDRERjh0L3ZtSENReE5GOVlZWlMxQ3o5alFuTjc0VjR2V0d3N0hXOXJ5MjhZTHJkYkNyTFh5K0UvUkJJQ2VEYWNnMmw4MzBaK0JlMHpyNkxHbGE1SjFxTk0wbTVvODNjZ3hvZG10bTAvSjRoWWRpN25lQVVqZUt4UWdZVFBhWGliTHYxNG5Gbmg2bi8wZDYwWitXZGI2a203M3NJdkxrV1FnUng5bHJGd0NkTDhlRjd6REJ5MlBqaVlUNllZTEtHMVQrQnhMaUtLMUZxd2ZNRmoyVjBqOW1Tc3laQ29jYnhQTVozOGJidnV3OHdmRlVjWDdjaXZxNXpwaWU3S2Zoc2t6dnpDOHVTUjBJWisyV29RampJV1dIdnc3MmxWU3NUQU05Y2xZRU0xaGxDUlZvbHE4ZGdaRkJVNytTdzcyQnVMcXI4Vks0STYwa3V6ZUxlbE5pVkIwdWtBaU9sUkZMNVRkWEFYMlA3ZkVNYThjSUgvUXp0eGIzcFhxZ1M5bGc0N1d2ZWpEVFlONXVBMTdIZVVpRFRseTZxT3pBV3d5K2Q5ZUFFNndWNkdmNmpCVEdmL0t0dFlYdThVUWdsY09pQ0djaVZoRWlocmhXejdieGUvMDJKeHZiN0lCVjZCTmJVUzEiLCJkYXRha2V5IjoiQVFFQkFIajZsYzRYSUp3LzdsbjBIYzAwRE1lazZHRXhIQ2JZNFJJcFRNQ0k1OEluVXdBQUFINHdmQVlKS29aSWh2Y05BUWNHb0c4d2JRSUJBREJvQmdrcWhraUc5dzBCQndFd0hnWUpZSVpJQVdVREJBRXVNQkVFRExjK0FTYjhvNjNIZTJtR2N3SUJFSUE3RG8rM3h0NXdTcXZMNy8zeUJhdEViRFlBQUIwN2hicm5kMG5lOXpjSWIwSXV6MUcwTFBtSEtsSTZ0NXdveE4rYlNHbklrOWVWUmFMSlFxdz0iLCJ2ZXJzaW9uIjoiMSIsInR5cGUiOiJEQVRBX0tFWSJ9 https://987303449646.dkr.ecr.us-west-2.amazonaws.com ``` __Response:__ ```bash Login Succeeded ``` <br> __7. &nbsp;&nbsp; Tag the Image:__ Tag the image with the repository name given in the ECR command list. This will allow us to push the image to the newly created ECR repository. An image tag consists of 3 components, the server location, repository name, and image build. In the case of this example the repository name of 987303449646.dkr.ecr.us-west-2.amazonaws.com/jenkins:latest breaks down telling the docker dameon to push the image to the server DNS name of ***987303449646.dkr.ecr.us-west-2.amazonaws.com***, using the ***jenkins*** repository, and flag it as the ***latest*** build. <br> __Docker Image Tag:__ <br> Ensure when using the docker tag, and docker push statements that you replace the images tagged name, with the proper tag name from your own docker repository. The examples below reference the image and repository used during the creation of this lab, and are not valid tag or repository names. <br> ```bash docker tag lab/jenkins:latest {{REPO_ADDRESS}}/jenkins:latest ``` <br> __Example:__ ```bash docker tag lab/jenkins:latest 987303449646.dkr.ecr.us-west-2.amazonaws.com/jenkins:latest ``` __Once tagged run a <code>docker images</code> command to verify that the image was tagged correctly:__ ```bash docker images REPOSITORY TAG IMAGE ID CREATED SIZE 987303449646.dkr.ecr.us-west-2.amazonaws.com/jenkins latest a53da795f414 5 minutes ago 367MB lab/jenkins latest a53da795f414 5 minutes ago 367MB debian ``` <br> __8. &nbsp;&nbsp; Push the Image:__ Now that we have both the Docker image and repository created, and are logged into the repository, we can now push the image to the repository. <br> ```bash docker push {{REPO_ADDRESS}}/jenkins ``` <br> __Example:__ ```bash docker push 987303449646.dkr.ecr.us-west-2.amazonaws.com/jenkins ``` __Response:__ ```bash The push refers to a repository [987303449646.dkr.ecr.us-west-2.amazonaws.com/jenkins] 607f9d534485: Pushed 32eff9aeeadf: Pushed ed030e7c9ba6: Pushed 7b144cce2860: Pushed c77c4213307b: Pushed c8cf41c44d97: Pushed 5c86a415e035: Pushed 45f0f161f074: Pushed latest: digest: sha256:95de5123e73b78c41eb79e7b861b3726eb25c7735bb05a4488614f9380697202 size: 1989 ``` <br> __9. &nbsp;&nbsp; Check the ECR Registry:__ Once the image has been successfully pushed to the registry, we can verify it by going to the ECS/ECR console. <br> ![ECR Image](http://clusterfrak.com/img/tuts/container_labs/cl101_repo_push.png) <br> ## Deploying the Image to a Docker host: ------- __1. &nbsp;&nbsp; Log into your EC2 Docker Host:__ This next section will cover deploying the docker image to a standalone Docker host, running on an Amazon EC2 Instance. SSH into your host, and ensure that Docker is running properly by issuing a ```docker info``` command. <br> ```bash Desktop rnason$ ssh [email protected] The authenticity of host '54.174.221.75 (54.174.221.75)' can't be established. ECDSA key fingerprint is SHA256:aaYjORsif3hmdbIHEBepYaQcvebOvEG+QJ3oHZzJZJo. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '54.174.221.75' (ECDSA) to the list of known hosts. __| __|_ ) _| ( / Amazon Linux AMI ___|\___|___| https://aws.amazon.com/amazon-linux-ami/2017.03-release-notes/ 8 package(s) needed for security, out of 8 available Run "sudo yum update" to apply all updates. [ec2-user@ip-172-31-1-61 ~]$ sudo su - ``` <br> __2. &nbsp;&nbsp; Test Docker:__ Once successfully logged into docker, test the docker daemon to ensure its installed and running properly using the following few docker commands: <br> ```bash [root@ip-172-31-1-61 ~]# docker info Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 Server Version: 17.03.2-ce Storage Driver: overlay2 Backing Filesystem: extfs Supports d_type: true Native Overlay Diff: true Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host macvlan null overlay Swarm: inactive Runtimes: runc Default Runtime: runc Init Binary: docker-init containerd version: 4ab9917febca54791c5f071a9d1f404867857fcc runc version: 54296cf40ad8143b62dbcaa1d90e520a2136ddfe init version: 949e6fa Security Options: seccomp Profile: default Kernel Version: 4.9.38-16.35.amzn1.x86_64 Operating System: Amazon Linux AMI 2017.03 OSType: linux Architecture: x86_64 CPUs: 1 Total Memory: 993.5 MiB Name: ip-172-31-1-61 ID: M3IQ:2HUY:R375:MGSN:UW7C:A76W:74ZW:4DEG:L5L5:QPW7:IRYR:UJYK Docker Root Dir: /var/lib/docker Debug Mode (client): false Debug Mode (server): false Registry: https://index.docker.io/v1/ Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false ``` ```bash [root@ip-172-31-1-61 ~]# docker ps --all CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ``` <br> __3. &nbsp;&nbsp; Log into ECR:__ Next we need to use the ```docker login``` command previously obtained to log into the ECR registry from our new docker host. This will allow us access to the image that we built and pushed in the previous section of the lab. <br> <div class='alert alert-danger'> <i class='fa fa-info-circle'></i> &nbsp;&nbsp; Docker Image Tag: <br> Ensure when using the docker tag, and docker push statements that you replace the images tagged name, with the proper tag name from your own docker repository. The examples below reference the image and repository used during the creation of this lab, and are not valid tag or repository names. </div> <br> ```bash docker login -u AWS -p {{YOUR_LOGIN_KEY}} ``` <br> __Example:__ ```bash docker login -u AWS -p eyJwYXlsb2FkIjoiZFlXTzlqUVRkdmxCcjZpaU0xSC9kT292YkR4RmhHMjRsZU9FNGs0czlGa1hzbmtmS05Cb3NqRjRmNTlZY1B4dkc3MU51bFU5eHBNZm8wczhGSUVHb2ljNnVwc0kzNVhkYzhBYjNHT2Z1RTVRMjByK09nLy9yOFlIYWdxWURkU1lLY3FlREh6YzBkazVyakxqRHViVXVXNUZGMjFVQUJsUkFqL3FHbGhSdmFKVXpkSStXdDQ2NHhIQmVQQWZCWmZzY2Y3UGRlMXVMV1dXK0Z2TEFSQnVySFA0UU8yQWl0RnpvSnFabFQ3Qnd6QTkwRW04MUxRWERWanplN0daOFN2SFR3cVNjVnloaXF2bEVpYUN1Z1RKU0hXQlpySWlReUJjU3diZkJaVEJPdWE0MS9pTXJqQXd1c3ZKOWFjVnpTUXFxZGZKZWZ0OXJLTE9NV21YRG9VdzI3RHVhNWNKK1pUdW9WNnBIcVZLMld2QXIwR3Vod1F2UGU2SEx2L0U2YTBJOThmTmtkS1lZUE4wZXd1RmRnUWhQRy9RV0ZBek5DRml6bVJNa2lxZ0FBTnBacVdyTkVvUzJsWkh6K1JOaVBTOG5pSkxIMjlLV3VhcnhlanZwU2VoOEFJb3lIeGk2ZVRyb3FSaXc0Q1lDYkMyWThtQm1xT1dVb0RNTlhTM2dBY1NhNXlrSkhOaHdqRzl3WVdnMkVQam5rY2FIcFJ6Y0VOWGZvZllPQ0laZmtmRHhIS0FHcDY4R21UT0doK0RFMWpSL2pQOGI2UmtuUUFpUXg2Q2JENEtsWUdCcUJQN0szeFl6Nm9ORVUrQ0xVTDRERjh0L3ZtSENReE5GOVlZWlMxQ3o5alFuTjc0VjR2V0d3N0hXOXJ5MjhZTHJkYkNyTFh5K0UvUkJJQ2VEYWNnMmw4MzBaK0JlMHpyNkxHbGE1SjFxTk0wbTVvODNjZ3hvZG10bTAvSjRoWWRpN25lQVVqZUt4UWdZVFBhWGliTHYxNG5Gbmg2bi8wZDYwWitXZGI2a203M3NJdkxrV1FnUng5bHJGd0NkTDhlRjd6REJ5MlBqaVlUNllZTEtHMVQrQnhMaUtLMUZxd2ZNRmoyVjBqOW1Tc3laQ29jYnhQTVozOGJidnV3OHdmRlVjWDdjaXZxNXpwaWU3S2Zoc2t6dnpDOHVTUjBJWisyV29RampJV1dIdnc3MmxWU3NUQU05Y2xZRU0xaGxDUlZvbHE4ZGdaRkJVNytTdzcyQnVMcXI4Vks0STYwa3V6ZUxlbE5pVkIwdWtBaU9sUkZMNVRkWEFYMlA3ZkVNYThjSUgvUXp0eGIzcFhxZ1M5bGc0N1d2ZWpEVFlONXVBMTdIZVVpRFRseTZxT3pBV3d5K2Q5ZUFFNndWNkdmNmpCVEdmL0t0dFlYdThVUWdsY09pQ0djaVZoRWlocmhXejdieGUvMDJKeHZiN0lCVjZCTmJVUzEiLCJkYXRha2V5IjoiQVFFQkFIajZsYzRYSUp3LzdsbjBIYzAwRE1lazZHRXhIQ2JZNFJJcFRNQ0k1OEluVXdBQUFINHdmQVlKS29aSWh2Y05BUWNHb0c4d2JRSUJBREJvQmdrcWhraUc5dzBCQndFd0hnWUpZSVpJQVdVREJBRXVNQkVFRExjK0FTYjhvNjNIZTJtR2N3SUJFSUE3RG8rM3h0NXdTcXZMNy8zeUJhdEViRFlBQUIwN2hicm5kMG5lOXpjSWIwSXV6MUcwTFBtSEtsSTZ0NXdveE4rYlNHbklrOWVWUmFMSlFxdz0iLCJ2ZXJzaW9uIjoiMSIsInR5cGUiOiJEQVRBX0tFWSJ9 https://987303449646.dkr.ecr.us-west-2.amazonaws.com ``` __Response:__ ```bash Login Succeeded ``` <br> __4. &nbsp;&nbsp; Deploy the Image:__ Once logged into ECR, we can now run the new image that we created earlier. There are 2 ways to get the image onto the new deployment host, The first would be to do a ```docker pull```, which would simply pull the image down to the host, requiring a second ```docker run``` command to actually run it. With Docker however, the first step isn't required if we are running the image for the first time. Simply using the ```docker run``` command will perform both steps automatically. <br> ```bash docker run -it -d --name jenkins -h jenkins -p 8080:8080 {{REPO_ADDRESS}}/jenkins:latest ``` <br> __Example:__ ```bash docker run -it -d --name jenkins -h jenkins -p 8080:8080 987303449646.dkr.ecr.us-west-2.amazonaws.com/jenkins:latest ``` __Response:__ ```bash Unable to find image '987303449646.dkr.ecr.us-west-2.amazonaws.com/jenkins:latest' locally latest: Pulling from jenkins 40ae7ce86d93: Pull complete 7259c83d6d97: Pull complete 2c01368e2eff: Pull complete da849b4ff22f: Pull complete 2886258060bf: Pull complete a8c599f863b6: Pull complete affea2dd0686: Pull complete 8648a17db0a5: Pull complete Digest: sha256:95de5123e73b78c41eb79e7b861b3726eb25c7735bb05a4488614f9380697202 Status: Downloaded newer image for 987303449646.dkr.ecr.us-west-2.amazonaws.com/jenkins:latest 4d1a05e8341e764f2d4b47d04f47f16e07907846ae11d4315bc885be6258e720 ``` __Once the runs statement has completed, use the <code> docker ps </code> command to verify that the container is running and that the status is <i>up</i>__ ```bash [root@ip-172-31-1-61 ~]# docker ps --all CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4d1a05e8341e 987303449646.dkr.ecr.us-west-2.amazonaws.com/jenkins:latest "/bin/sh -c /bin/bash" 8 minutes ago Up 8 minutes 0.0.0.0:8080->8080/tcp jenkins ``` <br> __5. &nbsp;&nbsp; Test the Deployment:__ Once the run has completed, we can test the deployment by opening a browser and going to the IP of the instance on port 8080. The Jenkins screen should appear. <br> ![Leeeerooooy Jenkins !!!!](http://clusterfrak.com/img/tuts/container_labs/cl101_jenkins_load.png) <br><br> ## Resources: ------- ### Lab Pre-Req Packer File: <br> __Packer File:__ ```json { "builders": [{ "type": "amazon-ebs", "access_key": "{{user `aws_access_key`}}", "secret_key": "{{user `aws_secret_key`}}", "region": "{{user `region`}}", "source_ami": "{{user `ami`}}", "instance_type": "{{user `instance_type`}}", "ami_name": "{{user `ami_name`}}-{{timestamp}}", "ami_description": "{{user `ami_description`}}", "availability_zone": "{{user `availability_zone`}}", "vpc_id": "{{user `vpc_id`}}", "subnet_id": "{{user `subnet_id`}}", "security_group_id": "{{user `security_group_id`}}", "ssh_keypair_name": "{{user `ssh_keypair_name`}}", "ssh_agent_auth": true, "ssh_username": "{{user `ssh_username`}}", "associate_public_ip_address": true, "ssh_private_ip": false, "tags": { "Name": "{{user `tag_name`}}", "OS_Version": "{{user `tag_osver`}}" } }], "provisioners": [ { "type": "shell", "inline": [ "sudo yum clean all", "sudo yum -y update", "sudo yum install -y docker jq", "sudo chkconfig docker on", "sudo /etc/init.d/docker start", "sudo pip install awscli", "sudo curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl", "sudo mv kubectl /usr/bin/", "sudo chmod +x /usr/bin/kubectl", "sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose", "sudo chmod +x /usr/local/bin/docker-compose" ] } ]} ``` <br> __Packer Build-Vars File:__ ```json { "aws_access_key": "ABCDEFGHIJKLMNOPQRST", "aws_secret_key": "abcdefghijklmnopqrstuvwxyz1234567890abcd", "instance_type": "t2.small", "region": "us-east-2", "availability_zone": "us-east-2a", "ami": "ami-ea87a78f", "vpc_id": "vpc-y12345ba", "subnet_id": "subnet-12a3456b", "security_group_id": "sg-a6ca00cd", "ssh_keypair_name": "MyKey", "ssh_username": "ec2-user", "ami_name": "Container-Lab", "ami_description": "Image with all of the tools required to run ECS/K8 Labs", "tag_name": "Container-Lab", "tag_osver": "Amazon Linux" } ``` <br> __Packer Build Command:__ ```bash packer build -var-file=buildvars.json container_lab.json ```
json metadata{"tags":["docker"],"image":["http://clusterfrak.com/img/vendor/docker.png","http://clusterfrak.com/img/tuts/container_labs/cl101_IAM_permissions.png","http://clusterfrak.com/img/tuts/container_labs/cl101_putty_load.png","http://clusterfrak.com/img/tuts/container_labs/cl101_save_key_no_pass.png","http://clusterfrak.com/img/tuts/container_labs/cl101_save_private_key.png","http://clusterfrak.com/img/tuts/container_labs/cl101_save_pub_key.png","http://clusterfrak.com/img/tuts/container_labs/cl101_sg.png","http://clusterfrak.com/img/vendor/icons/redhat-icon-64.png","http://clusterfrak.com/img/vendor/icons/centos-icon-64.png","http://clusterfrak.com/img/vendor/icons/amazonlinux-icon-64.png","http://clusterfrak.com/img/vendor/icons/debian-icon-64.png","http://clusterfrak.com/img/vendor/icons/ubuntu-icon-64.png","http://clusterfrak.com/img/tuts/container_labs/cl101_jenkins_local_load.png","http://clusterfrak.com/img/tuts/container_labs/cl101_ecs_service.png","http://clusterfrak.com/img/tuts/container_labs/cl101_ecs_gs_button.png","http://clusterfrak.com/img/tuts/container_labs/cl101_getting_started_select.png","http://clusterfrak.com/img/tuts/container_labs/cl101_repo_setup_01.png","http://clusterfrak.com/img/tuts/container_labs/cl101_repo_login_info.png","http://clusterfrak.com/img/tuts/container_labs/cl101_repo_push.png","http://clusterfrak.com/img/tuts/container_labs/cl101_jenkins_load.png"],"links":["https://www.docker.com/","https://www.docker.com/docker-mac","https://www.docker.com/docker-windows","https://github.com/moby/moby/releases","https://www.python.org/downloads/","https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe","https://the.earth.li/~sgtatham/putty/latest/w64/puttygen.exe","https://hub.docker.com/","https://quay.io/","https://aws.amazon.com/ecr/"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #15700840/Trx 101ba5534fb5daff9bf081bfece7721589581206
View Raw JSON Data
{
  "trx_id": "101ba5534fb5daff9bf081bfece7721589581206",
  "block": 15700840,
  "trx_in_block": 19,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-09-22T21:55:06",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "docker",
      "author": "rnason",
      "permlink": "docker-101-lab",
      "title": "Docker 101 Lab",
      "body": "# Containers 101 Lab\n\n<br>\n<center>\n![Docker](http://clusterfrak.com/img/vendor/docker.png) <br>\nFor more information on Docker, visit [docker.com](https://www.docker.com/)\n</center>\n\n<br>\n## Description:\n-------\nThis lab is meant to serve as a docker/containers 101 lab course. The objective of this lab will be to walk through a step by step exercise to help a user new to docker to get a docker image built, pushed to a registry, and deployed on a single non clustered standalone docker host. \n\n<br>\n\n## Pre-Requisites:\n-------\n\n__Pre-Requisites Alternative:__\nAs an alternative to installing the pre-requisites below, you could build an ec2-linux instance with all of the requirements bundled in. See the bottom of this page in the <b><i>Resources</i></b> section for a packer file that will create a lab builder AMI.\n\n<br>\n\n__1. &nbsp;&nbsp; Docker for Mac or Docker for Windows:__\nThe first thing that we will need to complete this lab will be to have a local docker environment running. This can be accomplished by either installing Docker for Mac, Docker for Windows, or the Docker engine installed on Linux.\n\n* [Docker for Mac](https://www.docker.com/docker-mac) - https://www.docker.com/docker-mac\n* [Docker for Windows](https://www.docker.com/docker-windows) - https://www.docker.com/docker-windows\n* [Docker for Linux](https://github.com/moby/moby/releases) - https://github.com/moby/moby/releases\n\n<br>\n\n__2. &nbsp;&nbsp; AWS Account:__\nYou will need to have an active AWS account, as this lab will cover pushing to an ECR (Elastic Container Registry), as well as deploying docker to an EC2 (Elastic Compute Cloud) instance\n\n<br>\n\n__3. &nbsp;&nbsp; IAM User:__\nYou will need an IAM user created with a miniumum of EC2 and ECR permissions setup. The user should have programmatic access, and have a generated Access Key, and associated Access Secret Key.\n\n<br>\n\n![IAM Permissions](http://clusterfrak.com/img/tuts/container_labs/cl101_IAM_permissions.png)\n\n__4. &nbsp;&nbsp; Python and PIP:__\nYou will need to have python and PIP (Pip Installs Packages) installed on your workstation so we can download and install the AWS CLI tools. This step will be required for obtaining ECR login credentials further down the tutorial.\n\n* [Python](https://www.python.org/downloads/) - https://www.python.org/downloads/\n* yum/apt-get install -y python-pip\n\n<br>\n\n__5. &nbsp;&nbsp; Install AWS CLI:__\nIn order to interact with AWS easier, you should have the awscli tool installed and configured with proper user access and user access secrets. You can configure the access key and access secret key using the ```aws configure``` command once the CLI tools have been installed via python pip\n\n<br>\n\n```bash\npip3 install awscli\n```\n\n```bash\naws configure \nAWS Access Key ID [None]: \nAWS Secret Access Key [None]:\nDefault region name [None]: \nDefault output format [None]: \n```\n\n<br>\n\n__Example:__\n```bash\nDesktop rnason$ aws configure \nAWS Access Key ID [None]: ABCDEFGHIJKLMNOPQRST\nAWS Secret Access Key [None]: ****************************************\nDefault region name [us-east-2]: \nDefault output format [None]: \n```\n\n<br>\n\n__6. &nbsp;&nbsp; Putty (Windows Only):__\nIf your using windows, then you will need to have Putty and Putty KeyGen installed on your local windows instance. We will need putty in order to SSH to the docker instances, and Putty KeyGen in order to convert the AWS Key PEM file to a putty required PPK File. \n\n<br>\n\n* Download the AWS Key Pem file used to launch your instance to your local drive\n* Download [Putty](https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe) - https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\n* Download [PuttyGen](https://the.earth.li/~sgtatham/putty/latest/w64/puttygen.exe) - https://the.earth.li/~sgtatham/putty/latest/w64/puttygen.exe\n\n<br>\n\n#### Convert the PEM file into Putty PPK files\nOpen PuttyGen, Click on the **Load** button. Browse to the PEM file, and click on Open. Press OK on the import dialog box.\n\n![Putty Load](http://clusterfrak.com/img/tuts/container_labs/cl101_putty_load.png) \n\n<br>\n\n#### Save the Private Key\n\n<table><tr><td>Once Loaded, Click on the **Save Private Key** button to save the private key as a ppk formatted file. Press <b>Yes</b> on the dialog asking if you want to save the file without a passphrase to protect it. </td><td><img src=\"http://clusterfrak.com/img/tuts/container_labs/cl101_save_key_no_pass.png\" alt=\"Putty Save No Pass\"></td></tr></table>\n\n![Putty Private Key Save](http://clusterfrak.com/img/tuts/container_labs/cl101_save_private_key.png) \n\n<br>\n\n#### Save the Public Key\nLast Click on the **Save Public Key** button to save the public key. \n\n![Putty Private Key Save](http://clusterfrak.com/img/tuts/container_labs/cl101_save_pub_key.png)\n\n<br>\n\n#### Keys now ready to use with Putty!\nOnce save, the private key can be used with putty to connect to your EC2 instances. \n\n<br>\n\n__7. &nbsp;&nbsp; Provision EC2 Instance with Docker installed:__\n\n__Pre-Requisites Alternative:__ <br>\n\nThe following step is required regardless of using your own workstation with the above pre-reqs installed, or using a separate EC2 bastion host for your build environment. The instance provisioned below will be used to deploy your built docker container image from the ECR registry\n\n<br>\n\nProvision an instance to run docker. The instance should have a security group that has SSH (port 22) and tcp port 8080 open. \n\n![EC2 SG](http://clusterfrak.com/img/tuts/container_labs/cl101_sg.png)\n\n<br>\n\n__You can build a docker instance by simply launching your favorite Linux distribution and using the built in package repository to install docker.__\n\n<br>\n\n![RHEL](http://clusterfrak.com/img/vendor/icons/redhat-icon-64.png) RHEL, &nbsp; ![CentOS](http://clusterfrak.com/img/vendor/icons/centos-icon-64.png) CentOS, &nbsp; & &nbsp; ![Amazon Linux](http://clusterfrak.com/img/vendor/icons/amazonlinux-icon-64.png) Amazon Linux\n\n<br>\n\n```bash\nsudo yum install docker\n```\n\n<br>\n\n#### Amazon Linux\n\n```bash\nsudo chkconfig docker on\nsudo /etc/init.d/docker start\n```\n\n<br>\n\n#### RHEL & CentOS 7\n```bash\nsystemctl enable docker.service\nsystemctl start docker.service\n```\n\n<br><br>\n\n![Debian](http://clusterfrak.com/img/vendor/icons/debian-icon-64.png) Debian &nbsp; & &nbsp; ![Ubuntu](http://clusterfrak.com/img/vendor/icons/ubuntu-icon-64.png) Ubuntu\n\n<br>\n\n```bash\nsudo apt-get update\nsudo sudo apt-get install apt-transport-https ca-certificates curl gnupg2 software-properties-common\nsudo curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -\nsudo add-apt-repository \"deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable\"\nsudo apt-get update\nsudo apt-get install docker-ce\n```\n\n<br>\n\n#### Test Docker\n```bash\nroot@ip-172-31-7-255:~# docker ps --all\nCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES\n```\n\n<br><br>\n\n## Creating a Docker Image:\n-------\n\n__1. &nbsp;&nbsp; Create Dockerfile:__\nOpen your favorite editor and create a file named <b>Dockerfile</b>. This file will contain a list of all instructions that are required to install your application and build a container image.\nCopy the following Dockerfile content into your Dockerfile to build a Jenkins container image build. Note that if your using a remote EC2 instance, then you will need to use `vim Dockerfile` and paste the content of the dockerfile below using `ctl+p`, then close the file using `esc`, `:wq!`\n\n<br>\n\n![RHEL](http://clusterfrak.com/img/vendor/icons/redhat-icon-64.png) RHEL, &nbsp; ![CentOS](http://clusterfrak.com/img/vendor/icons/centos-icon-64.png) CentOS, &nbsp; & &nbsp; ![Amazon Linux](http://clusterfrak.com/img/vendor/icons/amazonlinux-icon-64.png) Amazon Linux\n\n-------\n\n<br>\n\n```dockerfile\n############################################################\n# Dockerfile to build Jenkins Base Container\n# Based on: centos:6\n############################################################\n\n# Set the base image to Centos 6.6 Base\nFROM centos:6\n\n# File Author / Maintainer\nMAINTAINER Rich Nason [email protected]\n\n###################################################################\n#*************************  APP VERSIONS  *************************\n###################################################################\n\n \n###################################################################\n#***************  OVERRIDE ENABLED ENV VARIABLES  *****************\n###################################################################\n\n\n###################################################################\n#******************  ADD REQUIRED APP FILES  **********************\n###################################################################\n\n\n###################################################################\n#*******************  UPDATES & PRE-REQS  *************************\n###################################################################\n\n# Run Update, and install Jenkins\nRUN yum clean all && \\\nyum -y update && \\\nyum -y install sudo java-1.8.0-openjdk java-1.8.0-openjdk-devel git wget openssh-server net-tools && \\\nexport JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk.x86_64 && \\\nyum clean all && \\\nrm -fr /var/cache/*\n\n###################################################################\n#*******************  APPLICATION INSTALL  ************************\n###################################################################\n\n# Add Jenkins Repository\nRUN cd /etc/yum.repos.d/ && \\\nwget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo && \\\nrpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key\n\nRUN yum clean all && \\\nyum -y install jenkins && \\\nyum clean all && \\\nrm -fr /var/cache/*\n\n###################################################################\n#******************  POST DEPLOY CLEAN UP  ************************\n###################################################################\n\n# Make SSH Directory, Instruct Jenkins not to prompt for host key verification and set perms\nRUN mkdir /var/lib/jenkins/.ssh && \\\necho \"Host *\\n\\tStrictHostKeyChecking no\\n\" >> /var/lib/jenkins/.ssh/config\n\nRUN mkdir -p /var/cache/jenkins/war || exit 0 && \\\nmkdir /var/log/jenkins || exit 0 && \\\ncd /var/cache/jenkins/war && \\\njar -xvf /usr/lib/jenkins/jenkins.war && \\\nchmod a+w ./\n\n# Reset Permissions\nRUN chown -R jenkins:jenkins /var/cache/jenkins && \\\nchown jenkins:jenkins /var/log/jenkins && \\\nchmod -R 775 /var/cache/jenkins && \\\nchmod -R 777 /var/log/jenkins && \\\nchown -R jenkins:jenkins /var/lib/jenkins && \\\nchown -R jenkins:jenkins /var/lib/jenkins/.ssh && \\\nchmod -R 0700 /var/lib/jenkins/.ssh && \\\nchmod -R 0600 /var/lib/jenkins/.ssh/*\n\n###################################################################\n#*****************  CONFIGURE START ITEMS  ************************\n###################################################################\n\nRUN echo \"service jenkins start\" >> /root/.bashrc\n\nCMD /bin/bash\n\n###################################################################\n#****************  EXPOSE APPLICATION PORTS  **********************\n###################################################################\n\n# Expose ports to other containers only\nEXPOSE 8080\n\n###################################################################\n#*******************  OPTIONAL / LEGACY  **************************\n###################################################################\n```\n\n<br><br>\n\n![Debian](http://clusterfrak.com/img/vendor/icons/debian-icon-64.png) Debian &nbsp; & &nbsp; ![Ubuntu](http://clusterfrak.com/img/vendor/icons/ubuntu-icon-64.png) Ubuntu\n\n-------\n\n<br>\n\n```dockerfile\n############################################################\n# Dockerfile to build Jenkins Base Container\n# Based on: debian:stretch\n############################################################\n\n# Set the base image to Debian Jessie Base\nFROM debian:stretch\n\n# File Author / Maintainer\nMAINTAINER Rich Nason [email protected]\n\n###################################################################\n#*************************  APP VERSIONS  *************************\n###################################################################\n\n \n###################################################################\n#***************  OVERRIDE ENABLED ENV VARIABLES  *****************\n###################################################################\n\n\n###################################################################\n#******************  ADD REQUIRED APP FILES  **********************\n###################################################################\n\n\n###################################################################\n#*******************  UPDATES & PRE-REQS  *************************\n###################################################################\n\n# Run Update, and install Jenkins\n# Clean, Update, Upgrade, and Install... then clear non English local data. openjdk-7-jdk\nRUN apt-get clean && \\\napt-get update && \\\napt-get -y upgrade && \\\napt-get -y install sudo git wget openssh-server net-tools gnupg2 openjdk-8-jdk && \\\napt-get clean && \\\nrm -fr /var/lib/apt/lists/*\n\n###################################################################\n#*******************  APPLICATION INSTALL  ************************\n###################################################################\n\n# Add Jenkins Repository\nRUN wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add - && \\\necho \"deb http://pkg.jenkins-ci.org/debian binary/\" >> /etc/apt/sources.list\n\nRUN apt-get clean && \\\napt-get update && \\\napt-get -y install jenkins && \\\napt-get clean && \\\nrm -fr /var/lib/apt/lists/*\n\n###################################################################\n#******************  POST DEPLOY CLEAN UP  ************************\n###################################################################\n\n# Make SSH Directory, Instruct Jenkins not to prompt for host key verification and set perms\nRUN mkdir /var/lib/jenkins/.ssh && \\\necho \"Host *\\n\\tStrictHostKeyChecking no\\n\" >> /var/lib/jenkins/.ssh/config\n\nRUN mkdir -p /var/cache/jenkins/war || exit 0 && \\\nmkdir /var/log/jenkins || exit 0 && \\\ncd /var/cache/jenkins/war && \\\njar -xvf /usr/lib/jenkins/jenkins.war && \\\nchmod a+w ./\n\n# Reset Permissions\nRUN chown -R jenkins:jenkins /var/cache/jenkins && \\\nchown jenkins:jenkins /var/log/jenkins && \\\nchmod -R 775 /var/cache/jenkins && \\\nchmod -R 777 /var/log/jenkins && \\\nchown -R jenkins:jenkins /var/lib/jenkins && \\\nchown -R jenkins:jenkins /var/lib/jenkins/.ssh && \\\nchmod -R 0700 /var/lib/jenkins/.ssh && \\\nchmod -R 0600 /var/lib/jenkins/.ssh/*\n\n###################################################################\n#*****************  CONFIGURE START ITEMS  ************************\n###################################################################\n\nRUN echo \"service jenkins start\" >> /root/.bashrc\n\nCMD /bin/bash\n\n###################################################################\n#****************  EXPOSE APPLICATION PORTS  **********************\n###################################################################\n\n# Expose ports to other containers only\nEXPOSE 8080\n\n###################################################################\n#*******************  OPTIONAL / LEGACY  **************************\n###################################################################\n\n\n```\n\n<br>\n\n__2. &nbsp;&nbsp; Build the Container:__\nOnce the Dockerfile has been saved, you can use it to build a docker image that can be deployed to any environment. We will use the &nbsp;<b>-t</b> &nbsp; flag in the docker build statement to specify an initial tag for the image.\n\n```bash\ndocker build -t lab/jenkins:latest .\n```\n\n<br>\n\n__NOTE:__ <br>\n1. The docker build statement should be ran from the same directory where the Dockerfile was saved. The &nbsp; <b>\"&nbsp;.&nbsp;\"</b> &nbsp; at the end of the build statement is required, as it tells the Docker daemon to look in the current directory for a file named <b>Dockerfile</b>. <br>\n\n2. Optionally you can use the &nbsp;<b>-f</b> &nbsp; flag to specify the location of the Dockerfile, in which case the Dockerfile does not need to be named Dockerfile as in the example of <code>docker build -t lab/jenkins:latest -f /tmp/myjenkinsfile</code> <br>\n\n3. The container will go through each step from the dockerfile being executed while the image is being built, and will display any console output generated from each step\n\n<br>\n\n__Response:__\n\n```bash\nRemoving intermediate container 98025c50a4d6\nStep 8/11 : RUN chown -R jenkins:jenkins /var/cache/jenkins && chown jenkins:jenkins /var/log/jenkins && chmod -R 775 /var/cache/jenkins && chmod -R 777 /var/log/jenkins && chown -R jenkins:jenkins /var/lib/jenkins && chown -R jenkins:jenkins /var/lib/jenkins/.ssh && chmod -R 0700 /var/lib/jenkins/.ssh && chmod -R 0600 /var/lib/jenkins/.ssh/*\n ---> Running in 3fae508bab9a\n ---> 14ea938c3412\nRemoving intermediate container 3fae508bab9a\nStep 9/11 : RUN echo \"service jenkins start\" >> /root/.bashrc\n ---> Running in dfa20be95388\n ---> 47181701e80c\nRemoving intermediate container dfa20be95388\nStep 10/11 : CMD /bin/bash\n ---> Running in 774ab02d3e59\n ---> 37da3651ee62\nRemoving intermediate container 774ab02d3e59\nStep 11/11 : EXPOSE 8080\n ---> Running in 7214641391fd\n ---> c59152af0b38\nRemoving intermediate container 7214641391fd\nSuccessfully built c59152af0b38\nSuccessfully tagged lab/jenkins:latest\n```\n\n<br>\n\n__3. &nbsp;&nbsp; Check the image:__\nWhen the image has been built successfully, Verify and Run the image. Once it's been ran, we can test its proper functionality by loading Jenkins in a browser. \n\n```bash\ndocker images\n```\n\n__Response:__\n\n```bash\nDesktop rnason$ docker images\nREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE\nlab/jenkins         latest              c59152af0b38        10 minutes ago      603MB\ncentos              6                   7ea307891843        5 weeks ago         194MB\n```\n\n<br>\n\n\n```bash\ndocker run -it -d --name jenkins -h jenkins -p 8080:8080 lab/jenkins\n```\n\n```bash\nDesktop rnason$ docker ps --all\nCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES\n6810ca84f9ff        lab/jenkins         \"/bin/sh -c /bin/bash\"   8 seconds ago       Up 7 seconds        0.0.0.0:8080->8080/tcp   jenkins\n```\n\n<br>\n\n__Docker Run Flags:__ <br>\nIn the run statement the following flags are used: <br>\n<b>-it</b> &nbsp; runs the container with an interactive tty.\n<b>--name</b> &nbsp; will set the container name.\n<b>-h</b> &nbsp; sets the hostname of the container.\n<b>-p</b> &nbsp; is used to publish host ports and map them back to the corresponding container ports. (8080:8080 = host:container)\n<b>-d</b> &nbsp; will launch the container in daemon mode. Without it, the container would launch, and put you directly into the shell. If you are put into the docker container shell, you can exit by pressing <code>CTL P + CTL Q</code>.\n\n<br>\n\n__4. &nbsp;&nbsp; Launch Jenkins:__\nOnce the container has been launched open a web browser and go to the host bound port of 8080. The container build is successful if Jenkins loads properly in the browser.\n\n<br>\n\n![Leeerooooy Jenkins!!!](http://clusterfrak.com/img/tuts/container_labs/cl101_jenkins_local_load.png)\n\n<br>\n\n\n__5. &nbsp;&nbsp; Cleanup:__\nAfter Jenkins has been successfully launched in the browser we can now clean up the running container. We use the <code>docker stop</code> command to stop the running instance, then use <code>docker rm</code> to remove the running instance. Neither of these actions affect the image that we created, only the running instance of that image on our local machine. Once the running instance has been stopped and removed, we can push our tested image to the repository for future deployment. \n\n<br>\n\n```bash\nDesktop rnason$ docker ps --all\nCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES\n9173a60282ed        lab/jenkins         \"/bin/sh -c /bin/bash\"   11 minutes ago      Up 11 minutes       0.0.0.0:8080->8080/tcp   jenkins\n```\n\n```bash\nDesktop rnason$ docker stop jenkins\njenkins\n```\n\n```bash\nDesktop rnason$ docker rm jenkins\njenkins\n```\n\n```bash\nDesktop rnason$ docker ps --all\nCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES\n```\n\n```bash\nDesktop rnason$ docker images\nREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE\nlab/jenkins         latest              c59152af0b38        10 minutes ago      603MB\ncentos              6                   7ea307891843        5 weeks ago         194MB\n```\n\n<br>\n\n\n## Pushing the Image to a Repository:\n-------\nOnce the image has been built successfully, we will need a place to store the completed image so that we can deploy it out to our infrastructure. There are several available options for storing images into repositories, for this exercise we will be using Amazon ECR:\n\n* [Docker Hub](https://hub.docker.com/)\n* [Quay Registry](https://quay.io/)\n* [Amazon ECR](https://aws.amazon.com/ecr/)\n\n<br>\n\n__1. &nbsp;&nbsp; Log into your AWS Account, and go to the ECS console:__\n\n![ECS](http://clusterfrak.com/img/tuts/container_labs/cl101_ecs_service.png)\n\n<br>\n\n__2. &nbsp;&nbsp; Click Getting Started:__\nIf you have never used ECS or ECR previously, you will be presented with the **Getting Started** page. Click the ![Getting_Started](http://clusterfrak.com/img/tuts/container_labs/cl101_ecs_gs_button.png) button. On the Getting Started screen, Uncheck the *Deploy a sample application onto an Amazon ECS Cluster* leaving only the *Store container images securely with Amazon ECR* option checked, and then press **Continue**.\n\n<br>\n\n![Getting Started](http://clusterfrak.com/img/tuts/container_labs/cl101_getting_started_select.png)\n\n<br>\n\n__3. &nbsp;&nbsp; Name the Registry:__\nNext we will need to name the registry. Type the name of your repository in the *Repository Name* field and then press **Next Step**.  \n\n<br>\n\n![Name Repo](http://clusterfrak.com/img/tuts/container_labs/cl101_repo_setup_01.png)\n\n<br>\n\n__Repository Name:__ <br>\nUse only lower case letters and no special symbols in the container registry naming convention.\n\n\n<br>\n\n__4. &nbsp;&nbsp; View Repo Instructions:__\nLast we will be presented with the information on how to log in and interact with our repository. Read through the instructions, and  press the **Done** button once done.\n\n<br>\n\n__Retrieving Login Instructions:__ <br>\nIf you need to see the instructions again in the future, you can do so by going to the registry in the <b><i>ECR Repositories</b></i> section of the console, selecting the repository, and clicking the <b><i>View Push Commands</b></i> button at the top of the repository view window.\n\n<br>\n\n![Repo Info](http://clusterfrak.com/img/tuts/container_labs/cl101_repo_login_info.png)\n\n<br>\n\n__5. &nbsp;&nbsp; Get Login Creds:__\nOn your workstation, we will now need to obtain the login command including the credentials for the ECR repository. In order to do so, perform the following command from your workstation. **(You will need the AWS CLI tools for this step)**  \n\n<br>\n\n```bash\naws ecr get-login --no-include-email --region us-west-2\n```\n\n__Response:__\n\n```bash\ndocker login -u AWS -p eyJwYXlsb2FkIjoiZFlXTzlqUVRkdmxCcjZpaU0xSC9kT292YkR4RmhHMjRsZU9FNGs0czlGa1hzbmtmS05Cb3NqRjRmNTlZY1B4dkc3MU51bFU5eHBNZm8wczhGSUVHb2ljNnVwc0kzNVhkYzhBYjNHT2Z1RTVRMjByK09nLy9yOFlIYWdxWURkU1lLY3FlREh6YzBkazVyakxqRHViVXVXNUZGMjFVQUJsUkFqL3FHbGhSdmFKVXpkSStXdDQ2NHhIQmVQQWZCWmZzY2Y3UGRlMXVMV1dXK0Z2TEFSQnVySFA0UU8yQWl0RnpvSnFabFQ3Qnd6QTkwRW04MUxRWERWanplN0daOFN2SFR3cVNjVnloaXF2bEVpYUN1Z1RKU0hXQlpySWlReUJjU3diZkJaVEJPdWE0MS9pTXJqQXd1c3ZKOWFjVnpTUXFxZGZKZWZ0OXJLTE9NV21YRG9VdzI3RHVhNWNKK1pUdW9WNnBIcVZLMld2QXIwR3Vod1F2UGU2SEx2L0U2YTBJOThmTmtkS1lZUE4wZXd1RmRnUWhQRy9RV0ZBek5DRml6bVJNa2lxZ0FBTnBacVdyTkVvUzJsWkh6K1JOaVBTOG5pSkxIMjlLV3VhcnhlanZwU2VoOEFJb3lIeGk2ZVRyb3FSaXc0Q1lDYkMyWThtQm1xT1dVb0RNTlhTM2dBY1NhNXlrSkhOaHdqRzl3WVdnMkVQam5rY2FIcFJ6Y0VOWGZvZllPQ0laZmtmRHhIS0FHcDY4R21UT0doK0RFMWpSL2pQOGI2UmtuUUFpUXg2Q2JENEtsWUdCcUJQN0szeFl6Nm9ORVUrQ0xVTDRERjh0L3ZtSENReE5GOVlZWlMxQ3o5alFuTjc0VjR2V0d3N0hXOXJ5MjhZTHJkYkNyTFh5K0UvUkJJQ2VEYWNnMmw4MzBaK0JlMHpyNkxHbGE1SjFxTk0wbTVvODNjZ3hvZG10bTAvSjRoWWRpN25lQVVqZUt4UWdZVFBhWGliTHYxNG5Gbmg2bi8wZDYwWitXZGI2a203M3NJdkxrV1FnUng5bHJGd0NkTDhlRjd6REJ5MlBqaVlUNllZTEtHMVQrQnhMaUtLMUZxd2ZNRmoyVjBqOW1Tc3laQ29jYnhQTVozOGJidnV3OHdmRlVjWDdjaXZxNXpwaWU3S2Zoc2t6dnpDOHVTUjBJWisyV29RampJV1dIdnc3MmxWU3NUQU05Y2xZRU0xaGxDUlZvbHE4ZGdaRkJVNytTdzcyQnVMcXI4Vks0STYwa3V6ZUxlbE5pVkIwdWtBaU9sUkZMNVRkWEFYMlA3ZkVNYThjSUgvUXp0eGIzcFhxZ1M5bGc0N1d2ZWpEVFlONXVBMTdIZVVpRFRseTZxT3pBV3d5K2Q5ZUFFNndWNkdmNmpCVEdmL0t0dFlYdThVUWdsY09pQ0djaVZoRWlocmhXejdieGUvMDJKeHZiN0lCVjZCTmJVUzEiLCJkYXRha2V5IjoiQVFFQkFIajZsYzRYSUp3LzdsbjBIYzAwRE1lazZHRXhIQ2JZNFJJcFRNQ0k1OEluVXdBQUFINHdmQVlKS29aSWh2Y05BUWNHb0c4d2JRSUJBREJvQmdrcWhraUc5dzBCQndFd0hnWUpZSVpJQVdVREJBRXVNQkVFRExjK0FTYjhvNjNIZTJtR2N3SUJFSUE3RG8rM3h0NXdTcXZMNy8zeUJhdEViRFlBQUIwN2hicm5kMG5lOXpjSWIwSXV6MUcwTFBtSEtsSTZ0NXdveE4rYlNHbklrOWVWUmFMSlFxdz0iLCJ2ZXJzaW9uIjoiMSIsInR5cGUiOiJEQVRBX0tFWSJ9 https://987303449646.dkr.ecr.us-west-2.amazonaws.com\n```\n\n<br>\n\n__ECR Region:__ <br>\nThe above command references the us-west-2 region. Ensure that the region reflect the proper region where you created your repository.\n\n<br>\n\n__6. &nbsp;&nbsp; Perform a docker login:__\nOn your workstation, use the returned command response to log into your docker repository.\n\n<br>\n\n```bash\ndocker login -u AWS -p {{YOUR_LOGIN_KEY}}\n```\n\n<br>\n\n__Example:__\n\n```bash\ndocker login -u AWS -p eyJwYXlsb2FkIjoiZFlXTzlqUVRkdmxCcjZpaU0xSC9kT292YkR4RmhHMjRsZU9FNGs0czlGa1hzbmtmS05Cb3NqRjRmNTlZY1B4dkc3MU51bFU5eHBNZm8wczhGSUVHb2ljNnVwc0kzNVhkYzhBYjNHT2Z1RTVRMjByK09nLy9yOFlIYWdxWURkU1lLY3FlREh6YzBkazVyakxqRHViVXVXNUZGMjFVQUJsUkFqL3FHbGhSdmFKVXpkSStXdDQ2NHhIQmVQQWZCWmZzY2Y3UGRlMXVMV1dXK0Z2TEFSQnVySFA0UU8yQWl0RnpvSnFabFQ3Qnd6QTkwRW04MUxRWERWanplN0daOFN2SFR3cVNjVnloaXF2bEVpYUN1Z1RKU0hXQlpySWlReUJjU3diZkJaVEJPdWE0MS9pTXJqQXd1c3ZKOWFjVnpTUXFxZGZKZWZ0OXJLTE9NV21YRG9VdzI3RHVhNWNKK1pUdW9WNnBIcVZLMld2QXIwR3Vod1F2UGU2SEx2L0U2YTBJOThmTmtkS1lZUE4wZXd1RmRnUWhQRy9RV0ZBek5DRml6bVJNa2lxZ0FBTnBacVdyTkVvUzJsWkh6K1JOaVBTOG5pSkxIMjlLV3VhcnhlanZwU2VoOEFJb3lIeGk2ZVRyb3FSaXc0Q1lDYkMyWThtQm1xT1dVb0RNTlhTM2dBY1NhNXlrSkhOaHdqRzl3WVdnMkVQam5rY2FIcFJ6Y0VOWGZvZllPQ0laZmtmRHhIS0FHcDY4R21UT0doK0RFMWpSL2pQOGI2UmtuUUFpUXg2Q2JENEtsWUdCcUJQN0szeFl6Nm9ORVUrQ0xVTDRERjh0L3ZtSENReE5GOVlZWlMxQ3o5alFuTjc0VjR2V0d3N0hXOXJ5MjhZTHJkYkNyTFh5K0UvUkJJQ2VEYWNnMmw4MzBaK0JlMHpyNkxHbGE1SjFxTk0wbTVvODNjZ3hvZG10bTAvSjRoWWRpN25lQVVqZUt4UWdZVFBhWGliTHYxNG5Gbmg2bi8wZDYwWitXZGI2a203M3NJdkxrV1FnUng5bHJGd0NkTDhlRjd6REJ5MlBqaVlUNllZTEtHMVQrQnhMaUtLMUZxd2ZNRmoyVjBqOW1Tc3laQ29jYnhQTVozOGJidnV3OHdmRlVjWDdjaXZxNXpwaWU3S2Zoc2t6dnpDOHVTUjBJWisyV29RampJV1dIdnc3MmxWU3NUQU05Y2xZRU0xaGxDUlZvbHE4ZGdaRkJVNytTdzcyQnVMcXI4Vks0STYwa3V6ZUxlbE5pVkIwdWtBaU9sUkZMNVRkWEFYMlA3ZkVNYThjSUgvUXp0eGIzcFhxZ1M5bGc0N1d2ZWpEVFlONXVBMTdIZVVpRFRseTZxT3pBV3d5K2Q5ZUFFNndWNkdmNmpCVEdmL0t0dFlYdThVUWdsY09pQ0djaVZoRWlocmhXejdieGUvMDJKeHZiN0lCVjZCTmJVUzEiLCJkYXRha2V5IjoiQVFFQkFIajZsYzRYSUp3LzdsbjBIYzAwRE1lazZHRXhIQ2JZNFJJcFRNQ0k1OEluVXdBQUFINHdmQVlKS29aSWh2Y05BUWNHb0c4d2JRSUJBREJvQmdrcWhraUc5dzBCQndFd0hnWUpZSVpJQVdVREJBRXVNQkVFRExjK0FTYjhvNjNIZTJtR2N3SUJFSUE3RG8rM3h0NXdTcXZMNy8zeUJhdEViRFlBQUIwN2hicm5kMG5lOXpjSWIwSXV6MUcwTFBtSEtsSTZ0NXdveE4rYlNHbklrOWVWUmFMSlFxdz0iLCJ2ZXJzaW9uIjoiMSIsInR5cGUiOiJEQVRBX0tFWSJ9 https://987303449646.dkr.ecr.us-west-2.amazonaws.com\n```\n\n__Response:__\n\n```bash\nLogin Succeeded\n```\n\n<br>\n\n__7. &nbsp;&nbsp; Tag the Image:__\nTag the image with the repository name given in the ECR command list. This will allow us to push the image to the newly created ECR repository. An image tag consists of 3 components, the server location, repository name, and image build. In the case of this example the repository name of 987303449646.dkr.ecr.us-west-2.amazonaws.com/jenkins:latest breaks down telling the docker dameon to push the image to the server DNS name of ***987303449646.dkr.ecr.us-west-2.amazonaws.com***, using the ***jenkins*** repository, and flag it as the ***latest*** build. \n\n<br>\n\n__Docker Image Tag:__ <br>\nEnsure when using the docker tag, and docker push statements that you replace the images tagged name, with the proper tag name from your own docker repository. The examples below reference the image and repository used during the creation of this lab, and are not valid tag or repository names.\n\n<br>\n\n```bash\ndocker tag lab/jenkins:latest {{REPO_ADDRESS}}/jenkins:latest\n```\n\n<br>\n\n__Example:__\n```bash\ndocker tag lab/jenkins:latest 987303449646.dkr.ecr.us-west-2.amazonaws.com/jenkins:latest\n```\n\n__Once tagged run a <code>docker images</code> command to verify that the image was tagged correctly:__\n\n```bash\ndocker images\nREPOSITORY                                             TAG                 IMAGE ID            CREATED             SIZE\n987303449646.dkr.ecr.us-west-2.amazonaws.com/jenkins   latest              a53da795f414        5 minutes ago       367MB\nlab/jenkins                                            latest              a53da795f414        5 minutes ago       367MB\ndebian\n```\n\n<br>\n\n__8. &nbsp;&nbsp; Push the Image:__\nNow that we have both the Docker image and repository created, and are logged into the repository, we can now push the image to the repository.  \n\n<br>\n\n```bash\ndocker push {{REPO_ADDRESS}}/jenkins\n```\n\n<br>\n\n__Example:__\n```bash\ndocker push 987303449646.dkr.ecr.us-west-2.amazonaws.com/jenkins\n```\n\n__Response:__\n```bash\nThe push refers to a repository [987303449646.dkr.ecr.us-west-2.amazonaws.com/jenkins]\n607f9d534485: Pushed \n32eff9aeeadf: Pushed \ned030e7c9ba6: Pushed \n7b144cce2860: Pushed \nc77c4213307b: Pushed \nc8cf41c44d97: Pushed \n5c86a415e035: Pushed \n45f0f161f074: Pushed \nlatest: digest: sha256:95de5123e73b78c41eb79e7b861b3726eb25c7735bb05a4488614f9380697202 size: 1989\n```\n\n<br>\n\n__9. &nbsp;&nbsp; Check the ECR Registry:__\nOnce the image has been successfully pushed to the registry, we can verify it by going to the ECS/ECR console.\n\n<br>\n\n![ECR Image](http://clusterfrak.com/img/tuts/container_labs/cl101_repo_push.png)\n\n<br>\n\n## Deploying the Image to a Docker host:\n-------\n\n__1. &nbsp;&nbsp; Log into your EC2 Docker Host:__\nThis next section will cover deploying the docker image to a standalone Docker host, running on an Amazon EC2 Instance. SSH into your host, and ensure that Docker is running properly by issuing a ```docker info``` command.\n\n<br>\n\n```bash\nDesktop rnason$ ssh [email protected]\nThe authenticity of host '54.174.221.75 (54.174.221.75)' can't be established.\nECDSA key fingerprint is SHA256:aaYjORsif3hmdbIHEBepYaQcvebOvEG+QJ3oHZzJZJo.\nAre you sure you want to continue connecting (yes/no)? yes\nWarning: Permanently added '54.174.221.75' (ECDSA) to the list of known hosts.\n\n       __|  __|_  )\n       _|  (     /   Amazon Linux AMI\n      ___|\\___|___|\n\nhttps://aws.amazon.com/amazon-linux-ami/2017.03-release-notes/\n8 package(s) needed for security, out of 8 available\nRun \"sudo yum update\" to apply all updates.\n[ec2-user@ip-172-31-1-61 ~]$ sudo su -\n```\n\n<br>\n\n__2. &nbsp;&nbsp; Test Docker:__\nOnce successfully logged into docker, test the docker daemon to ensure its installed and running properly using the following few docker commands:\n\n<br>\n\n```bash\n[root@ip-172-31-1-61 ~]# docker info\nContainers: 0\n Running: 0\n Paused: 0\n Stopped: 0\nImages: 0\nServer Version: 17.03.2-ce\nStorage Driver: overlay2\n Backing Filesystem: extfs\n Supports d_type: true\n Native Overlay Diff: true\nLogging Driver: json-file\nCgroup Driver: cgroupfs\nPlugins: \n Volume: local\n Network: bridge host macvlan null overlay\nSwarm: inactive\nRuntimes: runc\nDefault Runtime: runc\nInit Binary: docker-init\ncontainerd version: 4ab9917febca54791c5f071a9d1f404867857fcc\nrunc version: 54296cf40ad8143b62dbcaa1d90e520a2136ddfe\ninit version: 949e6fa\nSecurity Options:\n seccomp\n  Profile: default\nKernel Version: 4.9.38-16.35.amzn1.x86_64\nOperating System: Amazon Linux AMI 2017.03\nOSType: linux\nArchitecture: x86_64\nCPUs: 1\nTotal Memory: 993.5 MiB\nName: ip-172-31-1-61\nID: M3IQ:2HUY:R375:MGSN:UW7C:A76W:74ZW:4DEG:L5L5:QPW7:IRYR:UJYK\nDocker Root Dir: /var/lib/docker\nDebug Mode (client): false\nDebug Mode (server): false\nRegistry: https://index.docker.io/v1/\nExperimental: false\nInsecure Registries:\n 127.0.0.0/8\nLive Restore Enabled: false\n```\n\n```bash\n[root@ip-172-31-1-61 ~]# docker ps --all\nCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES\n```\n\n<br>\n\n__3. &nbsp;&nbsp; Log into ECR:__\nNext we need to use the ```docker login``` command previously obtained to log into the ECR registry from our new docker host. This will allow us access to the image that we built and pushed in the previous section of the lab.\n\n<br>\n\n<div class='alert alert-danger'>\n<i class='fa fa-info-circle'></i> &nbsp;&nbsp; Docker Image Tag: <br>\nEnsure when using the docker tag, and docker push statements that you replace the images tagged name, with the proper tag name from your own docker repository. The examples below reference the image and repository used during the creation of this lab, and are not valid tag or repository names. </div>\n\n<br>\n\n```bash\ndocker login -u AWS -p {{YOUR_LOGIN_KEY}}\n```\n\n<br>\n\n__Example:__\n\n```bash\ndocker login -u AWS -p eyJwYXlsb2FkIjoiZFlXTzlqUVRkdmxCcjZpaU0xSC9kT292YkR4RmhHMjRsZU9FNGs0czlGa1hzbmtmS05Cb3NqRjRmNTlZY1B4dkc3MU51bFU5eHBNZm8wczhGSUVHb2ljNnVwc0kzNVhkYzhBYjNHT2Z1RTVRMjByK09nLy9yOFlIYWdxWURkU1lLY3FlREh6YzBkazVyakxqRHViVXVXNUZGMjFVQUJsUkFqL3FHbGhSdmFKVXpkSStXdDQ2NHhIQmVQQWZCWmZzY2Y3UGRlMXVMV1dXK0Z2TEFSQnVySFA0UU8yQWl0RnpvSnFabFQ3Qnd6QTkwRW04MUxRWERWanplN0daOFN2SFR3cVNjVnloaXF2bEVpYUN1Z1RKU0hXQlpySWlReUJjU3diZkJaVEJPdWE0MS9pTXJqQXd1c3ZKOWFjVnpTUXFxZGZKZWZ0OXJLTE9NV21YRG9VdzI3RHVhNWNKK1pUdW9WNnBIcVZLMld2QXIwR3Vod1F2UGU2SEx2L0U2YTBJOThmTmtkS1lZUE4wZXd1RmRnUWhQRy9RV0ZBek5DRml6bVJNa2lxZ0FBTnBacVdyTkVvUzJsWkh6K1JOaVBTOG5pSkxIMjlLV3VhcnhlanZwU2VoOEFJb3lIeGk2ZVRyb3FSaXc0Q1lDYkMyWThtQm1xT1dVb0RNTlhTM2dBY1NhNXlrSkhOaHdqRzl3WVdnMkVQam5rY2FIcFJ6Y0VOWGZvZllPQ0laZmtmRHhIS0FHcDY4R21UT0doK0RFMWpSL2pQOGI2UmtuUUFpUXg2Q2JENEtsWUdCcUJQN0szeFl6Nm9ORVUrQ0xVTDRERjh0L3ZtSENReE5GOVlZWlMxQ3o5alFuTjc0VjR2V0d3N0hXOXJ5MjhZTHJkYkNyTFh5K0UvUkJJQ2VEYWNnMmw4MzBaK0JlMHpyNkxHbGE1SjFxTk0wbTVvODNjZ3hvZG10bTAvSjRoWWRpN25lQVVqZUt4UWdZVFBhWGliTHYxNG5Gbmg2bi8wZDYwWitXZGI2a203M3NJdkxrV1FnUng5bHJGd0NkTDhlRjd6REJ5MlBqaVlUNllZTEtHMVQrQnhMaUtLMUZxd2ZNRmoyVjBqOW1Tc3laQ29jYnhQTVozOGJidnV3OHdmRlVjWDdjaXZxNXpwaWU3S2Zoc2t6dnpDOHVTUjBJWisyV29RampJV1dIdnc3MmxWU3NUQU05Y2xZRU0xaGxDUlZvbHE4ZGdaRkJVNytTdzcyQnVMcXI4Vks0STYwa3V6ZUxlbE5pVkIwdWtBaU9sUkZMNVRkWEFYMlA3ZkVNYThjSUgvUXp0eGIzcFhxZ1M5bGc0N1d2ZWpEVFlONXVBMTdIZVVpRFRseTZxT3pBV3d5K2Q5ZUFFNndWNkdmNmpCVEdmL0t0dFlYdThVUWdsY09pQ0djaVZoRWlocmhXejdieGUvMDJKeHZiN0lCVjZCTmJVUzEiLCJkYXRha2V5IjoiQVFFQkFIajZsYzRYSUp3LzdsbjBIYzAwRE1lazZHRXhIQ2JZNFJJcFRNQ0k1OEluVXdBQUFINHdmQVlKS29aSWh2Y05BUWNHb0c4d2JRSUJBREJvQmdrcWhraUc5dzBCQndFd0hnWUpZSVpJQVdVREJBRXVNQkVFRExjK0FTYjhvNjNIZTJtR2N3SUJFSUE3RG8rM3h0NXdTcXZMNy8zeUJhdEViRFlBQUIwN2hicm5kMG5lOXpjSWIwSXV6MUcwTFBtSEtsSTZ0NXdveE4rYlNHbklrOWVWUmFMSlFxdz0iLCJ2ZXJzaW9uIjoiMSIsInR5cGUiOiJEQVRBX0tFWSJ9 https://987303449646.dkr.ecr.us-west-2.amazonaws.com\n```\n\n__Response:__\n\n```bash\nLogin Succeeded\n```\n\n<br>\n\n\n__4. &nbsp;&nbsp; Deploy the Image:__\nOnce logged into ECR, we can now run the new image that we created earlier. There are 2 ways to get the image onto the new deployment host, The first would be to do a ```docker pull```, which would simply pull the image down to the host, requiring a second ```docker run``` command to actually run it. With Docker however, the first step isn't required if we are running the image for the first time. Simply using the ```docker run``` command will perform both steps automatically. \n\n<br>\n\n```bash\ndocker run -it -d --name jenkins -h jenkins -p 8080:8080 {{REPO_ADDRESS}}/jenkins:latest\n```\n\n<br>\n\n__Example:__\n\n```bash\ndocker run -it -d --name jenkins -h jenkins -p 8080:8080 987303449646.dkr.ecr.us-west-2.amazonaws.com/jenkins:latest\n```\n\n__Response:__\n\n```bash\nUnable to find image '987303449646.dkr.ecr.us-west-2.amazonaws.com/jenkins:latest' locally\nlatest: Pulling from jenkins\n40ae7ce86d93: Pull complete \n7259c83d6d97: Pull complete \n2c01368e2eff: Pull complete \nda849b4ff22f: Pull complete \n2886258060bf: Pull complete \na8c599f863b6: Pull complete \naffea2dd0686: Pull complete \n8648a17db0a5: Pull complete \nDigest: sha256:95de5123e73b78c41eb79e7b861b3726eb25c7735bb05a4488614f9380697202\nStatus: Downloaded newer image for 987303449646.dkr.ecr.us-west-2.amazonaws.com/jenkins:latest\n4d1a05e8341e764f2d4b47d04f47f16e07907846ae11d4315bc885be6258e720\n```\n\n__Once the runs statement has completed, use the <code> docker ps </code> command to verify that the container is running and that the status is <i>up</i>__\n\n```bash\n[root@ip-172-31-1-61 ~]# docker ps --all\nCONTAINER ID        IMAGE                                                         COMMAND                  CREATED             STATUS              PORTS                    NAMES\n4d1a05e8341e        987303449646.dkr.ecr.us-west-2.amazonaws.com/jenkins:latest   \"/bin/sh -c /bin/bash\"   8 minutes ago       Up 8 minutes        0.0.0.0:8080->8080/tcp   jenkins\n```\n\n<br>\n\n__5. &nbsp;&nbsp; Test the Deployment:__\nOnce the run has completed, we can test the deployment by opening a browser and going to the IP of the instance on port 8080. The Jenkins screen should appear.\n\n<br>\n\n![Leeeerooooy Jenkins !!!!](http://clusterfrak.com/img/tuts/container_labs/cl101_jenkins_load.png)\n\n<br><br>\n\n## Resources:\n-------\n\n### Lab Pre-Req Packer File:\n\n<br>\n\n__Packer File:__\n\n```json\n{\n  \"builders\": [{\n    \"type\": \"amazon-ebs\",\n    \"access_key\": \"{{user `aws_access_key`}}\",\n    \"secret_key\": \"{{user `aws_secret_key`}}\",\n    \"region\": \"{{user `region`}}\",\n    \"source_ami\": \"{{user `ami`}}\",\n    \"instance_type\": \"{{user `instance_type`}}\",\n    \"ami_name\": \"{{user `ami_name`}}-{{timestamp}}\",\n    \"ami_description\": \"{{user `ami_description`}}\",\n    \"availability_zone\": \"{{user `availability_zone`}}\",\n    \"vpc_id\": \"{{user `vpc_id`}}\",\n    \"subnet_id\": \"{{user `subnet_id`}}\",\n    \"security_group_id\": \"{{user `security_group_id`}}\",\n    \"ssh_keypair_name\": \"{{user `ssh_keypair_name`}}\",\n    \"ssh_agent_auth\": true,\n    \"ssh_username\": \"{{user `ssh_username`}}\",\n    \"associate_public_ip_address\": true,\n    \"ssh_private_ip\": false,\n    \"tags\": {\n        \"Name\": \"{{user `tag_name`}}\",\n        \"OS_Version\": \"{{user `tag_osver`}}\"\n    }\n  }],\n\n  \"provisioners\": [\n    {\n      \"type\": \"shell\",\n      \"inline\": [\n        \"sudo yum clean all\",\n        \"sudo yum -y update\",\n        \"sudo yum install -y docker jq\",\n        \"sudo chkconfig docker on\",\n        \"sudo /etc/init.d/docker start\",\n        \"sudo pip install awscli\",\n        \"sudo curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl\",\n        \"sudo mv kubectl /usr/bin/\",\n        \"sudo chmod +x /usr/bin/kubectl\",\n        \"sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose\",\n        \"sudo chmod +x /usr/local/bin/docker-compose\"\n      ]\n    }\n]}\n```\n\n<br>\n\n__Packer Build-Vars File:__\n\n```json\n{\n    \"aws_access_key\": \"ABCDEFGHIJKLMNOPQRST\",\n    \"aws_secret_key\": \"abcdefghijklmnopqrstuvwxyz1234567890abcd\",\n    \"instance_type\": \"t2.small\",\n    \"region\": \"us-east-2\",\n    \"availability_zone\": \"us-east-2a\",\n    \"ami\": \"ami-ea87a78f\",\n    \"vpc_id\": \"vpc-y12345ba\",\n    \"subnet_id\": \"subnet-12a3456b\",\n    \"security_group_id\": \"sg-a6ca00cd\",\n    \"ssh_keypair_name\": \"MyKey\",\n    \"ssh_username\": \"ec2-user\",\n    \"ami_name\": \"Container-Lab\",\n    \"ami_description\": \"Image with all of the tools required to run ECS/K8 Labs\",\n    \"tag_name\": \"Container-Lab\",\n    \"tag_osver\": \"Amazon Linux\"\n}\n```\n\n<br>\n\n__Packer Build Command:__\n\n```bash\npacker build -var-file=buildvars.json container_lab.json\n```",
      "json_metadata": "{\"tags\":[\"docker\"],\"image\":[\"http://clusterfrak.com/img/vendor/docker.png\",\"http://clusterfrak.com/img/tuts/container_labs/cl101_IAM_permissions.png\",\"http://clusterfrak.com/img/tuts/container_labs/cl101_putty_load.png\",\"http://clusterfrak.com/img/tuts/container_labs/cl101_save_key_no_pass.png\",\"http://clusterfrak.com/img/tuts/container_labs/cl101_save_private_key.png\",\"http://clusterfrak.com/img/tuts/container_labs/cl101_save_pub_key.png\",\"http://clusterfrak.com/img/tuts/container_labs/cl101_sg.png\",\"http://clusterfrak.com/img/vendor/icons/redhat-icon-64.png\",\"http://clusterfrak.com/img/vendor/icons/centos-icon-64.png\",\"http://clusterfrak.com/img/vendor/icons/amazonlinux-icon-64.png\",\"http://clusterfrak.com/img/vendor/icons/debian-icon-64.png\",\"http://clusterfrak.com/img/vendor/icons/ubuntu-icon-64.png\",\"http://clusterfrak.com/img/tuts/container_labs/cl101_jenkins_local_load.png\",\"http://clusterfrak.com/img/tuts/container_labs/cl101_ecs_service.png\",\"http://clusterfrak.com/img/tuts/container_labs/cl101_ecs_gs_button.png\",\"http://clusterfrak.com/img/tuts/container_labs/cl101_getting_started_select.png\",\"http://clusterfrak.com/img/tuts/container_labs/cl101_repo_setup_01.png\",\"http://clusterfrak.com/img/tuts/container_labs/cl101_repo_login_info.png\",\"http://clusterfrak.com/img/tuts/container_labs/cl101_repo_push.png\",\"http://clusterfrak.com/img/tuts/container_labs/cl101_jenkins_load.png\"],\"links\":[\"https://www.docker.com/\",\"https://www.docker.com/docker-mac\",\"https://www.docker.com/docker-windows\",\"https://github.com/moby/moby/releases\",\"https://www.python.org/downloads/\",\"https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe\",\"https://the.earth.li/~sgtatham/putty/latest/w64/puttygen.exe\",\"https://hub.docker.com/\",\"https://quay.io/\",\"https://aws.amazon.com/ecr/\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
2017/08/08 22:07:12
parent authorrnason
parent permlinkethereum-aws-miner-node-installation-and-setup
authormkaya
permlinkre-rnason-ethereum-aws-miner-node-installation-and-setup-20170808t220713924z
title
bodyThanks for the very detailed guide mate. What is the cost and benefit of using AWS to mine Ether at the moment?
json metadata{"tags":["linux"],"app":"steemit/0.1"}
Transaction InfoBlock #14406502/Trx 1f7c9b0a34ffe94084cb748db44f6538f7ad62e2
View Raw JSON Data
{
  "trx_id": "1f7c9b0a34ffe94084cb748db44f6538f7ad62e2",
  "block": 14406502,
  "trx_in_block": 43,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-08T22:07:12",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "ethereum-aws-miner-node-installation-and-setup",
      "author": "mkaya",
      "permlink": "re-rnason-ethereum-aws-miner-node-installation-and-setup-20170808t220713924z",
      "title": "",
      "body": "Thanks for the very detailed guide mate.\n\nWhat is the cost and benefit of using AWS to mine Ether at the moment?",
      "json_metadata": "{\"tags\":[\"linux\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/08 22:06:45
votermkaya
authorrnason
permlinkethereum-aws-miner-node-installation-and-setup
weight10000 (100.00%)
Transaction InfoBlock #14406493/Trx 8b4892f97fb73b88d59b9e136687f1cdbf01f506
View Raw JSON Data
{
  "trx_id": "8b4892f97fb73b88d59b9e136687f1cdbf01f506",
  "block": 14406493,
  "trx_in_block": 23,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-08T22:06:45",
  "op": [
    "vote",
    {
      "voter": "mkaya",
      "author": "rnason",
      "permlink": "ethereum-aws-miner-node-installation-and-setup",
      "weight": 10000
    }
  ]
}
2017/08/07 00:44:21
parent authorrnason
parent permlinkgitlab-docker-container-registry-configuration
authorgihudawbia
permlinkre-rnason-gitlab-docker-container-registry-configuration-20170807t004446361z
title
bodyGreat article
json metadata{"tags":["devops"],"app":"steemit/0.1"}
Transaction InfoBlock #14352121/Trx 7dcbc0cbd6e5994f5d3dd34aec905c4733f7165f
View Raw JSON Data
{
  "trx_id": "7dcbc0cbd6e5994f5d3dd34aec905c4733f7165f",
  "block": 14352121,
  "trx_in_block": 11,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-07T00:44:21",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "gitlab-docker-container-registry-configuration",
      "author": "gihudawbia",
      "permlink": "re-rnason-gitlab-docker-container-registry-configuration-20170807t004446361z",
      "title": "",
      "body": "Great article",
      "json_metadata": "{\"tags\":[\"devops\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/07 00:22:15
parent authorrnason
parent permlinksonarqube-server-installation
authorbeautotifo
permlinkre-rnason-sonarqube-server-installation-20170807t002239865z
title
bodyInteresting thoughts
json metadata{"tags":["linux"],"app":"steemit/0.1"}
Transaction InfoBlock #14351680/Trx 7ac575d63db3727e83acb65de9175db6c5f5c931
View Raw JSON Data
{
  "trx_id": "7ac575d63db3727e83acb65de9175db6c5f5c931",
  "block": 14351680,
  "trx_in_block": 18,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-07T00:22:15",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "sonarqube-server-installation",
      "author": "beautotifo",
      "permlink": "re-rnason-sonarqube-server-installation-20170807t002239865z",
      "title": "",
      "body": "Interesting thoughts",
      "json_metadata": "{\"tags\":[\"linux\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 23:50:30
parent authorrnason
parent permlinkpowershell-code-snippits-and-commands
authornewsnuderle
permlinkre-rnason-powershell-code-snippits-and-commands-20170806t235055851z
title
bodyExcellent write!
json metadata{"tags":["powershell"],"app":"steemit/0.1"}
Transaction InfoBlock #14351046/Trx 3272e45dca468789d258b7657e211ef17a570bb2
View Raw JSON Data
{
  "trx_id": "3272e45dca468789d258b7657e211ef17a570bb2",
  "block": 14351046,
  "trx_in_block": 14,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T23:50:30",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "powershell-code-snippits-and-commands",
      "author": "newsnuderle",
      "permlink": "re-rnason-powershell-code-snippits-and-commands-20170806t235055851z",
      "title": "",
      "body": "Excellent write!",
      "json_metadata": "{\"tags\":[\"powershell\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 22:25:12
parent authorrnason
parent permlinknetgear-readynas-telnet-recovery-procedure
authoruqabhiga
permlinkre-rnason-netgear-readynas-telnet-recovery-procedure-20170806t222529848z
title
bodyPerfectly!
json metadata{"tags":["netgear"],"app":"steemit/0.1"}
Transaction InfoBlock #14349344/Trx 8c66ecc5af6115473156bec60b396ae8f97e2125
View Raw JSON Data
{
  "trx_id": "8c66ecc5af6115473156bec60b396ae8f97e2125",
  "block": 14349344,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T22:25:12",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "netgear-readynas-telnet-recovery-procedure",
      "author": "uqabhiga",
      "permlink": "re-rnason-netgear-readynas-telnet-recovery-procedure-20170806t222529848z",
      "title": "",
      "body": "Perfectly!",
      "json_metadata": "{\"tags\":[\"netgear\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 22:21:45
parent authorrnason
parent permlinkinstalling-the-esx-ui-on-esxi-6
authorsupaddloro
permlinkre-rnason-installing-the-esx-ui-on-esxi-6-20170806t222209663z
title
bodyWell described
json metadata{"tags":["linux"],"app":"steemit/0.1"}
Transaction InfoBlock #14349275/Trx 8b4e2920e2451b37db917b3a7dd6ed235d2b6c1b
View Raw JSON Data
{
  "trx_id": "8b4e2920e2451b37db917b3a7dd6ed235d2b6c1b",
  "block": 14349275,
  "trx_in_block": 22,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T22:21:45",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "installing-the-esx-ui-on-esxi-6",
      "author": "supaddloro",
      "permlink": "re-rnason-installing-the-esx-ui-on-esxi-6-20170806t222209663z",
      "title": "",
      "body": "Well described",
      "json_metadata": "{\"tags\":[\"linux\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 21:52:18
parent authorrnason
parent permlinkopenfiler-server-installation
authormeysolemon
permlinkre-rnason-openfiler-server-installation-20170806t215244301z
title
bodyGood!
json metadata{"tags":["linux"],"app":"steemit/0.1"}
Transaction InfoBlock #14348686/Trx d7abeeefc553f97be80d0b59a7acbcdfeb0ea170
View Raw JSON Data
{
  "trx_id": "d7abeeefc553f97be80d0b59a7acbcdfeb0ea170",
  "block": 14348686,
  "trx_in_block": 17,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T21:52:18",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "openfiler-server-installation",
      "author": "meysolemon",
      "permlink": "re-rnason-openfiler-server-installation-20170806t215244301z",
      "title": "",
      "body": "Good!",
      "json_metadata": "{\"tags\":[\"linux\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 21:34:15
parent authorrnason
parent permlinkfreeipa-server-installation
authormizaceve
permlinkre-rnason-freeipa-server-installation-20170806t213437612z
title
bodyInteresting thoughts
json metadata{"tags":["sysops"],"app":"steemit/0.1"}
Transaction InfoBlock #14348325/Trx 9d299f798062c316525b427900767da22d324e61
View Raw JSON Data
{
  "trx_id": "9d299f798062c316525b427900767da22d324e61",
  "block": 14348325,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T21:34:15",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "freeipa-server-installation",
      "author": "mizaceve",
      "permlink": "re-rnason-freeipa-server-installation-20170806t213437612z",
      "title": "",
      "body": "Interesting thoughts",
      "json_metadata": "{\"tags\":[\"sysops\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 21:25:54
parent authorrnason
parent permlinksetup-digital-ocean-droplet-to-run-ansible-with-userdata
authorenelarin
permlinkre-rnason-setup-digital-ocean-droplet-to-run-ansible-with-userdata-20170806t212615899z
title
bodyGreat article
json metadata{"tags":["digitalocean"],"app":"steemit/0.1"}
Transaction InfoBlock #14348158/Trx e8676182b64e62c2de146b20afd30b33b0262574
View Raw JSON Data
{
  "trx_id": "e8676182b64e62c2de146b20afd30b33b0262574",
  "block": 14348158,
  "trx_in_block": 7,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T21:25:54",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "setup-digital-ocean-droplet-to-run-ansible-with-userdata",
      "author": "enelarin",
      "permlink": "re-rnason-setup-digital-ocean-droplet-to-run-ansible-with-userdata-20170806t212615899z",
      "title": "",
      "body": "Great article",
      "json_metadata": "{\"tags\":[\"digitalocean\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 21:25:18
parent authorrnason
parent permlinkaws-solution-architect-associate-exam-notes-part-2
authorcreekepadfi
permlinkre-rnason-aws-solution-architect-associate-exam-notes-part-2-20170806t212541115z
title
bodyThanks for the good article
json metadata{"tags":["aws"],"app":"steemit/0.1"}
Transaction InfoBlock #14348147/Trx f9d42760de6fd68f774a342b4d3c8ac97c599848
View Raw JSON Data
{
  "trx_id": "f9d42760de6fd68f774a342b4d3c8ac97c599848",
  "block": 14348147,
  "trx_in_block": 10,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T21:25:18",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "aws-solution-architect-associate-exam-notes-part-2",
      "author": "creekepadfi",
      "permlink": "re-rnason-aws-solution-architect-associate-exam-notes-part-2-20170806t212541115z",
      "title": "",
      "body": "Thanks for the good article",
      "json_metadata": "{\"tags\":[\"aws\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 20:47:27
parent authorrnason
parent permlinkaws-developer-associate-exam-notes-part-2
authorcaleraha
permlinkre-rnason-aws-developer-associate-exam-notes-part-2-20170806t204751115z
title
bodyGreat article
json metadata{"tags":["aws"],"app":"steemit/0.1"}
Transaction InfoBlock #14347390/Trx 3ba708aa5d39b5761b8ffffe35a45390a175958f
View Raw JSON Data
{
  "trx_id": "3ba708aa5d39b5761b8ffffe35a45390a175958f",
  "block": 14347390,
  "trx_in_block": 5,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T20:47:27",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "aws-developer-associate-exam-notes-part-2",
      "author": "caleraha",
      "permlink": "re-rnason-aws-developer-associate-exam-notes-part-2-20170806t204751115z",
      "title": "",
      "body": "Great article",
      "json_metadata": "{\"tags\":[\"aws\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 19:00:48
parent authorrnason
parent permlinkgitlab-docker-container-registry-login-failure
authorriemancohig
permlinkre-rnason-gitlab-docker-container-registry-login-failure-20170806t190110239z
title
bodyBeautiful post
json metadata{"tags":["gitlab"],"app":"steemit/0.1"}
Transaction InfoBlock #14345259/Trx 5ac4d49a5b811a6ad87ba8e47b4b8fd85277551f
View Raw JSON Data
{
  "trx_id": "5ac4d49a5b811a6ad87ba8e47b4b8fd85277551f",
  "block": 14345259,
  "trx_in_block": 6,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T19:00:48",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "gitlab-docker-container-registry-login-failure",
      "author": "riemancohig",
      "permlink": "re-rnason-gitlab-docker-container-registry-login-failure-20170806t190110239z",
      "title": "",
      "body": "Beautiful post",
      "json_metadata": "{\"tags\":[\"gitlab\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 18:56:18
parent authorrnason
parent permlinkaws-solution-architect-associate-exam-notes-part-3
authorplanphotasa
permlinkre-rnason-aws-solution-architect-associate-exam-notes-part-3-20170806t185640349z
title
bodyBeautiful post
json metadata{"tags":["aws"],"app":"steemit/0.1"}
Transaction InfoBlock #14345169/Trx cc2fa348409234109b6dd1231eea66cfefe8f158
View Raw JSON Data
{
  "trx_id": "cc2fa348409234109b6dd1231eea66cfefe8f158",
  "block": 14345169,
  "trx_in_block": 8,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T18:56:18",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "aws-solution-architect-associate-exam-notes-part-3",
      "author": "planphotasa",
      "permlink": "re-rnason-aws-solution-architect-associate-exam-notes-part-3-20170806t185640349z",
      "title": "",
      "body": "Beautiful post",
      "json_metadata": "{\"tags\":[\"aws\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 18:51:51
parent authorrnason
parent permlinkyum-repository-server-on-nginx-installation
authorwrontertele
permlinkre-rnason-yum-repository-server-on-nginx-installation-20170806t185214631z
title
bodyExcellent
json metadata{"tags":["linux"],"app":"steemit/0.1"}
Transaction InfoBlock #14345080/Trx 154ac147eee8f7aa547d1167dc7e7156efcf78d0
View Raw JSON Data
{
  "trx_id": "154ac147eee8f7aa547d1167dc7e7156efcf78d0",
  "block": 14345080,
  "trx_in_block": 19,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T18:51:51",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "yum-repository-server-on-nginx-installation",
      "author": "wrontertele",
      "permlink": "re-rnason-yum-repository-server-on-nginx-installation-20170806t185214631z",
      "title": "",
      "body": "Excellent",
      "json_metadata": "{\"tags\":[\"linux\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 18:15:36
parent authorrnason
parent permlinkinstalling-nginx-using-ansible
authorcabtalema
permlinkre-rnason-installing-nginx-using-ansible-20170806t181600218z
title
bodyInteresting thoughts
json metadata{"tags":["ansible"],"app":"steemit/0.1"}
Transaction InfoBlock #14344356/Trx fcec9f6cfa79ce788e1c8f1b3747308f64cece6e
View Raw JSON Data
{
  "trx_id": "fcec9f6cfa79ce788e1c8f1b3747308f64cece6e",
  "block": 14344356,
  "trx_in_block": 37,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T18:15:36",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "installing-nginx-using-ansible",
      "author": "cabtalema",
      "permlink": "re-rnason-installing-nginx-using-ansible-20170806t181600218z",
      "title": "",
      "body": "Interesting thoughts",
      "json_metadata": "{\"tags\":[\"ansible\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 18:06:39
parent authorrnason
parent permlinkmigrating-a-repo-from-svn-to-git
authorcredinvergau
permlinkre-rnason-migrating-a-repo-from-svn-to-git-20170806t180702071z
title
bodyPerfectly!
json metadata{"tags":["devops"],"app":"steemit/0.1"}
Transaction InfoBlock #14344177/Trx 380577bb9079dbe0899a098a52b852194f1e379c
View Raw JSON Data
{
  "trx_id": "380577bb9079dbe0899a098a52b852194f1e379c",
  "block": 14344177,
  "trx_in_block": 27,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T18:06:39",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "migrating-a-repo-from-svn-to-git",
      "author": "credinvergau",
      "permlink": "re-rnason-migrating-a-repo-from-svn-to-git-20170806t180702071z",
      "title": "",
      "body": "Perfectly!",
      "json_metadata": "{\"tags\":[\"devops\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 17:58:48
parent authorrnason
parent permlinkfreeipa-client-installation
authorquizutobas
permlinkre-rnason-freeipa-client-installation-20170806t175909547z
title
bodyGood thoughts
json metadata{"tags":["sysops"],"app":"steemit/0.1"}
Transaction InfoBlock #14344020/Trx b3aca2cd635b374cecbdedb941a9b2188cc916b0
View Raw JSON Data
{
  "trx_id": "b3aca2cd635b374cecbdedb941a9b2188cc916b0",
  "block": 14344020,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T17:58:48",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "freeipa-client-installation",
      "author": "quizutobas",
      "permlink": "re-rnason-freeipa-client-installation-20170806t175909547z",
      "title": "",
      "body": "Good thoughts",
      "json_metadata": "{\"tags\":[\"sysops\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 17:43:33
parent authorrnason
parent permlinkgenerate-a-self-signed-certificate-on-linux
authortromatbranad
permlinkre-rnason-generate-a-self-signed-certificate-on-linux-20170806t174352655z
title
bodyGreat article
json metadata{"tags":["sysops"],"app":"steemit/0.1"}
Transaction InfoBlock #14343715/Trx c23e54d44eec1bf1e3079b6bc9af7aebd6c6aa57
View Raw JSON Data
{
  "trx_id": "c23e54d44eec1bf1e3079b6bc9af7aebd6c6aa57",
  "block": 14343715,
  "trx_in_block": 6,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T17:43:33",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "generate-a-self-signed-certificate-on-linux",
      "author": "tromatbranad",
      "permlink": "re-rnason-generate-a-self-signed-certificate-on-linux-20170806t174352655z",
      "title": "",
      "body": "Great article",
      "json_metadata": "{\"tags\":[\"sysops\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 17:18:48
parent authorrnason
parent permlinkapple-osx-tips-and-tricks
authorparttiderich
permlinkre-rnason-apple-osx-tips-and-tricks-20170806t171912304z
title
bodyVery interesting
json metadata{"tags":["apple"],"app":"steemit/0.1"}
Transaction InfoBlock #14343222/Trx a547b158de005e6044d59430a50f79c6b2340d2f
View Raw JSON Data
{
  "trx_id": "a547b158de005e6044d59430a50f79c6b2340d2f",
  "block": 14343222,
  "trx_in_block": 31,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T17:18:48",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "apple-osx-tips-and-tricks",
      "author": "parttiderich",
      "permlink": "re-rnason-apple-osx-tips-and-tricks-20170806t171912304z",
      "title": "",
      "body": "Very interesting",
      "json_metadata": "{\"tags\":[\"apple\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 16:52:36
parent authorrnason
parent permlinkaws-solution-architect-associate-exam-notes-part-1
authorplanacuabtran
permlinkre-rnason-aws-solution-architect-associate-exam-notes-part-1-20170806t165259469z
title
bodyGood article
json metadata{"tags":["aws"],"app":"steemit/0.1"}
Transaction InfoBlock #14342699/Trx eeaa1cc45d16d19652a16670ed8c47a2c3997205
View Raw JSON Data
{
  "trx_id": "eeaa1cc45d16d19652a16670ed8c47a2c3997205",
  "block": 14342699,
  "trx_in_block": 25,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T16:52:36",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "aws-solution-architect-associate-exam-notes-part-1",
      "author": "planacuabtran",
      "permlink": "re-rnason-aws-solution-architect-associate-exam-notes-part-1-20170806t165259469z",
      "title": "",
      "body": "Good article",
      "json_metadata": "{\"tags\":[\"aws\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 16:49:36
parent authorrnason
parent permlinkomd-server-installation
authornessdecomppres
permlinkre-rnason-omd-server-installation-20170806t164955465z
title
bodyGreat article
json metadata{"tags":["linux"],"app":"steemit/0.1"}
Transaction InfoBlock #14342639/Trx 5b4e20bcc0a4d7e82f1a74965f535c16e1eb5abb
View Raw JSON Data
{
  "trx_id": "5b4e20bcc0a4d7e82f1a74965f535c16e1eb5abb",
  "block": 14342639,
  "trx_in_block": 11,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T16:49:36",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "omd-server-installation",
      "author": "nessdecomppres",
      "permlink": "re-rnason-omd-server-installation-20170806t164955465z",
      "title": "",
      "body": "Great article",
      "json_metadata": "{\"tags\":[\"linux\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 16:38:45
parent authorrnason
parent permlinkomd-client-installation
authorsinelosno
permlinkre-rnason-omd-client-installation-20170806t163907549z
title
bodyVery interesting
json metadata{"tags":["linux"],"app":"steemit/0.1"}
Transaction InfoBlock #14342422/Trx 46d270827c2e99cb1ba57920261dc2681c8979d6
View Raw JSON Data
{
  "trx_id": "46d270827c2e99cb1ba57920261dc2681c8979d6",
  "block": 14342422,
  "trx_in_block": 24,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T16:38:45",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "omd-client-installation",
      "author": "sinelosno",
      "permlink": "re-rnason-omd-client-installation-20170806t163907549z",
      "title": "",
      "body": "Very interesting",
      "json_metadata": "{\"tags\":[\"linux\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 15:32:12
parent authorrnason
parent permlinkethereum-aws-miner-node-installation-and-setup
authortiabloghotwi
permlinkre-rnason-ethereum-aws-miner-node-installation-and-setup-20170806t153227976z
title
bodyInteresting thoughts
json metadata{"tags":["linux"],"app":"steemit/0.1"}
Transaction InfoBlock #14341094/Trx 98bc2e06183b76de70e3a3e43ab44598dfc9a26d
View Raw JSON Data
{
  "trx_id": "98bc2e06183b76de70e3a3e43ab44598dfc9a26d",
  "block": 14341094,
  "trx_in_block": 9,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T15:32:12",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "ethereum-aws-miner-node-installation-and-setup",
      "author": "tiabloghotwi",
      "permlink": "re-rnason-ethereum-aws-miner-node-installation-and-setup-20170806t153227976z",
      "title": "",
      "body": "Interesting thoughts",
      "json_metadata": "{\"tags\":[\"linux\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 15:13:21
parent authorrnason
parent permlinkconfiguring-cisco-radius-authentication
authorseytecountjber
permlinkre-rnason-configuring-cisco-radius-authentication-20170806t151343122z
title
bodyInteresting thoughts
json metadata{"tags":["cisco"],"app":"steemit/0.1"}
Transaction InfoBlock #14340718/Trx 12e643753fa52beb13e8a9d6fb1e003e2ceb649f
View Raw JSON Data
{
  "trx_id": "12e643753fa52beb13e8a9d6fb1e003e2ceb649f",
  "block": 14340718,
  "trx_in_block": 10,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T15:13:21",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "configuring-cisco-radius-authentication",
      "author": "seytecountjber",
      "permlink": "re-rnason-configuring-cisco-radius-authentication-20170806t151343122z",
      "title": "",
      "body": "Interesting thoughts",
      "json_metadata": "{\"tags\":[\"cisco\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 15:08:06
parent authorrnason
parent permlinkconnect-iscsi-luns-to-rhel-centos
authorupcounmuca
permlinkre-rnason-connect-iscsi-luns-to-rhel-centos-20170806t150820551z
title
bodyExcellent write!
json metadata{"tags":["sysops"],"app":"steemit/0.1"}
Transaction InfoBlock #14340615/Trx bc3362926a735ffff933450f72f3369788a2bfcb
View Raw JSON Data
{
  "trx_id": "bc3362926a735ffff933450f72f3369788a2bfcb",
  "block": 14340615,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T15:08:06",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "connect-iscsi-luns-to-rhel-centos",
      "author": "upcounmuca",
      "permlink": "re-rnason-connect-iscsi-luns-to-rhel-centos-20170806t150820551z",
      "title": "",
      "body": "Excellent write!",
      "json_metadata": "{\"tags\":[\"sysops\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 15:05:54
parent authorrnason
parent permlinklinux-volume-group-logical-volume-management
authorhamcagentue
permlinkre-rnason-linux-volume-group-logical-volume-management-20170806t150616725z
title
bodyWrite good
json metadata{"tags":["sysops"],"app":"steemit/0.1"}
Transaction InfoBlock #14340571/Trx 605571a7fde45b9350468a5414311d1045ee7954
View Raw JSON Data
{
  "trx_id": "605571a7fde45b9350468a5414311d1045ee7954",
  "block": 14340571,
  "trx_in_block": 13,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T15:05:54",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "linux-volume-group-logical-volume-management",
      "author": "hamcagentue",
      "permlink": "re-rnason-linux-volume-group-logical-volume-management-20170806t150616725z",
      "title": "",
      "body": "Write good",
      "json_metadata": "{\"tags\":[\"sysops\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 14:42:42
parent authorrnason
parent permlinkpowershell-send-mail-script
authorretaketti
permlinkre-rnason-powershell-send-mail-script-20170806t144300920z
title
bodyWrite good
json metadata{"tags":["scripts"],"app":"steemit/0.1"}
Transaction InfoBlock #14340107/Trx fdecc1d8b20a0deda9842bb1e861bae1813cd1d9
View Raw JSON Data
{
  "trx_id": "fdecc1d8b20a0deda9842bb1e861bae1813cd1d9",
  "block": 14340107,
  "trx_in_block": 7,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T14:42:42",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "powershell-send-mail-script",
      "author": "retaketti",
      "permlink": "re-rnason-powershell-send-mail-script-20170806t144300920z",
      "title": "",
      "body": "Write good",
      "json_metadata": "{\"tags\":[\"scripts\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 14:32:18
parent authorrnason
parent permlinkimport-non-trusted-certificates-to-local-trusted-certificate-store
authorfredtanafas
permlinkre-rnason-import-non-trusted-certificates-to-local-trusted-certificate-store-20170806t143241744z
title
bodyGood thoughts
json metadata{"tags":["sysops"],"app":"steemit/0.1"}
Transaction InfoBlock #14339900/Trx c4f6b06d90dbe958265ac2d48a63eff9dfcba09e
View Raw JSON Data
{
  "trx_id": "c4f6b06d90dbe958265ac2d48a63eff9dfcba09e",
  "block": 14339900,
  "trx_in_block": 26,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T14:32:18",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "import-non-trusted-certificates-to-local-trusted-certificate-store",
      "author": "fredtanafas",
      "permlink": "re-rnason-import-non-trusted-certificates-to-local-trusted-certificate-store-20170806t143241744z",
      "title": "",
      "body": "Good thoughts",
      "json_metadata": "{\"tags\":[\"sysops\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 14:05:03
parent authorrnason
parent permlinkpython-callback-example-code-snippit
authorclasarprodsoft
permlinkre-rnason-python-callback-example-code-snippit-20170806t140524894z
title
bodyWell written
json metadata{"tags":["python"],"app":"steemit/0.1"}
Transaction InfoBlock #14339356/Trx 94d4920b70e83a376ae2bcc0f8ad481ca29f29eb
View Raw JSON Data
{
  "trx_id": "94d4920b70e83a376ae2bcc0f8ad481ca29f29eb",
  "block": 14339356,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T14:05:03",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "python-callback-example-code-snippit",
      "author": "clasarprodsoft",
      "permlink": "re-rnason-python-callback-example-code-snippit-20170806t140524894z",
      "title": "",
      "body": "Well written",
      "json_metadata": "{\"tags\":[\"python\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 13:57:45
parent authorrnason
parent permlinkopenconnect-vpn-server-installation
authorlulogeabco
permlinkre-rnason-openconnect-vpn-server-installation-20170806t135800077z
title
bodyBeautiful post
json metadata{"tags":["linux"],"app":"steemit/0.1"}
Transaction InfoBlock #14339210/Trx 6066671ee6014698ad9e2383da55424a5dfc70de
View Raw JSON Data
{
  "trx_id": "6066671ee6014698ad9e2383da55424a5dfc70de",
  "block": 14339210,
  "trx_in_block": 11,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T13:57:45",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "openconnect-vpn-server-installation",
      "author": "lulogeabco",
      "permlink": "re-rnason-openconnect-vpn-server-installation-20170806t135800077z",
      "title": "",
      "body": "Beautiful post",
      "json_metadata": "{\"tags\":[\"linux\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 13:48:15
parent authorrnason
parent permlinkmigrating-a-repo-from-cvs-to-git
authorropozbanghis
permlinkre-rnason-migrating-a-repo-from-cvs-to-git-20170806t134836329z
title
bodyExcellent
json metadata{"tags":["devops"],"app":"steemit/0.1"}
Transaction InfoBlock #14339020/Trx e35571fde799584c90a0c644e87f4f261066ea57
View Raw JSON Data
{
  "trx_id": "e35571fde799584c90a0c644e87f4f261066ea57",
  "block": 14339020,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T13:48:15",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "migrating-a-repo-from-cvs-to-git",
      "author": "ropozbanghis",
      "permlink": "re-rnason-migrating-a-repo-from-cvs-to-git-20170806t134836329z",
      "title": "",
      "body": "Excellent",
      "json_metadata": "{\"tags\":[\"devops\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 13:42:45
parent authorrnason
parent permlinkhow-i-booted-my-un-bootable-mac-another-osx-grey-screen-recovery-tale
authorvoinighterha
permlinkre-rnason-how-i-booted-my-un-bootable-mac-another-osx-grey-screen-recovery-tale-20170806t134307106z
title
bodyWell described
json metadata{"tags":["apple"],"app":"steemit/0.1"}
Transaction InfoBlock #14338910/Trx 48c68d9e43f80b24e13875ba26d2e8f3c15ae641
View Raw JSON Data
{
  "trx_id": "48c68d9e43f80b24e13875ba26d2e8f3c15ae641",
  "block": 14338910,
  "trx_in_block": 13,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T13:42:45",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "how-i-booted-my-un-bootable-mac-another-osx-grey-screen-recovery-tale",
      "author": "voinighterha",
      "permlink": "re-rnason-how-i-booted-my-un-bootable-mac-another-osx-grey-screen-recovery-tale-20170806t134307106z",
      "title": "",
      "body": "Well described",
      "json_metadata": "{\"tags\":[\"apple\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 12:36:12
parent authorrnason
parent permlinknexus-repository-oss-server-installation
authorjuizintade
permlinkre-rnason-nexus-repository-oss-server-installation-20170806t123632914z
title
bodyPerfectly!
json metadata{"tags":["devops"],"app":"steemit/0.1"}
Transaction InfoBlock #14337582/Trx 5286f7f0f18cd82f6c777d3866aa47acf38d897b
View Raw JSON Data
{
  "trx_id": "5286f7f0f18cd82f6c777d3866aa47acf38d897b",
  "block": 14337582,
  "trx_in_block": 11,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T12:36:12",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "nexus-repository-oss-server-installation",
      "author": "juizintade",
      "permlink": "re-rnason-nexus-repository-oss-server-installation-20170806t123632914z",
      "title": "",
      "body": "Perfectly!",
      "json_metadata": "{\"tags\":[\"devops\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 12:20:06
parent authorrnason
parent permlinkdirectory-repository-cleanup-script
authorssavcontverbva
permlinkre-rnason-directory-repository-cleanup-script-20170806t122022333z
title
bodyGreat article
json metadata{"tags":["scripts"],"app":"steemit/0.1"}
Transaction InfoBlock #14337260/Trx 1018c390a6d2535de3ba2407ba7bb36e7d7f6888
View Raw JSON Data
{
  "trx_id": "1018c390a6d2535de3ba2407ba7bb36e7d7f6888",
  "block": 14337260,
  "trx_in_block": 10,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T12:20:06",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "directory-repository-cleanup-script",
      "author": "ssavcontverbva",
      "permlink": "re-rnason-directory-repository-cleanup-script-20170806t122022333z",
      "title": "",
      "body": "Great article",
      "json_metadata": "{\"tags\":[\"scripts\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 11:19:33
parent authorrnason
parent permlinkbuilding-an-ethereum-go-geth-rpm
authorvirtulinstha
permlinkre-rnason-building-an-ethereum-go-geth-rpm-20170806t111952293z
title
bodyBeautiful post
json metadata{"tags":["ethereum"],"app":"steemit/0.1"}
Transaction InfoBlock #14336049/Trx e351c30fa87a0c518368832504cd166868b5c4c7
View Raw JSON Data
{
  "trx_id": "e351c30fa87a0c518368832504cd166868b5c4c7",
  "block": 14336049,
  "trx_in_block": 27,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T11:19:33",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "building-an-ethereum-go-geth-rpm",
      "author": "virtulinstha",
      "permlink": "re-rnason-building-an-ethereum-go-geth-rpm-20170806t111952293z",
      "title": "",
      "body": "Beautiful post",
      "json_metadata": "{\"tags\":[\"ethereum\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 11:08:36
parent authorrnason
parent permlinkaws-developer-associate-exam-notes-part-1
authorkecoldispsymp
permlinkre-rnason-aws-developer-associate-exam-notes-part-1-20170806t110856773z
title
bodyGood!
json metadata{"tags":["aws"],"app":"steemit/0.1"}
Transaction InfoBlock #14335830/Trx 6a5ff8cdcf73e11b891bf7c7505238a56c11fe85
View Raw JSON Data
{
  "trx_id": "6a5ff8cdcf73e11b891bf7c7505238a56c11fe85",
  "block": 14335830,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T11:08:36",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "aws-developer-associate-exam-notes-part-1",
      "author": "kecoldispsymp",
      "permlink": "re-rnason-aws-developer-associate-exam-notes-part-1-20170806t110856773z",
      "title": "",
      "body": "Good!",
      "json_metadata": "{\"tags\":[\"aws\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/08/06 11:06:30
parent authorrnason
parent permlinksetting-static-routes-in-linux
authorpratunlali
permlinkre-rnason-setting-static-routes-in-linux-20170806t110652778z
title
bodyGreat article!
json metadata{"tags":["linux"],"app":"steemit/0.1"}
Transaction InfoBlock #14335788/Trx b98023c54624cde6b8e8412ba57f0658072b85e6
View Raw JSON Data
{
  "trx_id": "b98023c54624cde6b8e8412ba57f0658072b85e6",
  "block": 14335788,
  "trx_in_block": 25,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-06T11:06:30",
  "op": [
    "comment",
    {
      "parent_author": "rnason",
      "parent_permlink": "setting-static-routes-in-linux",
      "author": "pratunlali",
      "permlink": "re-rnason-setting-static-routes-in-linux-20170806t110652778z",
      "title": "",
      "body": "Great article!",
      "json_metadata": "{\"tags\":[\"linux\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/07/04 18:16:36
parent authorquickfingersluc
parent permlinkhow-can-you-trade-ethereum-and-win-on-every-trade-wow-eos-rocketing-178-today
authorrnason
permlinkre-quickfingersluc-how-can-you-trade-ethereum-and-win-on-every-trade-wow-eos-rocketing-178-today-20170704t181635567z
title
bodyGreat Video.. This was super helpful.. I am a subscriber for sure, keep the great videos coming !!
json metadata{"tags":["trading"],"app":"steemit/0.1"}
Transaction InfoBlock #13395389/Trx a1336c59efb9f873889bca5aae9970daca01caf6
View Raw JSON Data
{
  "trx_id": "a1336c59efb9f873889bca5aae9970daca01caf6",
  "block": 13395389,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-04T18:16:36",
  "op": [
    "comment",
    {
      "parent_author": "quickfingersluc",
      "parent_permlink": "how-can-you-trade-ethereum-and-win-on-every-trade-wow-eos-rocketing-178-today",
      "author": "rnason",
      "permlink": "re-quickfingersluc-how-can-you-trade-ethereum-and-win-on-every-trade-wow-eos-rocketing-178-today-20170704t181635567z",
      "title": "",
      "body": "Great Video.. This was super helpful.. I am a subscriber for sure, keep the great videos coming !!",
      "json_metadata": "{\"tags\":[\"trading\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/07/04 18:16:00
voterrnason
authorquickfingersluc
permlinkhow-can-you-trade-ethereum-and-win-on-every-trade-wow-eos-rocketing-178-today
weight10000 (100.00%)
Transaction InfoBlock #13395377/Trx d0834ca8b35c7b04d237ece342fa62aa87186e58
View Raw JSON Data
{
  "trx_id": "d0834ca8b35c7b04d237ece342fa62aa87186e58",
  "block": 13395377,
  "trx_in_block": 15,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-04T18:16:00",
  "op": [
    "vote",
    {
      "voter": "rnason",
      "author": "quickfingersluc",
      "permlink": "how-can-you-trade-ethereum-and-win-on-every-trade-wow-eos-rocketing-178-today",
      "weight": 10000
    }
  ]
}
2017/07/03 00:11:06
voterrnason
authorrnason
permlinkpython-callback-example-code-snippit
weight10000 (100.00%)
Transaction InfoBlock #13344920/Trx 5ab54c680319ca831cd51f148a7d4407d8247ad0
View Raw JSON Data
{
  "trx_id": "5ab54c680319ca831cd51f148a7d4407d8247ad0",
  "block": 13344920,
  "trx_in_block": 19,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-03T00:11:06",
  "op": [
    "vote",
    {
      "voter": "rnason",
      "author": "rnason",
      "permlink": "python-callback-example-code-snippit",
      "weight": 10000
    }
  ]
}
2017/07/03 00:11:06
parent author
parent permlinkpython
authorrnason
permlinkpython-callback-example-code-snippit
titlePython Callback Example Code Snippit
body# Python Callbacks Example <br> <center> ![Python](https://s3.amazonaws.com/clusterfrak.com/img/vendor/python-logo.png) <br> For more information on Python, visit [python.org](https://www.python.org/) </center> <br> ## Description ------- The purpose of this python snippit is to show how to do a callback in python. <br> ## Required Modules: ------- Python Native multiprocessing <br> ## Code: ------- ```python """Test Callback Function""" import multiprocessing as mp def count(countvar): """This function will just count to 100""" print('Incoming Variable is equal to ' + str(countvar)) countvar = 0 while countvar < 1000000: countvar = countvar + 1 response = "Count is set to " + str(countvar) return response def callback(result): """This will print the result calleded via the callback.""" if result is not None: print(str(result[0]) + ' Callback Succeeded') else: print("Callback Failure") # # Create pool # PROCESSES = 4 print('Creating pool with %d processes\n' % PROCESSES) POOL = mp.Pool(PROCESSES) print('POOL = %s' % POOL) print() TEST = None MP_CALLBACK = None RESULT = None # RESULT = POOL.apply_async(count, (TEST, ), callback=MP_CALLBACK) RESULT = POOL.map_async(count, (TEST, ), callback=callback) POOL.close() POOL.join() ```
json metadata{"tags":["python","programming"],"image":["https://s3.amazonaws.com/clusterfrak.com/img/vendor/python-logo.png"],"links":["https://www.python.org/"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #13344920/Trx 5ab54c680319ca831cd51f148a7d4407d8247ad0
View Raw JSON Data
{
  "trx_id": "5ab54c680319ca831cd51f148a7d4407d8247ad0",
  "block": 13344920,
  "trx_in_block": 19,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-03T00:11:06",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "python",
      "author": "rnason",
      "permlink": "python-callback-example-code-snippit",
      "title": "Python Callback Example Code Snippit",
      "body": "# Python Callbacks Example\n<br>\n<center>\n![Python](https://s3.amazonaws.com/clusterfrak.com/img/vendor/python-logo.png) <br>\nFor more information on Python, visit [python.org](https://www.python.org/)\n</center>\n\n<br>\n\n## Description\n-------\nThe purpose of this python snippit is to show how to do a callback in python.\n\n<br>\n\n## Required Modules:\n-------\nPython Native multiprocessing\n\n<br>\n\n## Code:\n-------\n```python\n\"\"\"Test Callback Function\"\"\"\nimport multiprocessing as mp\n\ndef count(countvar):\n    \"\"\"This function will just count to 100\"\"\"\n    print('Incoming Variable is equal to ' + str(countvar))\n    countvar = 0\n    while countvar < 1000000:\n        countvar = countvar + 1\n\n    response = \"Count is set to \" + str(countvar)\n    return response\n\ndef callback(result):\n    \"\"\"This will print the result calleded via the callback.\"\"\"\n\n    if result is not None:\n        print(str(result[0]) + ' Callback Succeeded')\n    else:\n        print(\"Callback Failure\")\n\n#\n# Create pool\n#\nPROCESSES = 4\nprint('Creating pool with %d processes\\n' % PROCESSES)\nPOOL = mp.Pool(PROCESSES)\nprint('POOL = %s' % POOL)\nprint()\n\nTEST = None\n\nMP_CALLBACK = None\nRESULT = None\n# RESULT = POOL.apply_async(count, (TEST, ), callback=MP_CALLBACK)\nRESULT = POOL.map_async(count, (TEST, ), callback=callback)\nPOOL.close()\nPOOL.join()\n```",
      "json_metadata": "{\"tags\":[\"python\",\"programming\"],\"image\":[\"https://s3.amazonaws.com/clusterfrak.com/img/vendor/python-logo.png\"],\"links\":[\"https://www.python.org/\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
2017/07/03 00:03:12
voterrnason
authorrnason
permlinkaws-developer-associate-exam-notes-part-2
weight10000 (100.00%)
Transaction InfoBlock #13344762/Trx 454b3d6d49a35b783929d0bd7dccfd82b394f1c2
View Raw JSON Data
{
  "trx_id": "454b3d6d49a35b783929d0bd7dccfd82b394f1c2",
  "block": 13344762,
  "trx_in_block": 18,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-03T00:03:12",
  "op": [
    "vote",
    {
      "voter": "rnason",
      "author": "rnason",
      "permlink": "aws-developer-associate-exam-notes-part-2",
      "weight": 10000
    }
  ]
}
2017/07/03 00:03:12
parent author
parent permlinkaws
authorrnason
permlinkaws-developer-associate-exam-notes-part-2
titleAWS Developer Associate Exam Notes Part 2
body# AWS Developer Associate Exam Notes Part 2 <br> <center> ![Amazon Web Services](https://s3.amazonaws.com/clusterfrak.com/img/vendor/amazon_web_services.png) <br> For more information on AWS, visit [aws.amazon.com](https://aws.amazon.com/) </center> <br> # Storage: ------- > [__S3 (Simple Storage Service):__](https://aws.amazon.com/s3/) Amazon Simple Storage Service (Amazon S3), provides developers and IT teams with secure, durable, highly-scalable cloud storage. Amazon S3 is easy to use object storage, with a simple web service interface to store and retrieve any amount of data from anywhere on the web. <br><br> - This topic is covered in [AWS Solutions Architect Study Guide](aws_saa_notes.md) - Object based storage only for files, can not install OS or applications - Data is spread across multiple devices and multiple facilities - Can loose 2 facilities and still have access to your files - Files can be between 1 byte and 5TB, and has no storage limit - Files are stored flatly in buckets, Folders don't really exist, but are part of the file name - S3 bucket names have a universal name-space, meaning each bucket name must be globally unique - S3 Stores data in alphabetical order (lexigraphical order) - S3 URL structures are region/amazon.aws.com/bucketname (https://s3-eu-west-1.amazonaws.com/myawesomebucket) - Read after write consistency for PUTS of new objects (As soon as you write an object, it is immediately available) - Eventual consistency for overwrite PUTS and DELETES. (Updating or deleting an object could take time to propagate) - S3 is basically a key value store and consists of the following: - Key - Name of the object - Value - Data made up of bytes - Version ID (important for versioning) - Meta-data - Data about what you are storing - ACLs - Permissions for stored objects - Amazon guarantees 99.99% availability for the S3 platform - Amazon guarantees 99.999999999% durability for S3 information (11 x 9's) - Tiered storage, and life-cycle management available - Versioning is available but must be enabled. It is off by default - Offers encryption, and allows you to secure the data using ACLs - S3 charges for storage, requests, and data transfer - Bucket names must be all lowercase, however in US-Standard if creating with the CLI tool, it will allow capital letters - The transfers tab shows uploads, downloads, permission changes, storage class changes, etc.. - When you upload a file to S3, by default it is set private - You can transfer files up to 5GB using PUT requests - You can setup access control to control your buckets access by using bucket policies or ACLs - Change the storage class under the Properties tab when an object is selected - S3 buckets can be configured to create access logs which logs all requests to the S3 bucket - S3 Events include SNS, or SQS events or Lambda functions. Lambda is location specific, not available in South Korea - All storage tiers have SSL support, millisecond first byte latency, and support life-cycle management policies. - Storage Tiers: - Standard S3: - Stored redundantly across multiple devices in multiple facilities - Designed to sustain the loss of 2 facilities concurrently - 11-9's durability, 99.99% availability - S3-IA (Infrequently Accessed): - For data that is accessed less frequently, but requires rapid access when needed - Lower fee than S3, but you are charged a retrieval fee - Also designed to sustain the loss of 2 facilities concurrently - 11-9's durability, 99.99% availability - Reduced Redundancy Storage (RSS): - Use for data such as thumbnails or data that could be regenerated - Costs less than Standard S3 - Designed to provide 99.99% durability and 99.99% availability of objects over a year - Designed to sustain the loss of a single facility - Glacier: - Very cheap, Stores data for as little as $0.01 per gigabyte, per month - Optimized for data that is infrequently accessed. Used for archival only - It takes 3-5 hours to restore access to files from Glacier - Versioning and Cross-Region Replication (CRR): - Versioning must be enabled in order to take advantage of Cross-Region Replication - Versioning resides under Cross Region Replication tab - Once Versioning is turned on, it can not be turned off, it can only be suspended - If you truly wanted versioning off, you would have to create a new bucket and move your objects - When versioning is enabled, you will see a slider tab at the top of the console that will enable you to hide/show all versions of files in the bucket - If a file is deleted for example, you need to slide this tab to show in order to see previous versions of the file - With versioning enabled, if you delete a file, S3 creates a delete marker for that file, which tells the console to not display the file any longer - In order to restore a deleted file you simply delete the delete marker file, and the file will then be displayed again in the bucket - To move back to a previous version of a file including a deleted file, simply delete the newest version of the file or the delete marker, and the previous version will be displayed - Versioning does store multiple copies of the same file. So in the example of taking a 1MB file, and uploading it. Currently your storage usage would be 1MB. Now if you update the file with small tweeks, so that content changes, but the size remains the same, and upload it. With the version tab on hide, you will see only the single updated file, however if you select show on the slider, you will see that both the original 1MB file exists as well as the updated 1MB file, so your total S3 usage is now 2MB not 1MB - Versioning does NOT support de-duplication or any similar technology currently - For Cross Region Replication (CRR), as long as versioning is enabled, clicking on the tab will now give you the ability to suspend versioning, and enable cross region replication - Cross Region Replication (CRR) has to be enabled on both the source and destination buckets in the selected regions - Destination bucket must be created and again globally unique (can be created right from the versioning tab, in the CRR configuration section via button) - You have the ability to select a separate storage class for any Cross Region Replication destination bucket - CRR does NOT replicate existing objects, only future objects meaning that only objects stored post turning the feature on will be replicated - Any object that already exists at the time of turning CRR on, will NOT be automatically replicated - Versioning integrates with life-cycle management and also supports MFA delete capability. This will use MFA to provide additional security against object deletion - Life-cycle Management: - When clicking on Life-cycle, and adding a rule, a rule can be applied to either the entire bucket or a single 'folder' in a bucket - Rules can be set to move objects to either separate storage tiers or delete them all together - Can be applied to current version and previous versions - If multiple actions are selected for example transition from STD to IA storage 30 days after upload, and then Archive 60 days after upload is also selected, once an object is uploaded, 30 days later the object will be moved to IA storage. 30 days after that the object will be moved to glacier. - Calculates based on UPLOAD date not Action data - Transition from STD to IA storage class requires MINIMUM of 30 days. You can not select or set any data range less than 30 days - Archive to Glacier can be set at a minimum of 1 day If STD->IA is NOT set - If STD->IA IS set, then you will have to wait a minimum of 60 days to archive the object because the minimum for STD->IA is 30 days, and the transition to glacier then takes an additional 30 days - When you enable versioning, there will be 2 sections in life-cycle management tab. 1 for the current version of an object, and another for previous versions - Minimum file size for IA storage is 128K for an object - Can set policy to permanently delete an object after a given time frame - If versioning is enabled, then the object must be set to expire, before it can be permanently deleted - Can not move objects to Reduced Redundancy using life-cycle policies - S3 Transfer Acceleration: - Utilizes the CloudFront Edge Network to accelerate your uploads to S3 - Instead of uploading directly to your S3 bucket, you can use a distinct URL to upload directly to an edge location which will then transfer the file to S3 - Transfer Acceleration URLs will have the format of bucketname.s3-accelerate.amazonaws.com - There is a test utility available that will test uploading direct to S3 vs through Transfer Acceleration, which will show the upload speed from different global locations - Turning on and using Transfer Acceleration will incur an additional fee - 2 types of encryption available: - In transit: - Uses SSL/TLS to encrypt the transfer of the object - At Rest (AES 256): - Server Side: S3 Manged Keys (SSE-S3) - Server Side: AWS Key Management Service, Managed Keys (SSE-KMS) - Server Side: Encryption with Customer provided Keys (SSE-C) - Client Side Encryption - Pricing (What your charged for when using S3): - Storage used - Number of Requests - Data Transfer <br> __Developer Associate Specific Topics__ <br> - Web Hosting: - Used for static hosting only; Server side code will not execute - Don't need to worry about scaling, ELBs or number of instances, S3 handles all of that for you - When you create an S3 bucket or enable hosting, you still need to make sure that either the files or the entire bucket are set to public accesibility - Bucket URLs are structured such as https://s3-eu-west-1.amazonaws.com/somebucketname - Hosted site URLs are structured as http://somebucketname.s3-website-eu-west-1.amazonaws.com - Hosting sites on S3 does not allow HTTPS support - Sites hosted on S3 can be served via HTTPS if distributed by cloudfront; Cloudfront would be configured to terminate a client HTTPS requst, and then talk to the bucket via standard HTTP - Can be configured to redirect to another URL - CORS Configuration: - Cross Origin Resource Sharing (CORS) - Configured in the permisssions section of the properties tab in a bucket - CORS configuration is in XML format and will be pasted directly into the permissions - CORS is required if you are calling an asset that resides in another bucket from the bucket that your static site resides in using the hosted URL <br> | Resource or Operation | Default Limit | | ------------- |------------- | | Buckets per account: | 100 | | Largest files size you can transfer with PUT request: | 5GB | | Minimum file size: | 1 byte | | Maximum file size: | 5 TB | For additional information about API Gateway Limits, see [Limits in Amazon S3](http://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html) <br> > [__CloudFront:__](https://aws.amazon.com/cloudfront/) Amazon CloudFront is a global content delivery network (CDN) service that accelerates delivery of your websites, APIs, video content or other web assets. <br><br> - This topic is covered in [AWS Solutions Architect Study Guide](aws_saa_notes.md) - Edge Location is the location where content will be cached, separate from an AWS Region/AZ - Origin is the origin of all files, can be S3, EC2 instance, a ELB, or Route53 - Distribution is the name given to the CDN which consists a collection of edge locations - Web Distributions are used for websites - RTMP - (Real-Time Messaging Protocol) used for streaming media typically around adobe flash files - Edge locations can be R/W and will accept a PUT request on an edge location, which then will replicate the file back to the origin - Objects are cached for the life of the TTL (24 hours by default) - You can clear objects from edge locations, but you will be charged - When enabling cloudfront from an S3 origin, you have the option to restrict bucket access; this will disable the direct link to the file in the S3 bucket, and ensure that the content is only served from cloudfront - The path pattern uses regular expressions - You can restrict access to your distributions using signed URLS - You can assign Web Application Firewall rules to your distributions - Distribution URLs are going to be non-pretty names such as random_characters.cloudfront.com; you can create a CNAME that points to the cloudfront name to make the URL user friendly - You can restrict content based on geographical locations in the behaviors tab - You can create custom error pages via the error pages tab - Purging content is handled in the Invalidations tab <br> | Resource or Operation | Default Limit | | ------------- |------------- | | Data transfer rate per distribution: | 40 Gbps | | Requests per second per distribution: | 100,000 | | Web distributions per account: | 200 | | RTMP distributions per account: | 100 | | Alternate domain names (CNAMEs) per distribution: | 100 | | Origins per distribution: | 25 | | Cache behaviors per distribution: | 25 | | White-listed headers per cache behavior: | 10 | | White-listed cookies per cache behavior: | 10 | | SSL certificates per account when serving HTTPS requests using dedicated IP addresses (no limit when serving HTTPS requests using SNI): | 2 | | Custom headers that you can have Amazon CloudFront forward to the origin: | 10 name–value pairs | For additional information about CloudFront Limits, see [Limits in Amazon CloudFront](http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/cloudfront-limits.html) <br> # Databases: ------- > [__DynamoDB (No-SQL):__](https://aws.amazon.com/dynamodb/) Fast and flexible NoSQL DB service for all apps that need consistent, single-digit millisecond latency at any scale. It is a fully managed database and supports both document and key-value data models. Its flexible data model and reliable performance make it a great fit for mobile, web, gaming, ad-tech, IoT, and many other applications. <br><br> - This topic is covered in [AWS Solutions Architect Study Guide](aws_saa_notes.md) - Non Relational DB (No-SQL), comprised of collections (tables), of documents (rows), with each document consisting of key/value pairs (fields) - Document oriented DB - Offers push button scaling, meaning that you can scale your db on the fly without any downtime - RDS is not so easy, you usually have to use a bigger instance size or add read replicas - Stored on SSD Storage - Spread across 3 geographically distinct data centers - Eventual Consistent Reads (Default) - Consistency across all copies of data is usually reached within 1 second - Repeating a read after a short time should return updated data - Best Read Performance - Strongly Consistent Reads - Returns a result that reflects all writes that received a successful response prior to the read - Structure: - Tables - Items (Think rows in a traditional table) - Attributes (Think columns of data in a table) - Provisioned throughput capacity - Write throughput 0.0065 per hour for every 10 units - Read throughput 0.0065 per hour for every 50 units - First 25 GB of storage is free - Storage costs of 25 cents per additional GB per Month - Can be expensive for writes, but really really cheap for reads - The combined key/value size must not exceed 400 KB for any given document <br> __Developer Associate Specific Topics__ <br> - Supports attribute nesting up to 35 levels - Conditional writes are idempotent, you can send the same conditional write request multiple times, but it will have no further effect on the item after the first time Dynamo performs the update - Supports atomic counters, using the UpdateItem operation to increment or decrement the value of an existing attribute without interfering with other write requests - Atomic counter updates are not idempotent, the counter will increment each time you call UpdateItem - If you can have a small margin of error in your data, then use atomic counters - If your application needs to read multiple items, you can use the BatchGetItem API endpoint; A single request can retrieve up to 1MB of data with as many as 100 items - A single BatchGetItem request can retrieve items from multiple tables - All write requests are applied in the order in which they are received - Pricing (calculate the amount of writes and reads per second): - Divide total number of writes per day / 25 (hours) / 60 (minutes) / 60 (seconds) = No. writes per second - A write or read capacity unit can handle 1 write/read per second - Individual items or the entire table can be exported to CSV - Example: - Using 28 GB of storage - 1,000,000 writes per day = 1,000,000/24 = 41,666.67 - 41,666.67 / 60 (minutes) = 694.44 - 694.44 / 60 (seconds) = 11.574 writes per second - This example would require 12 write capacity units (single capacity unit is 1 write per second) - Charge for write is $0.0065 per 10 units - $0.0065 / 10 = $0.00065 per unit - $0.00065 * 12 (required write units) = $0.0078 - $0.0078 * 24 (hours per day) = $0.1872 per day for writes - Charge for read is $0.0065 per 50 units - $0.0065 / 50 = $0.00013 per unit - $0.00013 * 12 (required read units) = $0.00156 - $0.00156 * 24 (hours per day) = $0.03744 per day for reads - Using 28 GB storage with first 25 GB free = 3 GB storage required - 3 GB * $0.25 per GB (after initial 25) = $0.75 - Indexes: - Primary Key types: - Single attribute (unique ID): - Partition Key (Hash Key composed of one attribute) - Partition Key's value is used as input to an internal hash function which output determines the partition (physical location in which the data is stored) - No 2 items in a table can have the same partition key value - Composite (unique ID and date range): - Partition Key & Sort Key (Hash and Range) composed of two attributes - Partition Key's value is used as input to an internal hash function which output determines the partition (physical location in which the data is stored) - 2 Items can have the same partition key, but they MUST have a different sort key - All Items with the same partition key are stored together, in sorted order by the sort key value - Local Secondary Index (LSI): - Has the SAME partition key, but different sort key - Can ONLY be created when creating a table - Can not be removed or modified after creation - Can have up to 5 LSI's per table - Global Secondary Index (GSI): - Has DIFFERENT partition key and different sort key - Can be created at table creation or added LATER - Can have up to 5 GSI's per table - Streams: - Used to capture any kind of modification of the DynamoDB tables - If new item is added to the table, the stream captures an image of the entire item, including all of its attributes - If an item is updated, the stream captures the before and after image of any attributes that were modified in the item - If an item is deleted from the table, the stream captures an image of the entire item before it was deleted - Streams are stored for 24 hours and then is lost - Streams can trigger functions with Lambda that will perform actions based on the instantiation of a stream event - Query's: - Operation that finds items in a table using only the primary key attribute value - Must provide a partition attribute name and distinct value to search for - Optionally can provide a sort key attribute name and value and use comparison operator to refine the search results - By default a query returns all of the data attributes for items with the specified primary key(s) - The ProjectionExpression parameter can be used to only return some of the attributes from a query as opposed to the default all - Results are always sorted by the sort key - If the data type of the sort key is a number, the results are returned in numeric order - If the data type of the sort key is a string, the results are returned in order of ASCII character code values - Sort order is ascending, the ScanIndexForward parameter can be set to false to sort in descending order - By default queries are eventually consistent but can be changed to strongly consistent - More efficient then a scan operation - For quicker response times, design your tables in a way that can use the query, GET, or BatchGetItem API - Scans: - Examines every item in the table - By default, a scan returns all of the data attributes for every item - Can use the ProjectionExpression parameter so that the scan only returns some of the attributes, instead of all - Always scans the entire table, then filters out values to provide the desired result (added step of removing data from initial dataset) - Should be avoided on a large table with a filter that removes many results - As table grows, the scan operation slows - Examines every item for the requested values, and can use up provisioned throughput for a large table in a single operation - Provisioned Throughput - 400 HTTP status code - ProvisionedThroughputExceededException error will indicate that you exceeded your max allowed provisioned throughput for a table or for one or more GSI's - Unit of read provisioned throughput: - All reads are rounded up to increments of 4 KB - Eventual consistent reads (default) consist of 2 reads per second - Strongly consistent reads consist of 1 read per second - Take the (size of the read rounded to the nearest 4 KB chunk / 4 KB) * No. of items = read throughput - Divide by 2 if eventually consistent - Example: - Application requires to read 10 items of 1 KB per second using eventual consistency, whats the read throughput - Calculate the number of read units per item needed - 1 KB rounded to the nearest 4 KB increment = 4 (KB) or a single chunk - 4 KB / 4 KB = 1 read unit per item - 1 x 10 read items = 10 - Using eventual consistency is 10 /2 = 5 - 5 units of read throughput - Example 2: - Application requires to read 10 items of 6 KB per second using eventual consistency, whats the read throughput - Calculate the number of read units per item needed - 6 KB rounded to the nearest 4 KB increment = 8 (KB) or 2 chunks of 4 KB - 8 KB / 4 KB = 2 read unit per item - 2 x 10 read items = 20 - Using eventual consistency is 20 /2 = 10 - 10 units of read throughput - Unit of write provisioned throughput: - All writes are 1 KB - All writes consist of 1 write per second - Example: - Application requires to write 5 items with each being 10KB in size per second - Each write unit consists of 1 KB of data, need to write 5 items per second with each item using 10 KB of data - 5 items * 10 KB = 50 write units - Write throughput is 50 units - Example 2: - Application requires to write 12 items with each being 100KB in size per second - Each write unit consists of 1 KB of data, need to write 12 items per second with each item using 100 KB of data - 12 items * 100 KB = 1200 write units - Write throughput is 1200 units - Web Identity Providers: - Authenticate users using Web Identity Providers such as Facebook, Google, Amazon or any other ID Connect-compatible identity provider - Accomplished using AssumeRoleWithWebIdentity API - Need to create a role first - Process: - User authentication request sent and received with the identity provider such as Facebook, Google, etc.. - Web Identity token returned from provider - Token, App ID of provider, and ARN of IAM Role sent to AssumeRoleWithIdentity API endpoint - AWS issues temporary security credentials back to the user allowing the user to access resources (1 hour default) - Temporary security credentials response consist of 4 things: - AccessKeyID, SecretAccessKey, SessionToken - Expiration (time limit, 1 hour by default) - AssumeRoleID - SubjectFromWebIdentityToken <br> | US East (N. Virginia) Region | Default Limit | | ------------- |------------- | | Maximum capacity units per table or global secondary index: | 40,000 read capacity units and 40,000 write capacity units | | Maximum capacity units per account: | 80,000 read capacity units and 80,000 write capacity units | <br> | All Region Resource or Operation | Default Limit | | ------------- |------------- | | Maximum capacity units per table or global secondary index: | 10,000 read capacity units and 10,000 write capacity units | | Maximum capacity units per account: | 20,000 read capacity units and 20,000 write capacity units | | Maximum number of tables: | 256 | For additional information about DynamoDB Limits, see [Limits in Amazon DynamoDB](http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html) <br> # Security and Identity: ------- > [__IAM (Identity and Access Management):__](https://aws.amazon.com/iam/) AWS Identity and Access Management (IAM) enables you to securely control access to AWS services and resources for your users. <br><br> - This topic is covered in [AWS Solutions Architect Study Guide](aws_saa_notes.md) - Allows for centralized control and shared access to your AWS Account and/or AWS services - By default when you create a user, they have NO permissions to do anything - Root account has full admin access upon account creation - Not region specific, can be shared between all regions - Granular permission sets for AWS resources - Includes Federation Integration which taps into Active Directory, Facebook, Linkedin, etc. for authentication - Multi-factor authentication support - Allows configuration of temporary access for users, devices and services - Set up and manage password policy and password rotation policy for IAM users - Integration with many different AWS services - Supports PCI DSS compliance - Access can be applied to: - Users - End users (people) - Groups - Collection of users under one set of permissions - Roles - Assigned to AWS resources, specifying what the resource (such as EC2) is allowed to access on another resource (S3) - Policies - Document that defines one or more permissions - Policies can be applied to users, groups and roles - You can assign up to 10 policies to a single group - Policy documents must have a version, and a statement in the body; The statement must consist of Effects (Allow, Deny), Actions(Which action to allow/deny such a * for all actions), and Resources (affected resources such as * for all resources) - All resources can share the same policy document - There are 3 different types of roles: - Service Roles - Cross account access roles - Used when you have multiple AWS accounts and another AWS account must interact with the current AWS account - Identity provider access roles - Roles for facebook or similar Identity providers - In order for a new IAM user to be able to log into the console, the user must have a password set - By default a new users access is only accomplished through the use of the access key/secret access key - If the users password is a generated password, it also will only be shown at the time of creation. - Customizable Console Sign-in link can be configured on the main IAM page (aws.yourdomain.com) - Customizable Console Sign-in links must be globally unique. If a sign in link name is already taken, you must choose an alternative - Root account is email address that you used to register your account - Recommended that root account is not used for login, and should be secured with Multi-factor Authentication (MFA) - Can create Access Keys/ Secret Access Keys to allow IAM users (or service accounts) to be used with AWS CLI or API calls - Access Key ID is equivalent to a user-name, Secret Access Key is equivalent to a password - When creating a user's credentials, you can only see/download the credentials at the time of creation not after. - Access Keys can be retired, and new ones can be created in the event that secret access keys are lost - To create a user password, once the users have been created, choose the user you want to set the password for and from the User Actions drop list, click manage password. Here you can opt to create a generated or custom password. If generated, there is an option to force the user to set a custom password on next login. Once a generated password has been issued, you can see the password which is the same as the access keys. Its shown once only - Click on Policies from the left side menu and choose the policies that you want to apply to your users. When you pick a policy that you want applied to a user, select the policy, and then from the top Policy Actions drop menu, choose attach and select the user that you want to assign the policy to <br> | Resource or Operation | Default Limit | | ------------- |------------- | | Groups per account: | 100 | | Instance profiles: | 100 | | Roles: | 250 | | Server Certificates: | 20 | | Users: | 5000 | | Number of policies allowed to attach to a single group: | 10 | For additional information about API Gateway Limits, see [Limits in IAM entities and objects](http://docs.aws.amazon.com/IAM/latest/UserGuide/LimitationsOnEntities.html) <br> > [__Directory Service:__](https://aws.amazon.com/directoryservice/) AWS Directory Service makes it easy to setup and run Microsoft Active Directory (AD) in the AWS cloud, or connect your AWS resources with an existing on-premises Microsoft Active Directory. <br><br> - Active Directory flow is initialted when a user browses to the ADFS integrated site: - The sign-on page will authenticate the user against Active Directory - Depending on the browser used, the user may be promted to input their AD username/password - The users browser receives a SAML (Secure Assertive Markup Language) assertion in the form of an auth response from AD Federation Services (ADFS) - The users browser posts the SAML assertion to the AWS sign-in endpoint for SAML - The AWS console uses the AssumeRoleWithSAML API to request temporary security credentials and then constructs a sign-in URL for the AWS Console - The users browser receives the sign-in URL and is redirected to the conole - The process is transparent to the user; They start at an interanl web site and end up on the console without having to supply credentials - Remember the API call to request temporary security credentials from the AWS platform is __AssumeRoleWithSAML__ - The sign-in endpoint for SAML is https://signin.aws.amazon.com/saml - When using ADFS the user always authenticates with AD first before recieving security credentials - Web Identity Federation: - Allows users to authenticate your application with Facebook, LinkedIn, Google, or your AWS account - The AWS console has a link to a Web Identity Federation Playground, that allows you to test logins using services such as FB, LinkedIn, etc... - Once logged in using the playground, you get a response containing an accessToken that is good for 5016 seconds - This went to the service such as FB, authenticated with the service, recieved an accessToken, using the token, AWS will grant temporary security credentials by making an AssumeRoleWithWebIdentity request - When the AssumeRoleWithWebIdentity request is formed, a trust policy is created granting all access via the recieved accessToken - Authenticate with web service (facebook, etc..) first, then get temporary security credentials via AccessToken sent to AssumeRoleWithWebIdentity request, and finally with the temporary security credentials, user is able to access AWS resources - Remember the API call to request temporary security credentials from the AWS platform is __AssumeRoleWithWebIdentity__ <br> # Management Tools: ------- > [__Cloud Formation:__](https://aws.amazon.com/cloudformation/) AWS CloudFormation gives developers and systems administrators an easy way to create and manage a collection of related AWS resources, provisioning and updating them in an orderly and predictable fashion. <br><br> - This topic is covered in [AWS Solutions Architect Study Guide](aws_saa_notes.md) - Deploy application as stacks. Much like a docker-compose file for docker - Can be written in either JSON or YAML - Free service, however resources created by CloudFormation are subject to normal pricing - Fn::GetAtt is a function that will allow you to get attributes of newly launched resources from CloudFormation such as DNS name, IP address, etc.. - If errors are encountered the stack launch will terminate and rollback all resources that were created <br> | Resource or Operation | Default Limit | | ------------- |------------- | | Stacks: | 200 | For additional information about Cloud Formation Service Limits, see [Limits in Amazon CloudFormation](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html) <br> # Application Services: ------- > [__SQS (Simple Queue Service):__](https://aws.amazon.com/sqs/) Web service that gives you access to a message queue that can be used to store messages while waiting for a computer to process them. SQS is a distributed queue system that enables applications to quickly and reliably queue messages that one component of the application generates to be consumed by another component. A queue is a temp repository for messages that are awaiting processing. <br><br> - This topic is covered in [AWS Solutions Architect Study Guide](aws_saa_notes.md) - Used to allow customers the ability to decouple infrastructure components - Very first service AWS released. Even older then EC2 - Messages can contain up to 256 KB of text in any format - Acts as a buffer between the component producing and saving data, and the component receiving and processing the data - Ensures deliver of each message at least once and supports multiple readers and writers interacting with the same queue - A single queue can be used simultaneously by many distributed application components, with no need for those components to coordinate or communicate with each other - Will always be available and deliver messages - Does not guarantee FIFO delivery of messages - Messages can be delivered multiple times and in any order - FIFO is not supported - If sequential processing is a requirement, sequencing information can be placed in each message so that message order can be preserved - SQS always asynchronously PULLs messages from the queue - Retention period of 14 days - 12 hour visibility timeout by default - If you find that the default visibility timeout period (12 hours) is insufficient to fully process and delete the message, the visibility timeout can be extended using the ChangeMessageVisibility action - If the ChangeMessageVisibility action is specified to set an extended timeout period, SQS restarts the timeout period using the new value - Engineered to provide delivery of all messages at least one - Default short polling will return messages immediately if messages exist in the queue - Long polling is a way to retrieve messages from a queue as soon as they are available; long polling requests don't return a response until a message arrives in the queue - Maximum long poll time out is 20 seconds - 256kb message sizes (originally 64kb) - Billed for 64kb chunks - First million messages free, then $.50 per additional million thereafter - Single request can have from 1 to 10 messages, up to a max payload of 256KB - Each 64KB chunk of payload is billed as 1 request. If you send a single API request with a 256KB payload, you will be billed for 4 requests (256/64 KB chunks) - "Decouple" = SQS on exam - Auto-scaling supported - Message prioritization is not supported - Process: - Component 1 sends a message to the queue - Component 2 retrieves the message from the queue and starts the visibility timeout period - Visibility timer only starts when the message is picked up from the queue - Component 2 processes the message and then deletes it from the queue during the visibility timeout period - If the visibility timeout period expires, the message will stay in the queue and not be deleted - The process is only complete when the queue receives the command to delete the message from the queue <br> For additional information about SQS Limits, see [Limits in Amazon SQS](http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-limits.html) <br> > [__SWF (Simple Workflow Service)__](https://aws.amazon.com/swf/) Simple Workflow Service is a web service that makes it easy to coordinate work across distributed application components. Enabled for a range of uses such as media processing, web back ends, business process work-flows, and analytics pipelines, all to be designed as a coordination of tasks. Tasks represent invocations of various processing steps in an application which can be performed by code, API calls, human action and scripts. <br><br> - This topic is covered in [AWS Solutions Architect Study Guide](aws_saa_notes.md) - Build, run and scale background jobs or tasks that have sequential steps - Way to process human oriented tasks using a framework - SQS has a retention period of 14 days, vs SWF has up to a 1 year for work-flow executions - Workflow retention is always shown in seconds (3.1536E+07 seconds) - "Task could take a month" = SWF, as SQS only has a 14 day retention - Presents a task-oriented API, whereas SQS offers a message-oriented API - Ensures a teaks is assigned only once and is never duplicated; SQS duplicate messages are allowed, and must be handled - Keeps track of all tasks and events in an application, SQS would need an implementation of a custom application-level tracking mechanism - A collection of work-flows is referred to as a domain - Domains isolate a set of types, executions, and task lists from others within the same account - You can register a domain by using the AWS console or using the RegisterDomain action in the SWF API - Domain parameters are specified in JSON format - SWF Actors: - Workflow starters - An application that can initiate a Workflow - Decider's - Control the flow or coordination of activity tasks such as concurrency, or scheduling in a work-flow execution; If something has finished in a work-flow (or fails), a decider decides what to do next - Activity Workers - Programs that interact with SWF to get tasks, process received tasks, and return the results - Brokers the interactions between workers and the decider; Allows the decider to get consistent views into the progress of tasks and to initiate new tasks in an ongoing manner - Stores tasks, assigns them to workers when they are ready and monitors their progress - Ensures that a task is assigned only once and is never duplicated - Maintains the application state durably, workers and decider's don't have to keep track of the execution state, and can run independently, with the ability to scale quickly <br> For additional information about SWF Limits, see [Limits in Amazon SWF](http://docs.aws.amazon.com/amazonswf/latest/developerguide/swf-dg-limits.html) <br> # Mobile Services: ------- > [__SNS (Simple Notification Service):__](https://aws.amazon.com/sns/) Simple Notification Service is a web service that makes it easy to set up, operate, and send notifications from the cloud. It provides developers with a highly scalable, flexible, and cost-effective capability to publish messages from an application and immediately deliver them to subscribers or other applications. <br><br> - Web service that allows customers to setup, operate, and send notifications from the cloud - Can push to Apple, Google, FireOS, and Windows devices, as well as Android devices in China with Baidu cloud push - Follows the publish-subscribe (pub-sub) messaging paradigm, with notifications being delivered to clients using a push mechanism that eliminates the need to poll for updates - Can deliver notifications by SMS, email, SQS queues, or any HTTP endpoint - SNS notifications can be used to trigger lambda functions - When a message is published to an SNS topic that has a lambda function subscribed to it, the function is invoked with the payload of the published message. The lambda function would receive the message payload as an input parameter, and can manipulate the info in the message, publish the message to other SNS topics or send the message to other AWS services - Allows you to group multiple recipients using topics - Topics are access points for allowing recipients to dynamically subscribe for copies of the notification - One topic can support deliveries to multiple endpoint types, for example, IOS, Android, and SMS recipients can be grouped together - When message is published, SNS delivers appropriately formatted copies of your message to each subscriber - Email notifications will be JSON formated not XML - Subscriptions have to be confirmed - Subscription expire after 3 days if they are not confirmed - TTL is the number of seconds since the message was published - If the message is not delivered within the TTL time, then the message will expire - To prevent messages from being lost, all messages published to SNS are stored redundantly across multiple AZ's - Instantaneous, PUSH based delivery (No Polling) --> SQS requires polling - Simple API and easy integration with applications - Flexible message deliver over multiple transport protocols - Inexpensive, pay as you go model - Web based AWS management console offers simplicity of point and click interface - $.50 per million SNS requests - $.06 per 100,000 notification deliveries over HTTP - $0.75 per 100 notifications over SMS - $2.00 per 100,000 notification deliveries over email - Can be used in conjunction with SQS to fan a single message out to multiple SQS queues - Remember: - SNS - PUSH - SQS - PULL (poll) - Subscribers: - HTTP - HTTPS - Email - Email-JSON - SQS - Application - Lambda - Messages can be customized for each of the available protocols <br> | Resource or Operation | Default Limit | | ------------- |------------- | | Topics : | 100,000 | | Account spend threshold for SMS: | 50 USD | | Delivery rate for promotional SMS messages: | 20 Messages per second | | Delivery rate for transactional SMS messages: | 20 Messages per second | <br> # White Paper Review: ------- - Shared security model - AWS: - Responsible for securing the underlying infrastructure - Responsible for protecting the global infrastructure that runs all of the services offered on the AWS cloud. - Infrastructure comprised of hardware, software, networking, and facilities that run AWS services - Responsible for the security configuration of its products that are considered managed services, such as DynamoDB, RDS, Redshift, Elastic MapReduce, lambda, and Workspaces. - User: - Responsible for anything put on the cloud - EC2, VPC, S3 security configuration and management tasks - Account Management (MFA, SSL, TLS, CloudTrail API/User activity logging)
json metadata{"tags":["aws","certifications","study"],"image":["https://s3.amazonaws.com/clusterfrak.com/img/vendor/amazon_web_services.png"],"links":["https://aws.amazon.com/","https://aws.amazon.com/s3/","aws_saa_notes.md","https://s3-eu-west-1.amazonaws.com/myawesomebucket","https://s3-eu-west-1.amazonaws.com/somebucketname","http://somebucketname.s3-website-eu-west-1.amazonaws.com","http://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html","https://aws.amazon.com/cloudfront/","http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/cloudfront-limits.html","https://aws.amazon.com/dynamodb/","http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html","https://aws.amazon.com/iam/","http://docs.aws.amazon.com/IAM/latest/UserGuide/LimitationsOnEntities.html","https://aws.amazon.com/directoryservice/","https://signin.aws.amazon.com/saml","https://aws.amazon.com/cloudformation/","http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html","https://aws.amazon.com/sqs/","http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-limits.html","https://aws.amazon.com/swf/","http://docs.aws.amazon.com/amazonswf/latest/developerguide/swf-dg-limits.html","https://aws.amazon.com/sns/"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #13344762/Trx 454b3d6d49a35b783929d0bd7dccfd82b394f1c2
View Raw JSON Data
{
  "trx_id": "454b3d6d49a35b783929d0bd7dccfd82b394f1c2",
  "block": 13344762,
  "trx_in_block": 18,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-03T00:03:12",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "aws",
      "author": "rnason",
      "permlink": "aws-developer-associate-exam-notes-part-2",
      "title": "AWS Developer Associate Exam Notes Part 2",
      "body": "# AWS Developer Associate Exam Notes Part 2\n<br>\n<center>\n![Amazon Web Services](https://s3.amazonaws.com/clusterfrak.com/img/vendor/amazon_web_services.png) <br>\nFor more information on AWS, visit [aws.amazon.com](https://aws.amazon.com/)\n</center>\n\n<br>\n\n# Storage:\n-------\n\n> [__S3 (Simple Storage Service):__](https://aws.amazon.com/s3/)\n\nAmazon Simple Storage Service (Amazon S3), provides developers and IT teams with secure, durable, highly-scalable cloud storage. Amazon S3 is easy to use object storage, with a simple web service interface to store and retrieve any amount of data from anywhere on the web. <br><br>\n\n- This topic is covered in [AWS Solutions Architect Study Guide](aws_saa_notes.md)\n- Object based storage only for files, can not install OS or applications\n- Data is spread across multiple devices and multiple facilities\n- Can loose 2 facilities and still have access to your files\n- Files can be between 1 byte and 5TB, and has no storage limit\n- Files are stored flatly in buckets, Folders don't really exist, but are part of the file name\n- S3 bucket names have a universal name-space, meaning each bucket name must be globally unique\n- S3 Stores data in alphabetical order (lexigraphical order)\n- S3 URL structures are region/amazon.aws.com/bucketname (https://s3-eu-west-1.amazonaws.com/myawesomebucket)\n- Read after write consistency for PUTS of new objects (As soon as you write an object, it is immediately available)\n- Eventual consistency for overwrite PUTS and DELETES. (Updating or deleting an object could take time to propagate)\n- S3 is basically a key value store and consists of the following:\n    - Key - Name of the object\n    - Value - Data made up of bytes\n    - Version ID (important for versioning)\n    - Meta-data - Data about what you are storing\n    - ACLs - Permissions for stored objects\n- Amazon guarantees 99.99% availability for the S3 platform\n- Amazon guarantees 99.999999999% durability for S3 information (11 x 9's)\n- Tiered storage, and life-cycle management available\n- Versioning is available but must be enabled. It is off by default\n- Offers encryption, and allows you to secure the data using ACLs\n- S3 charges for storage, requests, and data transfer\n- Bucket names must be all lowercase, however in US-Standard if creating with the CLI tool, it will allow capital letters\n- The transfers tab shows uploads, downloads, permission changes, storage class changes, etc.. \n- When you upload a file to S3, by default it is set private\n- You can transfer files up to 5GB using PUT requests\n- You can setup access control to control your buckets access by using bucket policies or ACLs\n- Change the storage class under the Properties tab when an object is selected\n- S3 buckets can be configured to create access logs which logs all requests to the S3 bucket\n- S3 Events include SNS, or SQS events or Lambda functions. Lambda is location specific, not available in South Korea\n- All storage tiers have SSL support, millisecond first byte latency, and support life-cycle management policies.\n- Storage Tiers:\n    - Standard S3:\n        - Stored redundantly across multiple devices in multiple facilities\n        - Designed to sustain the loss of 2 facilities concurrently\n        - 11-9's durability, 99.99% availability\n    - S3-IA (Infrequently Accessed):\n        - For data that is accessed less frequently, but requires rapid access when needed\n        - Lower fee than S3, but you are charged a retrieval fee\n        - Also designed to sustain the loss of 2 facilities concurrently\n        - 11-9's durability, 99.99% availability\n    - Reduced Redundancy Storage (RSS):\n        - Use for data such as thumbnails or data that could be regenerated\n        - Costs less than Standard S3\n        - Designed to provide 99.99% durability and 99.99% availability of objects over a year\n        - Designed to sustain the loss of a single facility\n    - Glacier:\n        - Very cheap, Stores data for as little as $0.01 per gigabyte, per month\n        - Optimized for data that is infrequently accessed. Used for archival only\n        - It takes 3-5 hours to restore access to files from Glacier\n- Versioning and Cross-Region Replication (CRR):\n    - Versioning must be enabled in order to take advantage of Cross-Region Replication\n    - Versioning resides under Cross Region Replication tab\n    - Once Versioning is turned on, it can not be turned off, it can only be suspended\n    - If you truly wanted versioning off, you would have to create a new bucket and move your objects\n    - When versioning is enabled, you will see a slider tab at the top of the console that will enable you to hide/show all versions of files in the bucket\n    - If a file is deleted for example, you need to slide this tab to show in order to see previous versions of the file\n    - With versioning enabled, if you delete a file, S3 creates a delete marker for that file, which tells the console to not display the file any longer\n    - In order to restore a deleted file you simply delete the delete marker file, and the file will then be displayed again in the bucket\n    - To move back to a previous version of a file including a deleted file, simply delete the newest version of the file or the delete marker, and the previous version will be displayed\n    - Versioning does store multiple copies of the same file. So in the example of taking a 1MB file, and uploading it. Currently your storage usage would be 1MB. Now if you update the file with small tweeks, so that content changes, but the size remains the same, and upload it. With the version tab on hide, you will see only the single updated file, however if you select show on the slider, you will see that both the original 1MB file exists as well as the updated 1MB file, so your total S3 usage is now 2MB not 1MB\n    - Versioning does NOT support de-duplication or any similar technology currently\n    - For Cross Region Replication (CRR), as long as versioning is enabled, clicking on the tab will now give you the ability to suspend versioning, and enable cross region replication\n    - Cross Region Replication (CRR) has to be enabled on both the source and destination buckets in the selected regions\n    - Destination bucket must be created and again globally unique (can be created right from the versioning tab, in the CRR configuration section via button)\n    - You have the ability to select a separate storage class for any Cross Region Replication destination bucket\n    - CRR does NOT replicate existing objects, only future objects meaning that only objects stored post turning the feature on will be replicated\n    - Any object that already exists at the time of turning CRR on, will NOT be automatically replicated\n    - Versioning integrates with life-cycle management and also supports MFA delete capability. This will use MFA to provide additional security against object deletion\n- Life-cycle Management:\n    - When clicking on Life-cycle, and adding a rule, a rule can be applied to either the entire bucket or a single 'folder' in a bucket\n    - Rules can be set to move objects to either separate storage tiers or delete them all together\n    - Can be applied to current version and previous versions\n    - If multiple actions are selected for example transition from STD to IA storage 30 days after upload, and then Archive 60 days after upload is also selected, once an object is uploaded, 30 days later the object will be moved to IA storage. 30 days after that the object will be moved to glacier. \n    - Calculates based on UPLOAD date not Action data\n    - Transition from STD to IA storage class requires MINIMUM of 30 days. You can not select or set any data range less than 30 days\n    - Archive to Glacier can be set at a minimum of 1 day If STD->IA is NOT set\n    - If STD->IA IS set, then you will have to wait a minimum of 60 days to archive the object because the minimum for STD->IA is 30 days, and the transition to glacier then takes an additional 30 days\n    - When you enable versioning, there will be 2 sections in life-cycle management tab. 1 for the current version of an object, and another for previous versions\n    - Minimum file size for IA storage is 128K for an object\n    - Can set policy to permanently delete an object after a given time frame\n    - If versioning is enabled, then the object must be set to expire, before it can be permanently deleted\n    - Can not move objects to Reduced Redundancy using life-cycle policies\n- S3 Transfer Acceleration:\n    - Utilizes the CloudFront Edge Network to accelerate your uploads to S3\n    - Instead of uploading directly to your S3 bucket, you can use a distinct URL to upload directly to an edge location which will then transfer the file to S3\n    - Transfer Acceleration URLs will have the format of bucketname.s3-accelerate.amazonaws.com\n    - There is a test utility available that will test uploading direct to S3 vs through Transfer Acceleration, which will show the upload speed from different global locations\n    - Turning on and using Transfer Acceleration will incur an additional fee\n- 2 types of encryption available:\n    - In transit:\n        - Uses SSL/TLS to encrypt the transfer of the object\n    - At Rest (AES 256):\n        - Server Side: S3 Manged Keys (SSE-S3)\n        - Server Side: AWS Key Management Service, Managed Keys (SSE-KMS)\n        - Server Side: Encryption with Customer provided Keys (SSE-C)\n        - Client Side Encryption\n- Pricing (What your charged for when using S3):\n    - Storage used\n    - Number of Requests\n    - Data Transfer\n\n<br>\n\n__Developer Associate Specific Topics__\n\n<br>\n\n- Web Hosting:\n    - Used for static hosting only; Server side code will not execute\n    - Don't need to worry about scaling, ELBs or number of instances, S3 handles all of that for you\n    - When you create an S3 bucket or enable hosting, you still need to make sure that either the files or the entire bucket are set to public accesibility\n    - Bucket URLs are structured such as https://s3-eu-west-1.amazonaws.com/somebucketname\n    - Hosted site URLs are structured as http://somebucketname.s3-website-eu-west-1.amazonaws.com\n    - Hosting sites on S3 does not allow HTTPS support\n    - Sites hosted on S3 can be served via HTTPS if distributed by cloudfront; Cloudfront would be configured to terminate a client HTTPS requst, and then talk to the bucket via standard HTTP\n    - Can be configured to redirect to another URL\n- CORS Configuration:\n    - Cross Origin Resource Sharing (CORS)\n    - Configured in the permisssions section of the properties tab in a bucket\n    - CORS configuration is in XML format and will be pasted directly into the permissions\n    - CORS is required if you are calling an asset that resides in another bucket from the bucket that your static site resides in using the hosted URL\n\n<br>\n\n| Resource or Operation                                   | Default Limit        |\n| -------------                                           |-------------         |\n| Buckets per account:                                    | 100                  |\n| Largest files size you can transfer with PUT request:   | 5GB                  |\n| Minimum file size:                                      | 1 byte               |\n| Maximum file size:                                      | 5 TB                 |\n\nFor additional information about API Gateway Limits, see [Limits in Amazon S3](http://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html)\n\n<br>\n\n> [__CloudFront:__](https://aws.amazon.com/cloudfront/)\n\nAmazon CloudFront is a global content delivery network (CDN) service that accelerates delivery of your websites, APIs, video content or other web assets. <br><br>\n\n- This topic is covered in [AWS Solutions Architect Study Guide](aws_saa_notes.md)\n- Edge Location is the location where content will be cached, separate from an AWS Region/AZ\n- Origin is the origin of all files, can be S3, EC2 instance, a ELB, or Route53\n- Distribution is the name given to the CDN which consists a collection of edge locations\n- Web Distributions are used for websites\n- RTMP - (Real-Time Messaging Protocol) used for streaming media typically around adobe flash files\n- Edge locations can be R/W and will accept a PUT request on an edge location, which then will replicate the file back to the origin \n- Objects are cached for the life of the TTL (24 hours by default)\n- You can clear objects from edge locations, but you will be charged\n- When enabling cloudfront from an S3 origin, you have the option to restrict bucket access; this will disable the direct link to the file in the S3 bucket, and ensure that the content is only served from cloudfront\n- The path pattern uses regular expressions\n- You can restrict access to your distributions using signed URLS\n- You can assign Web Application Firewall rules to your distributions\n- Distribution URLs are going to be non-pretty names such as random_characters.cloudfront.com; you can create a CNAME that points to the cloudfront name to make the URL user friendly\n- You can restrict content based on geographical locations in the behaviors tab\n- You can create custom error pages via the error pages tab\n- Purging content is handled in the Invalidations tab\n\n<br>\n\n| Resource or Operation                             | Default Limit        |\n| -------------                                     |-------------         |\n| Data transfer rate per distribution:              | 40 Gbps              |\n| Requests per second per distribution:             | 100,000              |\n| Web distributions per account:                    | 200                  |\n| RTMP distributions per account:                   | 100                  |\n| Alternate domain names (CNAMEs) per distribution: | 100                  |\n| Origins per distribution:                         | 25                   |\n| Cache behaviors per distribution:                 | 25                   |\n| White-listed headers per cache behavior:          | 10                   |\n| White-listed cookies per cache behavior:          | 10                   |\n| SSL certificates per account when serving HTTPS requests using dedicated IP addresses (no limit when serving HTTPS requests using SNI):  | 2  |\n| Custom headers that you can have Amazon CloudFront forward to the origin:  | 10 name–value pairs |\n\nFor additional information about CloudFront Limits, see [Limits in Amazon CloudFront](http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/cloudfront-limits.html)\n\n<br>\n\n# Databases:\n-------\n\n> [__DynamoDB (No-SQL):__](https://aws.amazon.com/dynamodb/)\n\nFast and flexible NoSQL DB service for all apps that need consistent, single-digit millisecond latency at any scale. It is a fully managed database and supports both document and key-value data models. Its flexible data model and reliable performance make it a great fit for mobile, web, gaming, ad-tech, IoT, and many other applications. <br><br>\n\n- This topic is covered in [AWS Solutions Architect Study Guide](aws_saa_notes.md)\n- Non Relational DB (No-SQL), comprised of collections (tables), of documents (rows), with each document consisting of key/value pairs (fields)\n- Document oriented DB\n- Offers push button scaling, meaning that you can scale your db on the fly without any downtime\n- RDS is not so easy, you usually have to use a bigger instance size or add read replicas\n- Stored on SSD Storage\n- Spread across 3 geographically distinct data centers\n- Eventual Consistent Reads (Default)\n    - Consistency across all copies of data is usually reached within 1 second\n    - Repeating a read after a short time should return updated data\n    - Best Read Performance\n- Strongly Consistent Reads\n    - Returns a result that reflects all writes that received a successful response prior to the read\n- Structure:\n    - Tables\n    - Items (Think rows in a traditional table)\n    - Attributes (Think columns of data in a table)\n- Provisioned throughput capacity\n- Write throughput 0.0065 per hour for every 10 units\n- Read throughput 0.0065 per hour for every 50 units\n- First 25 GB of storage is free\n- Storage costs of 25 cents per additional GB per Month\n- Can be expensive for writes, but really really cheap for reads\n- The combined key/value size must not exceed 400 KB for any given document\n\n<br>\n\n__Developer Associate Specific Topics__\n\n<br>\n\n- Supports attribute nesting up to 35 levels\n- Conditional writes are idempotent, you can send the same conditional write request multiple times, but it will have no further effect on the item after the first time Dynamo performs the update\n- Supports atomic counters, using the UpdateItem operation to increment or decrement the value of an existing attribute without interfering with other write requests\n- Atomic counter updates are not idempotent, the counter will increment each time you call UpdateItem\n- If you can have a small margin of error in your data, then use atomic counters\n- If your application needs to read multiple items, you can use the BatchGetItem API endpoint; A single request can retrieve up to 1MB of data with as many as 100 items\n- A single BatchGetItem request can retrieve items from multiple tables\n- All write requests are applied in the order in which they are received\n- Pricing (calculate the amount of writes and reads per second):\n    - Divide total number of writes per day / 25 (hours) / 60 (minutes) / 60 (seconds) = No. writes per second\n    - A write or read capacity unit can handle 1 write/read per second\n    - Individual items or the entire table can be exported to CSV\n    - Example:\n        - Using 28 GB of storage\n        - 1,000,000 writes per day = 1,000,000/24 = 41,666.67\n        - 41,666.67 / 60 (minutes) = 694.44\n        - 694.44 / 60 (seconds) = 11.574 writes per second\n        - This example would require 12 write capacity units (single capacity unit is 1 write per second)\n        - Charge for write is $0.0065 per 10 units\n        - $0.0065 / 10 = $0.00065 per unit\n        - $0.00065 * 12 (required write units) = $0.0078\n        - $0.0078 * 24 (hours per day) = $0.1872 per day for writes\n        - Charge for read is $0.0065 per 50 units\n        - $0.0065 / 50 = $0.00013 per unit\n        - $0.00013 * 12 (required read units) = $0.00156\n        - $0.00156 * 24 (hours per day) = $0.03744 per day for reads\n        - Using 28 GB storage with first 25 GB free = 3 GB storage required\n        - 3 GB * $0.25 per GB (after initial 25) = $0.75\n- Indexes:\n    - Primary Key types:\n        - Single attribute (unique ID):\n            - Partition Key (Hash Key composed of one attribute)\n            - Partition Key's value is used as input to an internal hash function which output determines the partition (physical location in which the data is stored)\n            - No 2 items in a table can have the same partition key value\n        - Composite (unique ID and date range):\n            - Partition Key & Sort Key (Hash and Range) composed of two attributes\n            - Partition Key's value is used as input to an internal hash function which output determines the partition (physical location in which the data is stored)\n            - 2 Items can have the same partition key, but they MUST have a different sort key\n            - All Items with the same partition key are stored together, in sorted order by the sort key value\n    - Local Secondary Index (LSI):\n        - Has the SAME partition key, but different sort key\n        - Can ONLY be created when creating a table\n        - Can not be removed or modified after creation\n        - Can have up to 5 LSI's per table\n    - Global Secondary Index (GSI):\n        - Has DIFFERENT partition key and different sort key\n        - Can be created at table creation or added LATER\n        - Can have up to 5 GSI's per table\n- Streams:\n    - Used to capture any kind of modification of the DynamoDB tables\n    - If new item is added to the table, the stream captures an image of the entire item, including all of its attributes\n    - If an item is updated, the stream captures the before and after image of any attributes that were modified in the item\n    - If an item is deleted from the table, the stream captures an image of the entire item before it was deleted\n    - Streams are stored for 24 hours and then is lost\n    - Streams can trigger functions with Lambda that will perform actions based on the instantiation of a stream event\n- Query's:\n    - Operation that finds items in a table using only the primary key attribute value\n    - Must provide a partition attribute name and distinct value to search for\n    - Optionally can provide a sort key attribute name and value and use comparison operator to refine the search results\n    - By default a query returns all of the data attributes for items with the specified primary key(s)\n    - The ProjectionExpression parameter can be used to only return some of the attributes from a query as opposed to the default all\n    - Results are always sorted by the sort key\n    - If the data type of the sort key is a number, the results are returned in numeric order\n    - If the data type of the sort key is a string, the results are returned in order of ASCII character code values\n    - Sort order is ascending, the ScanIndexForward parameter can be set to false to sort in descending order\n    - By default queries are eventually consistent but can be changed to strongly consistent\n    - More efficient then a scan operation\n    - For quicker response times, design your tables in a way that can use the query, GET, or BatchGetItem API\n- Scans:\n    - Examines every item in the table\n    - By default, a scan returns all of the data attributes for every item\n    - Can use the ProjectionExpression parameter so that the scan only returns some of the attributes, instead of all\n    - Always scans the entire table, then filters out values to provide the desired result (added step of removing data from initial dataset)\n    - Should be avoided on a large table with a filter that removes many results\n    - As table grows, the scan operation slows\n    - Examines every item for the requested values, and can use up provisioned throughput for a large table in a single operation\n- Provisioned Throughput\n    - 400 HTTP status code - ProvisionedThroughputExceededException error will indicate that you exceeded your max allowed provisioned throughput for a table or for one or more GSI's\n    - Unit of read provisioned throughput:\n        - All reads are rounded up to increments of 4 KB\n        - Eventual consistent reads (default) consist of 2 reads per second\n        - Strongly consistent reads consist of 1 read per second\n        - Take the (size of the read rounded to the nearest 4 KB chunk / 4 KB) * No. of items = read throughput\n        - Divide by 2 if eventually consistent\n        - Example:\n            - Application requires to read 10 items of 1 KB per second using eventual consistency, whats the read throughput\n            - Calculate the number of read units per item needed\n            - 1 KB rounded to the nearest 4 KB increment = 4 (KB) or a single chunk\n            - 4 KB / 4 KB = 1 read unit per item\n            - 1 x 10 read items = 10\n            - Using eventual consistency is 10 /2 = 5\n            - 5 units of read throughput\n        - Example 2:\n            - Application requires to read 10 items of 6 KB per second using eventual consistency, whats the read throughput\n            - Calculate the number of read units per item needed\n            - 6 KB rounded to the nearest 4 KB increment = 8 (KB) or 2 chunks of 4 KB\n            - 8 KB / 4 KB = 2 read unit per item\n            - 2 x 10 read items = 20\n            - Using eventual consistency is 20 /2 = 10\n            - 10 units of read throughput\n    - Unit of write provisioned throughput:\n        - All writes are 1 KB\n        - All writes consist of 1 write per second\n        - Example:\n            - Application requires to write 5 items with each being 10KB in size per second\n            - Each write unit consists of 1 KB of data, need to write 5 items per second with each item using 10 KB of data\n            - 5 items * 10 KB = 50 write units\n            - Write throughput is 50 units\n        - Example 2:\n            - Application requires to write 12 items with each being 100KB in size per second\n            - Each write unit consists of 1 KB of data, need to write 12 items per second with each item using 100 KB of data\n            - 12 items * 100 KB = 1200 write units\n            - Write throughput is 1200 units\n- Web Identity Providers:\n    - Authenticate users using Web Identity Providers such as Facebook, Google, Amazon or any other ID Connect-compatible identity provider\n    - Accomplished using AssumeRoleWithWebIdentity API\n    - Need to create a role first\n    - Process:\n        - User authentication request sent and received with the identity provider such as Facebook, Google, etc..\n        - Web Identity token returned from provider\n        - Token, App ID of provider, and ARN of IAM Role sent to AssumeRoleWithIdentity API endpoint\n        - AWS issues temporary security credentials back to the user allowing the user to access resources (1 hour default)\n        - Temporary security credentials response consist of 4 things:\n            - AccessKeyID, SecretAccessKey, SessionToken\n            - Expiration (time limit, 1 hour by default)\n            - AssumeRoleID\n            - SubjectFromWebIdentityToken\n\n<br>\n\n| US East (N. Virginia) Region                                  | Default Limit                                                  |\n| -------------                                                 |-------------                                                   |\n| Maximum capacity units per table or global secondary index:   | 40,000 read capacity units and 40,000 write capacity units     |\n| Maximum capacity units per account:                           | 80,000 read capacity units and 80,000 write capacity units     |\n\n<br>\n\n| All Region Resource or Operation                              | Default Limit                                                  |\n| -------------                                                 |-------------                                                   |\n| Maximum capacity units per table or global secondary index:   | 10,000 read capacity units and 10,000 write capacity units     |\n| Maximum capacity units per account:                           | 20,000 read capacity units and 20,000 write capacity units     |\n| Maximum number of tables:                                     | 256                                                            |\n\nFor additional information about DynamoDB Limits, see [Limits in Amazon DynamoDB](http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html)\n\n<br>\n\n# Security and Identity:\n-------\n\n> [__IAM (Identity and Access Management):__](https://aws.amazon.com/iam/)\n\nAWS Identity and Access Management (IAM) enables you to securely control access to AWS services and resources for your users. <br><br> \n\n- This topic is covered in [AWS Solutions Architect Study Guide](aws_saa_notes.md)\n- Allows for centralized control and shared access to your AWS Account and/or AWS services\n- By default when you create a user, they have NO permissions to do anything\n- Root account has full admin access upon account creation\n- Not region specific, can be shared between all regions\n- Granular permission sets for AWS resources\n- Includes Federation Integration which taps into Active Directory, Facebook, Linkedin, etc. for authentication\n- Multi-factor authentication support\n- Allows configuration of temporary access for users, devices and services\n- Set up and manage password policy and password rotation policy for IAM users\n- Integration with many different AWS services\n- Supports PCI DSS compliance\n- Access can be applied to:\n    - Users - End users (people)\n    - Groups - Collection of users under one set of permissions\n    - Roles - Assigned to AWS resources, specifying what the resource (such as EC2) is allowed to access on another resource (S3)\n    - Policies - Document that defines one or more permissions\n- Policies can be applied to users, groups and roles\n- You can assign up to 10 policies to a single group\n- Policy documents must have a version, and a statement in the body; The statement must consist of Effects (Allow, Deny), Actions(Which action to allow/deny such a * for all actions), and Resources (affected resources such as * for all resources)\n- All resources can share the same policy document\n- There are 3 different types of roles:\n    - Service Roles\n    - Cross account access roles\n        - Used when you have multiple AWS accounts and another AWS account must interact with the current AWS account\n    - Identity provider access roles\n        - Roles for facebook or similar Identity providers\n- In order for a new IAM user to be able to log into the console, the user must have a password set\n- By default a new users access is only accomplished through the use of the access key/secret access key\n- If the users password is a generated password, it also will only be shown at the time of creation.\n- Customizable Console Sign-in link can be configured on the main IAM page (aws.yourdomain.com)\n- Customizable Console Sign-in links must be globally unique. If a sign in link name is already taken, you must choose an alternative\n- Root account is email address that you used to register your account\n- Recommended that root account is not used for login, and should be secured with Multi-factor Authentication (MFA)\n- Can create Access Keys/ Secret Access Keys to allow IAM users (or service accounts) to be used with AWS CLI or API calls\n- Access Key ID is equivalent to a user-name, Secret Access Key is equivalent to a password\n- When creating a user's credentials, you can only see/download the credentials at the time of creation not after.\n- Access Keys can be retired, and new ones can be created in the event that secret access keys are lost\n- To create a user password, once the users have been created, choose the user you want to set the password for and from the User Actions drop list, click manage password. Here you can opt to create a generated or custom password. If generated, there is an option to force the user to set a custom password on next login. Once a generated password has been issued, you can see the password which is the same as the access keys. Its shown once only\n- Click on Policies from the left side menu and choose the policies that you want to apply to your users. When you pick a policy that you want applied to a user, select the policy, and then from the top Policy Actions drop menu, choose attach and select the user that you want to assign the policy to\n\n<br>\n\n| Resource or Operation                                   | Default Limit        |\n| -------------                                           |-------------         |\n| Groups per account:                                     | 100                  |\n| Instance profiles:                                      | 100                  |\n| Roles:                                                  | 250                  |\n| Server Certificates:                                    | 20                   |\n| Users:                                                  | 5000                 |\n| Number of policies allowed to attach to a single group: | 10                   |\n\nFor additional information about API Gateway Limits, see [Limits in IAM entities and objects](http://docs.aws.amazon.com/IAM/latest/UserGuide/LimitationsOnEntities.html)\n\n<br>\n\n> [__Directory Service:__](https://aws.amazon.com/directoryservice/)\n\nAWS Directory Service makes it easy to setup and run Microsoft Active Directory (AD) in the AWS cloud, or connect your AWS resources with an existing on-premises Microsoft Active Directory. <br><br>\n\n- Active Directory flow is initialted when a user browses to the ADFS integrated site:\n    - The sign-on page will authenticate the user against Active Directory\n    - Depending on the browser used, the user may be promted to input their AD username/password\n    - The users browser receives a SAML (Secure Assertive Markup Language) assertion in the form of an auth response from AD Federation Services (ADFS)\n    - The users browser posts the SAML assertion to the AWS sign-in endpoint for SAML\n    - The AWS console uses the AssumeRoleWithSAML API to request temporary security credentials and then constructs a sign-in URL for the AWS Console\n    - The users browser receives the sign-in URL and is redirected to the conole\n    - The process is transparent to the user; They start at an interanl web site and end up on the console without having to supply credentials\n    - Remember the API call to request temporary security credentials from the AWS platform is __AssumeRoleWithSAML__\n    - The sign-in endpoint for SAML is https://signin.aws.amazon.com/saml\n- When using ADFS the user always authenticates with AD first before recieving security credentials\n- Web Identity Federation:\n    - Allows users to authenticate your application with Facebook, LinkedIn, Google, or your AWS account\n    - The AWS console has a link to a Web Identity Federation Playground, that allows you to test logins using services such as FB, LinkedIn, etc...\n    - Once logged in using the playground, you get a response containing an accessToken that is good for 5016 seconds\n    - This went to the service such as FB, authenticated with the service, recieved an accessToken, using the token, AWS will grant temporary security credentials by making an AssumeRoleWithWebIdentity request\n    - When the AssumeRoleWithWebIdentity request is formed, a trust policy is created granting all access via the recieved accessToken\n    - Authenticate with web service (facebook, etc..) first, then get temporary security credentials via AccessToken sent to AssumeRoleWithWebIdentity request, and finally with the temporary security credentials, user is able to access AWS resources\n    - Remember the API call to request temporary security credentials from the AWS platform is __AssumeRoleWithWebIdentity__\n\n<br>\n\n# Management Tools:\n-------\n\n> [__Cloud Formation:__](https://aws.amazon.com/cloudformation/)\n\nAWS CloudFormation gives developers and systems administrators an easy way to create and manage a collection of related AWS resources, provisioning and updating them in an orderly and predictable fashion. <br><br>\n\n- This topic is covered in [AWS Solutions Architect Study Guide](aws_saa_notes.md)\n- Deploy application as stacks. Much like a docker-compose file for docker\n- Can be written in either JSON or YAML\n- Free service, however resources created by CloudFormation are subject to normal pricing\n- Fn::GetAtt is a function that will allow you to get attributes of newly launched resources from CloudFormation such as DNS name, IP address, etc..\n- If errors are encountered the stack launch will terminate and rollback all resources that were created\n\n<br>\n\n| Resource or Operation                                    | Default Limit        |\n| -------------                                            |-------------         |\n| Stacks:                                                  | 200                  |\n\nFor additional information about Cloud Formation Service Limits, see [Limits in Amazon CloudFormation](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html)\n\n<br>\n\n\n# Application Services:\n-------\n\n> [__SQS (Simple Queue Service):__](https://aws.amazon.com/sqs/)\n\nWeb service that gives you access to a message queue that can be used to store messages while waiting for a computer to process them. SQS is a distributed queue system that enables applications to quickly and reliably queue messages that one component of the application generates to be consumed by another component. A queue is a temp repository for messages that are awaiting processing. <br><br>\n\n- This topic is covered in [AWS Solutions Architect Study Guide](aws_saa_notes.md)\n- Used to allow customers the ability to decouple infrastructure components\n- Very first service AWS released. Even older then EC2\n- Messages can contain up to 256 KB of text in any format\n- Acts as a buffer between the component producing and saving data, and the component receiving and processing the data\n- Ensures deliver of each message at least once and supports multiple readers and writers interacting with the same queue\n- A single queue can be used simultaneously by many distributed application components, with no need for those components to coordinate or communicate with each other\n- Will always be available and deliver messages\n- Does not guarantee FIFO delivery of messages\n- Messages can be delivered multiple times and in any order\n- FIFO is not supported\n- If sequential processing is a requirement, sequencing information can be placed in each message so that message order can be preserved\n- SQS always asynchronously PULLs messages from the queue\n- Retention period of 14 days\n- 12 hour visibility timeout by default\n- If you find that the default visibility timeout period (12 hours) is insufficient to fully process and delete the message, the visibility timeout can be extended using the ChangeMessageVisibility action\n- If the ChangeMessageVisibility action is specified to set an extended timeout period, SQS restarts the timeout period using the new value\n- Engineered to provide delivery of all messages at least one\n- Default short polling will return messages immediately if messages exist in the queue\n- Long polling is a way to retrieve messages from a queue as soon as they are available; long polling requests don't return a response until a message arrives in the queue\n- Maximum long poll time out is 20 seconds\n- 256kb message sizes (originally 64kb)\n- Billed for 64kb chunks\n- First million messages free, then $.50 per additional million thereafter\n- Single request can have from 1 to 10 messages, up to a max payload of 256KB\n- Each 64KB chunk of payload is billed as 1 request. If you send a single API request with a 256KB payload, you will be billed for 4 requests (256/64 KB chunks)\n- \"Decouple\" = SQS on exam\n- Auto-scaling supported\n- Message prioritization is not supported\n- Process:\n    - Component 1 sends a message to the queue\n    - Component 2 retrieves the message from the queue and starts the visibility timeout period\n    - Visibility timer only starts when the message is picked up from the queue\n    - Component 2 processes the message and then deletes it from the queue during the visibility timeout period\n    - If the visibility timeout period expires, the message will stay in the queue and not be deleted\n    - The process is only complete when the queue receives the command to delete the message from the queue\n\n<br>\n\nFor additional information about SQS Limits, see [Limits in Amazon SQS](http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-limits.html)\n\n<br>\n\n> [__SWF (Simple Workflow Service)__](https://aws.amazon.com/swf/)\n\nSimple Workflow Service is a web service that makes it easy to coordinate work across distributed application components. Enabled for a range of uses such as media processing, web back ends, business process work-flows, and analytics pipelines, all to be designed as a coordination of tasks. Tasks represent invocations of various processing steps in an application which can be performed by code, API calls, human action and scripts. <br><br>\n\n- This topic is covered in [AWS Solutions Architect Study Guide](aws_saa_notes.md)\n- Build, run and scale background jobs or tasks that have sequential steps\n- Way to process human oriented tasks using a framework\n- SQS has a retention period of 14 days, vs SWF has up to a 1 year for work-flow executions\n- Workflow retention is always shown in seconds (3.1536E+07 seconds)\n- \"Task could take a month\" = SWF, as SQS only has a 14 day retention\n- Presents a task-oriented API, whereas SQS offers a message-oriented API\n- Ensures a teaks is assigned only once and is never duplicated; SQS duplicate messages are allowed, and must be handled\n- Keeps track of all tasks and events in an application, SQS would need an implementation of a custom application-level tracking mechanism\n- A collection of work-flows is referred to as a domain\n- Domains isolate a set of types, executions, and task lists from others within the same account\n- You can register a domain by using the AWS console or using the RegisterDomain action in the SWF API\n- Domain parameters are specified in JSON format\n- SWF Actors:\n    - Workflow starters - An application that can initiate a Workflow\n    - Decider's - Control the flow or coordination of activity tasks such as concurrency, or scheduling in a work-flow execution; If something has finished in a work-flow (or fails), a decider decides what to do next\n    - Activity Workers - Programs that interact with SWF to get tasks, process received tasks, and return the results\n- Brokers the interactions between workers and the decider; Allows the decider to get consistent views into the progress of tasks and to initiate new tasks in an ongoing manner\n- Stores tasks, assigns them to workers when they are ready and monitors their progress\n- Ensures that a task is assigned only once and is never duplicated\n- Maintains the application state durably, workers and decider's don't have to keep track of the execution state, and can run independently, with the ability to scale quickly\n\n<br>\n\nFor additional information about SWF Limits, see [Limits in Amazon SWF](http://docs.aws.amazon.com/amazonswf/latest/developerguide/swf-dg-limits.html)\n\n<br>\n\n# Mobile Services:\n-------\n\n> [__SNS (Simple Notification Service):__](https://aws.amazon.com/sns/)\n\nSimple Notification Service is a web service that makes it easy to set up, operate, and send notifications from the cloud. It provides developers with a highly scalable, flexible, and cost-effective capability to publish messages from an application and immediately deliver them to subscribers or other applications. <br><br>\n\n- Web service that allows customers to setup, operate, and send notifications from the cloud\n- Can push to Apple, Google, FireOS, and Windows devices, as well as Android devices in China with Baidu cloud push\n- Follows the publish-subscribe (pub-sub) messaging paradigm, with notifications being delivered to clients using a push mechanism that eliminates the need to poll for updates\n- Can deliver notifications by SMS, email, SQS queues, or any HTTP endpoint\n- SNS notifications can be used to trigger lambda functions\n- When a message is published to an SNS topic that has a lambda function subscribed to it, the function is invoked with the payload of the published message. The lambda function would receive the message payload as an input parameter, and can manipulate the info in the message, publish the message to other SNS topics or send the message to other AWS services\n- Allows you to group multiple recipients using topics\n- Topics are access points for allowing recipients to dynamically subscribe for copies of the notification\n- One topic can support deliveries to multiple endpoint types, for example, IOS, Android, and SMS recipients can be grouped together\n- When message is published, SNS delivers appropriately formatted copies of your message to each subscriber\n- Email notifications will be JSON formated not XML\n- Subscriptions have to be confirmed\n- Subscription expire after 3 days if they are not confirmed\n- TTL is the number of seconds since the message was published\n- If the message is not delivered within the TTL time, then the message will expire\n- To prevent messages from being lost, all messages published to SNS are stored redundantly across multiple AZ's\n- Instantaneous, PUSH based delivery (No Polling) --> SQS requires polling\n- Simple API and easy integration with applications\n- Flexible message deliver over multiple transport protocols\n- Inexpensive, pay as you go model\n- Web based AWS management console offers simplicity of point and click interface\n- $.50 per million SNS requests\n- $.06 per 100,000 notification deliveries over HTTP\n- $0.75 per 100 notifications over SMS\n- $2.00 per 100,000 notification deliveries over email\n- Can be used in conjunction with SQS to fan a single message out to multiple SQS queues\n- Remember:\n    - SNS - PUSH\n    - SQS - PULL (poll)\n- Subscribers:\n    - HTTP\n    - HTTPS\n    - Email\n    - Email-JSON\n    - SQS\n    - Application\n    - Lambda\n    - Messages can be customized for each of the available protocols\n\n<br>\n\n| Resource or Operation                         | Default Limit           |\n| -------------                                 |-------------            |\n| Topics :                                      | 100,000                 |\n| Account spend threshold for SMS:              | 50 USD                  |\n| Delivery rate for promotional SMS messages:   | 20 Messages per second  |\n| Delivery rate for transactional SMS messages: | 20 Messages per second  |\n\n<br>\n\n# White Paper Review:\n-------\n\n- Shared security model\n    - AWS:\n        - Responsible for securing the underlying infrastructure\n        - Responsible for protecting the global infrastructure that runs all of the services offered on the AWS cloud.\n        - Infrastructure comprised of hardware, software, networking, and facilities that run AWS services\n        - Responsible for the security configuration of its products that are considered managed services, such as DynamoDB, RDS, Redshift, Elastic MapReduce, lambda, and Workspaces.\n    - User:\n        - Responsible for anything put on the cloud\n        - EC2, VPC, S3 security configuration and management tasks\n        - Account Management (MFA, SSL, TLS, CloudTrail API/User activity logging)",
      "json_metadata": "{\"tags\":[\"aws\",\"certifications\",\"study\"],\"image\":[\"https://s3.amazonaws.com/clusterfrak.com/img/vendor/amazon_web_services.png\"],\"links\":[\"https://aws.amazon.com/\",\"https://aws.amazon.com/s3/\",\"aws_saa_notes.md\",\"https://s3-eu-west-1.amazonaws.com/myawesomebucket\",\"https://s3-eu-west-1.amazonaws.com/somebucketname\",\"http://somebucketname.s3-website-eu-west-1.amazonaws.com\",\"http://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html\",\"https://aws.amazon.com/cloudfront/\",\"http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/cloudfront-limits.html\",\"https://aws.amazon.com/dynamodb/\",\"http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html\",\"https://aws.amazon.com/iam/\",\"http://docs.aws.amazon.com/IAM/latest/UserGuide/LimitationsOnEntities.html\",\"https://aws.amazon.com/directoryservice/\",\"https://signin.aws.amazon.com/saml\",\"https://aws.amazon.com/cloudformation/\",\"http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html\",\"https://aws.amazon.com/sqs/\",\"http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-limits.html\",\"https://aws.amazon.com/swf/\",\"http://docs.aws.amazon.com/amazonswf/latest/developerguide/swf-dg-limits.html\",\"https://aws.amazon.com/sns/\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
2017/07/02 23:57:21
voterrnason
authorrnason
permlinkaws-developer-associate-exam-notes-part-1
weight10000 (100.00%)
Transaction InfoBlock #13344645/Trx d766919d12319629696cb5ea2009d96029a2997d
View Raw JSON Data
{
  "trx_id": "d766919d12319629696cb5ea2009d96029a2997d",
  "block": 13344645,
  "trx_in_block": 11,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-02T23:57:21",
  "op": [
    "vote",
    {
      "voter": "rnason",
      "author": "rnason",
      "permlink": "aws-developer-associate-exam-notes-part-1",
      "weight": 10000
    }
  ]
}
2017/07/02 23:57:21
parent author
parent permlinkaws
authorrnason
permlinkaws-developer-associate-exam-notes-part-1
titleAWS Developer Associate Exam Notes Part 1
body# AWS Developer Associate Exam Notes <br> <center> ![Amazon Web Services](https://s3.amazonaws.com/clusterfrak.com/img/vendor/amazon_web_services.png) <br> For more information on AWS, visit [aws.amazon.com](https://aws.amazon.com/) </center> <br> # Description ------- Notes and information that were collected while studying and prepping for the AWS Developer Associate Exam. <br> <br> | Topic | Answer | | ------------- |------------- | | Exam Time: | 80 Minutes | | No. Questions: | 60 Questions | | Question Types: | Scenario and Multiple Choice | | Passing Score: | ~ 70% | | Validity Period: | 2 years | | Renewal Exam: | 1/2 price off | <br> # PreRequiste Assumptions Note: --------- <div class='alert alert-warning'> <i class='fa fa-info-circle'></i> &nbsp;&nbsp; StudyGuide Note: <br> This study guide builds upon the AWS Solutions Architect Study Guide under the Notes section. You should reference that study guide and use this studyguide for additional information required for the AWS Developer Associate Exam.</div> <br> # General --------- > Amazon Web Services SDK's: - Android, IOS, JavaScript (Browser) - Java - .NET - Node.js - PHP - Python - Ruby - Go - C++ <br> > Default Regions: - US-EAST-1 - Java has default region - Some languages such as Node.js do not have a default region <br> # Service Limits: --------- Each service has the default limits defined, to see the official AWS documentation on service limits, [check here](http://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html) <br> # Networking: ------- > [__VPC (Virtual Private Cloud):__](https://aws.amazon.com/vpc/) Lets you provision a logically isolated section of the AWS Cloud where you can launch AWS resources in a virtual network that you define. You have complete control over your virtual networking, IP ranges, creation of subnets and configuration of route tables and network gateways. <br><br> - This topic is covered in [AWS Solutions Architect Study Guide](aws_saa_notes.md) - Virtual data center in the cloud - Allowed up to 5 VPCs in each AWS region by default - All subnets in default VPC have an Internet gateway attached - Multiple IGW's can be created, but only a single IGW can be attached to a VPC - Each EC2 instance has both a public and private IP address - If you delete the default VPC, the only way to get it back is to submit a support ticket - By default when you create a VPC, a default main routing table automatically gets created as well. - Subnets are always mapped to a single AZ's - Subnets can not be mapped to multiple AZ's - /16 is the largest CIDR block available when provisioning an IP space for a VPC - Amazon uses 3 of the available IP addresses in a newly created subnet - x.x.x.0 - Always subnet network address and is never usable - x.x.x.1 - Reserved by AWS for the VPC router - x.x.x.2 - Reserved by AWS for subnet DNS - x.x.x.3 - Reserved by AWS for future use - x.x.x.255 - Always subnet broadcast address and is never usable. - 169.254.169.253 - Amazon DNS - By default all traffic between subnets is allowed - By default not all subnets have access to the Internet. Either an Internet Gateway or NAT gateway is required for private subnets - You can only have 1 Internet gateway per VPC - A security group can stretch across different AZ's - You can also create Hardware Virtual Private Network (VPN) connection between your corporate data center and your VPC and leverage the AWS cloud as an extension of your corporate data center - Network Address Translation (NAT) Instances: - When creating a NAT instance, disable Source/Destination checks on the instance or you could encounter issues - NAT instances must be in a public subnet - There must be a route out of the private subnet to the NAT instance in order for it to work - The amount of traffic that NAT instances support depend on the size of the NAT instance - If you are experiencing any sort of bottleneck issues with a NAT instance, then increase the instance size - HA can be achieved by using Auto-scaling groups, or multiple subnets in different AZ's with a scripted fail-over procedure - NAT instances are always behind a security group - Network Address Translation (NAT) Gateway: - NAT Gateways scale automatically up to 10Gbps - There is no need to patch NAT gateways as the AMI is handled by AWS - NAT gateways are automatically assigned a public IP address - When a new NAT gateway has been created, remember to update your route table - No need to assign a security group, NAT gateways are not associated with security groups - Preferred in the Enterprise - No need to disable Source/Destination checks - Network Access Control Lists (NACLS): - Numbered list of rules that are evaluated in order starting at the lowest numbered rule first to determine what traffic is allowed in or out depending on what subnet is associated with the rule - The highest rule number is 32766 - Start with rules starting at 100 so you can insert rules if needed - Default NACL will allow ALL traffic in and out by default - You must assign a NACL to each subnet, if a subnet is not associated with a NACL, it will allow no traffic in or out - NACL rules are stateless, established in does not create outbound rule automatically - You can only assign a single NACL to a single subnet - VPC Peering: - Connection between two VPCs that enables you to route traffic between them using private IP addresses via a direct network route - Instances in either VPC can communicate with each other as if they are within the same network - You can create VPC peering connections between your own VPCs or with a VPC in another account within a SINGLE REGION - AWS uses existing infrastructure of a VPC to create a VPC peering connection. It is not a gateway nor a VPN, and does not rely on separate hardware - There is NO single point of failure for communication nor any bandwidth bottleneck - There is no transitive peering between VPC peers (Can't go through 1 VPC to get to another) - Hub and spoke configuration model (1 to 1) - Be mindful of IPs in each VPC, if multiple VPCs have the same IP blocks, they will not be able to communicate - You can peer VPC's with other AWS accounts as well as with other VPCs in the same account <br> | Resource or Operation | Default Limit | Comments | | ------------- |------------- |------------- | | VPCs per region: | 5 | The limit for Internet gateways per region is directly correlated to this one. Increasing this limit will increase the limit on Internet gateways per region by the same amount. | | Subnets per VPC: | 200 | | | Internet gateways per region: | 5 | This limit is directly correlated with the limit on VPCs per region. You cannot increase this limit individually; the only way to increase this limit is to increase the limit on VPCs per region. Only one Internet gateway can be attached to a VPC at a time. | | Customer gateways per region: | 50 | | | VPN connections per region: | 50 | | | VPN connections per VPC (per virtual private gateway): | 10 | | | Route tables per VPC: | 5 | Including the main route table. You can associate one route table to one or more subnets in a VPC. | | Routes per route table (non-propagated routes): | 50 | This is the limit for the number of non-propagated entries per route table. You can submit a request for an increase of up to a maximum of 100; however, network performance may be impacted. | | BGP advertised routes per route table (propagated routes): | 5 | You can have up to 100 propagated routes per route table; however, the total number of propagated and non-propagated entries per route table cannot exceed 100. For example, if you have 50 non-propagated entries (the default limit for this type of entry), you can only have 50 propagated entries. This limit cannot be increased. If you require more than 100 prefixes, advertise a default route. | | Elastic IP addresses per region for each AWS account: | 5 | This is the limit for the number of VPC Elastic IP addresses you can allocate within a region. This is a separate limit from the Amazon EC2 Elastic IP address limit. | | Security groups per VPC: | 500 | | | Inbound or outbound rules per security group: | 50 | You can have 50 inbound and 50 outbound rules per security group (giving a total of 100 combined inbound and outbound rules). If you need to increase or decrease this limit, you can contact AWS Support — a limit change applies to both inbound and outbound rules. However, the multiple of the limit for inbound or outbound rules per security group and the limit for security groups per network interface cannot exceed 250. For example, if you want to increase the limit to 100, we decrease your number of security groups per network interface to 2. | | Security groups per network interface: | 5 | If you need to increase or decrease this limit, you can contact AWS Support. The maximum is 16. The multiple of the limit for security groups per network interface and the limit for rules per security group cannot exceed 250. For example, if you want 10 security groups per network interface, we decrease your number of rules per security group to 25. | | Network interfaces per instance: | N/A | This limit varies by instance type. For more information, see [Private IP Addresses Per ENI Per Instance Type](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI). | | Network interfaces per region: | 350 | This limit is the greater of either the default limit (350) or your On-Demand instance limit multiplied by 5. The default limit for On-Demand instances is 20. If your On-Demand instance limit is below 70, the default limit of 350 applies. You can increase the number of network interfaces per region by contacting AWS Support, or by increasing your On-Demand instance limit. | | Network ACLs per VPC: | 200 | You can associate one network ACL to one or more subnets in a VPC. This limit is not the same as the number of rules per network ACL. | | Rules per network ACL: | 20 | This is the one-way limit for a single network ACL, where the limit for ingress rules is 20, and the limit for egress rules is 20. This limit can be increased upon request up to a maximum if 40; however, network performance may be impacted due to the increased workload to process the additional rules. | | Active VPC peering connections per VPC: | 50 | If you need to increase this limit, contact AWS Support . The maximum limit is 125 peering connections per VPC. The number of entries per route table should be increased accordingly; however, network performance may be impacted. | | Outstanding VPC peering connection requests: | 25 | This is the limit for the number of outstanding VPC peering connection requests that you've requested from your account. | | Expiry time for an unaccepted VPC peering connection request: | 1 week (168 hrs) | | | VPC endpoints per region: | 20 | The maximum limit is 255 endpoints per VPC, regardless of your endpoint limit per region. | | Flow logs per single eni, single subnet, or single VPC in a region: | 2 | You can effectively have 6 flow logs per network interface if you create 2 flow logs for the subnet, and 2 flow logs for the VPC in which your network interface resides. This limit cannot be increased. | | NAT gateways per Availability Zone: | 5 | A NAT gateway in the pending, active, or deleting state counts against your limit. | For additional information about VPC Limits, see [Limits in Amazon VPC](http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Appendix_Limits.html) <br> # Compute: ------- > [__EC2 (Elastic Compute Cloud):__](https://aws.amazon.com/ec2/) Elastic Compute Cloud - Backbone of AWS, provides re-sizable compute capacity in the cloud. Reduces the time required to obtain and boot new server instances to minutes allowing you to quickly scale capacity, both up and down, as your computing requirements change. <br><br> - This topic is covered in [AWS Solutions Architect Study Guide](aws_saa_notes.md) - Once an Instance has been launched with instance store storage, you can not attach additional instance store volumes after the instance is launched, only EBS volumes - When using an instance store volume, you can not stop the instance (the option to do so will not be available, as the instance moves to another host and and would cause complete data loss) - When using ephemeral storage, an underlying host failure will result in data loss - You can reboot both instance types (w/ephemeral and EBS volumes) and will not lose data, but again, an ephemeral volume based instance can NOT be stopped - By default both Root volumes will be deleted on termination, however you can tell AWS to keep the root device volume on a new instance during launch - You can poll an instances meta-data by using curl http://169.254.169.254/latest/meta-data/ - You can get an instance's IP address by using curl http://169.254.169.254/latest/meta-data/public-ipv4 - No such thing as user-data, remember its always meta-data not user-data - Can not encrypt root volumes, but you can encrypt any additional volumes that are added and attached to an EC2 instance. - You can have up to 10 tags per EC2 instance - AWS does not recommend ever putting RAID 5's on EBS - When configuring a launch configuration for an auto-scaling group, the Health Check Grace Period is the period of time to ignore health checks while instances or auto-scaled instances are added and booting. - Termination protection is turned off by default, you must turn it on - Roles: - You can only assign an EC2 role to an instance on create. You can not assign a role after the instance has been created and/or is running - You can change the permissions on a role post creation, but can NOT assign a new role to an existing instance - Role permissions can be changed, but not swapped - Roles are more secure then storing your access key and secret key on individual EC2 instances - Roles are easier to manager, You can assign a role, and change permissions on that role at any time which take effect immediately - Roles can only be assigned when that EC2 instance is being provisioned - Roles are universal, you can use them in any region - Instance sizing: - T2 - Lowest Cost General Purpose - Web/Small DBs - M4 - General Purpose - App Servers - M3 - General Purpose - App servers - C4 - Compute Optimized - CPU Intensive Apps/DBs - C3 - Compute Optimized - CPU Intensive Apps/DBs - R3 - Memory Optimized - Memory Intensive Apps/DBs - G2 - Graphics / General Purpose - Video Encoding/Machine Learning/3D App Streaming - I2 - High Speed Storage - NoSQL DBs, Data Warehousing - D2 - Dense Storage - Fileservers/Data Warehousing/Hadoop - D - Density - I - IOPS - R - RAM - T - Cheap General Purpose - M - Main General Purpose - C - Compute - G - Graphics - Storage Types: - Instance Store (Ephemeral): - Also referred to as ephemeral storage and is not persistent - Instances using instance store storage can not be stopped. If they are, data loss would result - If there is an issue with the underlying host and your instance needs to be moved, or is lost, Data is also lost - Instance store volumes cannot be detached and reattached to other instances; They exist only for the life of that instance - Best used for scratch storage, storage that can be lost at any time with no bad ramifications, such as a cache store - EBS (Elastic Block Storage): - Elastic Block Storage is persistent storage that can be used to procure storage to EC2 instances. - You can NOT mount 1 EBS volume to multiple EC2 instances instead you must use EFS - Default action for EBS volumes is for the root EBS volume to be deleted when the instance is terminated - By default, ROOT volumes will be deleted on termination, however with EBS volumes only, you can tell AWS to keep the root device volume - EBS backed instances can be stopped, you will NOT lose any data - EBS volumes can be detached and reattached to other EC2 instances 3 Types of available EBS volumes can be provisioned and attached to an EC2 instance: - General Purpose SSD (GP2): - General Purpose up to 10K IOPS - 99.999% availability - Ratio of 3 IOPS per GB with up to 10K IOPS and ability to burst - Up to 3K IOPS for short periods for volumes under 1GB - Provisioned IOPS SSD (I01) - Designed for I/O intensive applications such as large relational or No-SQL DBs. - Use if need more than 10K IOPS - Magnetic (Standard) - Lowest cost per GB - Ideal for workloads where data is accessed infrequently and apps where the lowest cost storage is important. - Ideal for fileservers - Encryption: - Root Volumes cannot be encrypted by default, you need a 3rd party utility - Other volumes added to an instance can be encrypted. - AMIs: - AMI's are simply snapshots of a root volume and is stored in S3 - AMI's are regional. You can only launch an AMI from the region in which it was stored - You can copy AMI's to other regions using the console, CLI or Amazon EC2 API - Provides information required to launch a VM in the cloud - Template for the root volume for the instance (OS, Apps, etc) - Permissions that control which AWS accounts can use the AMI to launch instances - When you create an AMI, by default its marked private. You have to manually change the permissions to make the image public or share images with individual accounts - Block device mapping that specifies volumes to attach to the instance when its launched - Hardware Virtual Machines (HVM) AMI's Available - Paravirtual (PV) AMI's Available - You can select an AMI based on: - Region - OS - Architecture (32 vs. 64 bit) - Launch Permissions - Storage for the root device (Instance Store Vs. EBS) - Security Groups: - Act like virtual firewalls for the associated EC2 instance - If you edit a security group, it takes effect immediately. - You can not set any deny rules in security groups, you can only set allow rules - There is an implicit deny any any at the end of the security group rules - You don't need outbound rules for any inbound request. Rules are stateful meaning that any request allowed in, is automatically allowed out - You can have any number of EC2 instances associated with a security group - Snapshots: - You can take a snapshot of a volume, this will store that volumes snapshot on S3 - Snapshots are point in time copies of volumes - The first snapshot will be a full snapshot of the volume and can take a little time to create - Snapshots are incremental, which means that only the blocks that have changes since your last snapshot are moved to S3 - Snapshots of encrypted volumes are encrypted automatically - Volumes restored from encrypted snapshots are encrypted automatically - You can share snapshots but only if they are not encrypted - Snapshots can be shared with other AWS accounts or made public in the market place again as long as they are NOT encrypted - If you are making a snapshot of a root volume, you should stop the instance before taking the snapshot - RAID Volumes: - If you take a snapshot, the snapshot excludes data held in the cache by applications or OS. This tends to not be an issue on a single volume, however multiple volumes in a RAID array, can cause a problem due to interdependencies of the array - Take an application consistent snapshot - Stop the application from writing to disk - Flush all caches to the disk - Snapshot of RAID array --> 3 Methods: - Freeze the file system - Unmount the RAID Array - Shutdown the EC2 instance --> Take Snapshot --> Turn it back on - Placement Groups: - A logical group of instance in a single AZ - Using placement groups enables applications to participate in a low latency, 10Gbps network - Placement groups are recommended for applications that benefit from low network latency, high network throughput or both - A placement group can't span multiple AZ's so it is a SPoF. - Then name you specify for a placement group must be unique within your AWS account - Only certain types of instances can be launched in a placement group. Computer Optimized, GPU, Memory Optimized, and Storage Optimized. - AWS recommends that you use the same instance family and same instance size within the instance group. - You can't merge placement groups - You can't move an existing instance into a placement group - You can create an AMI from your existing instance and then launch a new instance from the AMI into a placement group - Pricing Models: - On Demand: - Pay fixed rate by the hour with no commitment - Users that want the low cost and flexibility of EC2 - Apps with short term, spiky or unpredictable workloads that cannot be interrupted - Apps being developed or tested on EC2 for the first time - Reserved: - Provide capacity reservation and offer significant discount on the hourly charge for an instance (1-3 year terms) - Applications have steady state, or predictable usage - Apps that require reserved capacity - Users able to make upfront payments to reduce their total computing costs even further. - Spot: - Bid whatever price you want for instance capacity by the hour - When your bid price is greater than or equal to the spot price, your instance will boot - When the spot price is greater than your bid price, your instance will terminate with an hours notice. - Applications have flexible start and end times - Apps that are only feasible at very low compute prices - Users with urgent computing needs for large amounts of additional capacity - If the spot instance is terminated by Amazon EC2, you will not be changed for a partial hour of usage - If you terminate the instance yourself you WILL be charged for any partial hours of usage. <br> __Developer Associate Specific Topics__ <br> - Install the AWSCLI tools or use the Amazon AMI to have access to the Amazon Command line tools - Create a user in IAM, download the access key/secret access key - Use the __aws configure__ command to configure the CLI tools to interface with your amazon account using the IAM user access key/secret access key, and default region (Default output format can be left blank) - Configured credentials can be found in ~/.aws/credentials - Region and other configuration parameters can be found in ~/.aws/config - Common CLI commands - aws configure: Use to configure the command line tools to access your amazon account - aws s3 ls - List all buckets that are associated with your AWS account - aws s3 mb s3://helloworldtestbucket - Create a new S3 bucket, in this case named helloworldtestbucket - SDKs - PHP: - From the instance that you want to install the SDK install composer (curl -sS https://getcomposer.org/installer | php) - Install the SDK using composer in the web directory which is usually /var/www/html (php composer.phar require aws/aws-sdk-php) <br> | Resource or Operation | Default Limit | | ------------- |------------- | | Elastic IP addresses for EC2-Classic: | 5 | | Security groups for EC2-Classic per instance: | 500 | | Rules per security group for EC2-Classic: | 100 | | Key pairs: | 5000 | | On-Demand instances: | [Varies based on instance type](https://aws.amazon.com/ec2/faqs/#How_many_instances_can_I_run_in_Amazon_EC2) | | Spot Instances: | [Varies based on instance type](https://aws.amazon.com/ec2/faqs/#How_many_instances_can_I_run_in_Amazon_EC2) | | Reserved Instances: | 20 instance reservations per Availability Zone, per month | | Dedicated Hosts: | Up to 2 Dedicated Hosts per instance family, per region can be allocated | | AMI Copies: | Destination regions are limited to 50 concurrent AMI copies at a time, with no more than 25 of those coming from a single source region. | | Throttle on the emails that can be sent : | Throttle applied | | Tags per EC2 instance: | 10 | <br> __ELB (Elastic Block Storage Limits)__ | Resource or Operation | Default Limit | | ------------- |------------- | | Number of EBS volumes: | 5000 | | Number of EBS snapshots: | 10,000 | | Total volume storage of General Purpose SSD (gp2) volumes: | 20 TiB | | Total volume storage of Provisioned IOPS SSD (io1) volumes: | 20 TiB | | Total volume storage of Throughput Optimized HDD (st1): | 20 TiB | | Total volume storage of Cold HDD (sc1): | 20 TiB | | Total volume storage of Magnetic volumes: | 20 TiB | | Total provisioned IOPS: | 40,000 | For additional information about EC2 Limits, see [Limits in Amazon EC2](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-resource-limits.html) <br> __ELB (Elastic Block Storage Limits)__ | Resource or Operation | Default Limit | | ------------- |------------- | | Number of EBS volumes: | 5000 | | Number of EBS snapshots: | 10,000 | | Total volume storage of General Purpose SSD (gp2) volumes: | 20 TiB | | Total volume storage of Provisioned IOPS SSD (io1) volumes: | 20 TiB | | Total volume storage of Throughput Optimized HDD (st1): | 20 TiB | | Total volume storage of Cold HDD (sc1): | 20 TiB | | Total volume storage of Magnetic volumes: | 20 TiB | | Total provisioned IOPS: | 40,000 | For additional information about EC2 Limits, see [Limits in Amazon EC2](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-resource-limits.html) <br> > [__ELB (Elastic Load Balancer)__](https://aws.amazon.com/elasticloadbalancing/) Elastic Load Balancing offers two types of load balancers that both feature high availability, automatic scaling, and robust security. These include the Classic Load Balancer that routes traffic based on either application or network level information, and the Application Load Balancer that routes traffic based on advanced application level information that includes the content of the request. <br><br> - This topic is covered in [AWS Solutions Architect Study Guide](aws_saa_notes.md) - When configuring ELB health checks, bear in mind that you may want to create a file like healthcheck.html or point the ping path of the health check to the main index file in your application - Remember the health check interval is how often a health check will occur - Your Healthy/Unhealthy thresholds are how many times either will check before marking the origin either healthy or unhealthy - Health Check Interval: 10 seconds - Unhealthy Threshold: 2 - Healthy Threshold: 3 - This means that if the health check interval occurs twice without success, then the source will be marked as unhealthy. This is 2 checks @ 10 seconds per check, so basically after 20 seconds the origin will be marked unhealthy - Likewise, if the healthy threshold is marked at 3, then it would be 3 x health check interval or 10 seconds being 30 seconds. After 30 seconds with 3 consecutive success checks, the origin will be marked as healthy. - Enable Cross-Zone Load Balancing will distribute load across all back-end instances, even if they exist in different AZ's - ELBs are NEVER given public IP Addresses, only a public DNS name - ELBs can be In Service or Out of Service depending on health check results - Charged by the hour and on a per GB basis of usage - Must be configured with at least one listener - A listener must be configured with a protocol and a port for front end (client to ELB connection), as well as a protocol and port for backed end (ELB to instances connection) - ELBs support HTTP, HTTPS, TCP, and SSL (Secure TCP) - ELBs support all ports (1-65535) - ELBs do not support multiple SSL certificates - Classic ELBs support the following ports: - 25 (SMTP) - 80 (HTTP) - 443 (HTTPS) - 465 (SMTPS) - 587 (SMTPS) - 1024-65535 - HTTP Error Codes: - 200 - The request has succeeded - 3xx - Redirection - 4xx - Client Error (404 not found) - 5xx - Server Error <br> | Application Load Balancer Limit | Default Limit | | ------------- |------------- | | Load balancers per region: | 20 | | Target groups per region: | 50 | | Listeners per load balancer: | 10 | | Targets per load balancer: | 1000 | | Subnets per Availability Zone per load balancer: | 1 | | Security groups per load balancer: | 5 | | Rules per load balancer (excluding defaults: | 10 | | No. of times a target can be registered per LB: | 100 | | Load balancers per target group: | 1 | | Targets per target group : | 1000 | <br> | Classic Load Balancer Limit | Default Limit | | ------------- |------------- | | Load balancers per region: | 20 | | Listeners per load balancer: | 100 | | Subnets per Availability Zone per load balancer: | 1 | | Security groups per load balancer: | 5 | <br> <div class='alert alert-info'> <i class='fa fa-info-circle'></i> &nbsp;&nbsp; Load Balancers per Region Limit NOTE: <br> This limit includes both your Application load balancers and your Classic load balancers. This limit can be increased upon request.</div> <br> > [__Elastic Beanstalk:__](https://aws.amazon.com/elasticbeanstalk/) AWS Elastic Beanstalk is an easy-to-use service for deploying and scaling web applications and services developed with Java, .NET, PHP, Node.js, Python, Ruby, Go, and Docker on familiar servers such as Apache, Nginx, Passenger, and IIS. <br><br> __Developer Associate Specific Topics__ <br> - Elastic Beanstalk is free, however any resources that are used in conjunction with the service are subject to normal pricing - Predefined Configuration: - IIS - Node.js - PHP - Python - Ruby - Tomcat - Docker - Pre-configured Docker - GlassFish - Python <br> | Resource or Operation | Default Limit | | ------------- |------------- | | Applications: | 1000 | | Application Versions: | 1000 | | Environments: | 500 | <br>
json metadata{"tags":["aws","certifications","study"],"image":["https://s3.amazonaws.com/clusterfrak.com/img/vendor/amazon_web_services.png"],"links":["https://aws.amazon.com/","http://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html","https://aws.amazon.com/vpc/","aws_saa_notes.md","http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI","http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Appendix_Limits.html","https://aws.amazon.com/ec2/","http://169.254.169.254/latest/meta-data/","http://169.254.169.254/latest/meta-data/public-ipv4","https://getcomposer.org/installer","https://aws.amazon.com/ec2/faqs/#How_many_instances_can_I_run_in_Amazon_EC2","http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-resource-limits.html","https://aws.amazon.com/elasticloadbalancing/","https://aws.amazon.com/elasticbeanstalk/"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #13344645/Trx d766919d12319629696cb5ea2009d96029a2997d
View Raw JSON Data
{
  "trx_id": "d766919d12319629696cb5ea2009d96029a2997d",
  "block": 13344645,
  "trx_in_block": 11,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-02T23:57:21",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "aws",
      "author": "rnason",
      "permlink": "aws-developer-associate-exam-notes-part-1",
      "title": "AWS Developer Associate Exam Notes Part 1",
      "body": "# AWS Developer Associate Exam Notes\n<br>\n<center>\n![Amazon Web Services](https://s3.amazonaws.com/clusterfrak.com/img/vendor/amazon_web_services.png) <br>\nFor more information on AWS, visit [aws.amazon.com](https://aws.amazon.com/)\n</center>\n\n<br>\n\n# Description\n-------\nNotes and information that were collected while studying and prepping for the AWS Developer Associate Exam. <br>\n<br>\n\n| Topic            | Answer        |\n| -------------    |-------------  |\n| Exam Time:       | 80 Minutes    |\n| No. Questions:   | 60 Questions  |\n| Question Types:  | Scenario and Multiple Choice |\n| Passing Score:   | ~ 70%         |\n| Validity Period: | 2 years       |\n| Renewal Exam:    | 1/2 price off |\n\n<br>\n\n# PreRequiste Assumptions Note:\n---------\n\n<div class='alert alert-warning'>\n<i class='fa fa-info-circle'></i> &nbsp;&nbsp; StudyGuide Note: <br>\nThis study guide builds upon the AWS Solutions Architect Study Guide under the Notes section. You should reference that study guide and use this studyguide for additional information required for the AWS Developer Associate Exam.</div>\n\n<br>\n\n# General\n---------\n> Amazon Web Services SDK's:\n\n- Android, IOS, JavaScript (Browser)\n- Java\n- .NET\n- Node.js\n- PHP\n- Python\n- Ruby\n- Go\n- C++\n\n<br>\n\n> Default Regions:\n\n- US-EAST-1\n- Java has default region\n- Some languages such as Node.js do not have a default region\n\n<br>\n\n# Service Limits:\n---------\n\nEach service has the default limits defined, to see the official AWS documentation on service limits, [check here](http://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html)\n\n<br>\n\n# Networking:\n-------\n\n> [__VPC (Virtual Private Cloud):__](https://aws.amazon.com/vpc/)\n\nLets you provision a logically isolated section of the AWS Cloud where you can launch AWS resources in a virtual network that you define. You have complete control over your virtual networking, IP ranges, creation of subnets and configuration of route tables and network gateways. <br><br>\n\n- This topic is covered in [AWS Solutions Architect Study Guide](aws_saa_notes.md)\n- Virtual data center in the cloud\n- Allowed up to 5 VPCs in each AWS region by default\n- All subnets in default VPC have an Internet gateway attached\n- Multiple IGW's can be created, but only a single IGW can be attached to a VPC\n- Each EC2 instance has both a public and private IP address\n- If you delete the default VPC, the only way to get it back is to submit a support ticket\n- By default when you create a VPC, a default main routing table automatically gets created as well.\n- Subnets are always mapped to a single AZ's\n- Subnets can not be mapped to multiple AZ's\n- /16 is the largest CIDR block available when provisioning an IP space for a VPC\n- Amazon uses 3 of the available IP addresses in a newly created subnet\n    - x.x.x.0 - Always subnet network address and is never usable\n    - x.x.x.1 - Reserved by AWS for the VPC router\n    - x.x.x.2 - Reserved by AWS for subnet DNS\n    - x.x.x.3 - Reserved by AWS for future use\n    - x.x.x.255 - Always subnet broadcast address and is never usable.\n- 169.254.169.253 - Amazon DNS\n- By default all traffic between subnets is allowed\n- By default not all subnets have access to the Internet. Either an Internet Gateway or NAT gateway is required for private subnets\n- You can only have 1 Internet gateway per VPC\n- A security group can stretch across different AZ's\n- You can also create Hardware Virtual Private Network (VPN) connection between your corporate data center and your VPC and leverage the AWS cloud as an extension of your corporate data center\n- Network Address Translation (NAT) Instances:\n    - When creating a NAT instance, disable Source/Destination checks on the instance or you could encounter issues\n    - NAT instances must be in a public subnet\n    - There must be a route out of the private subnet to the NAT instance in order for it to work\n    - The amount of traffic that NAT instances support depend on the size of the NAT instance\n    - If you are experiencing any sort of bottleneck issues with a NAT instance, then increase the instance size\n    - HA can be achieved by using Auto-scaling groups, or multiple subnets in different AZ's with a scripted fail-over procedure\n    - NAT instances are always behind a security group\n- Network Address Translation (NAT) Gateway:\n    - NAT Gateways scale automatically up to 10Gbps\n    - There is no need to patch NAT gateways as the AMI is handled by AWS\n    - NAT gateways are automatically assigned a public IP address\n    - When a new NAT gateway has been created, remember to update your route table\n    - No need to assign a security group, NAT gateways are not associated with security groups\n    - Preferred in the Enterprise\n    - No need to disable Source/Destination checks\n- Network Access Control Lists (NACLS):\n    - Numbered list of rules that are evaluated in order starting at the lowest numbered rule first to determine what traffic is allowed in or out depending on what subnet is associated with the rule\n    - The highest rule number is 32766\n    - Start with rules starting at 100 so you can insert rules if needed\n    - Default NACL will allow ALL traffic in and out by default\n    - You must assign a NACL to each subnet, if a subnet is not associated with a NACL, it will allow no traffic in or out\n    - NACL rules are stateless, established in does not create outbound rule automatically\n    - You can only assign a single NACL to a single subnet\n- VPC Peering:\n    - Connection between two VPCs that enables you to route traffic between them using private IP addresses via a direct network route\n    - Instances in either VPC can communicate with each other as if they are within the same network\n    - You can create VPC peering connections between your own VPCs or with a VPC in another account within a SINGLE REGION\n    - AWS uses existing infrastructure of a VPC to create a VPC peering connection. It is not a gateway nor a VPN, and does not rely on separate hardware\n    - There is NO single point of failure for communication nor any bandwidth bottleneck\n    - There is no transitive peering between VPC peers (Can't go through 1 VPC to get to another)\n    - Hub and spoke configuration model (1 to 1)\n    - Be mindful of IPs in each VPC, if multiple VPCs have the same IP blocks, they will not be able to communicate\n    - You can peer VPC's with other AWS accounts as well as with other VPCs in the same account\n\n<br>\n\n| Resource or Operation                                      | Default Limit  | Comments      |\n| -------------                                              |-------------   |-------------  |\n| VPCs per region:                                           | 5              | The limit for Internet gateways per region is directly correlated to this one. Increasing this limit will increase the limit on Internet gateways per region by the same amount. |\n| Subnets per VPC:                                           | 200            | |\n| Internet gateways per region:                              | 5              | This limit is directly correlated with the limit on VPCs per region. You cannot increase this limit individually; the only way to increase this limit is to increase the limit on VPCs per region. Only one Internet gateway can be attached to a VPC at a time. |\n| Customer gateways per region:                              | 50             | |\n| VPN connections per region:                                | 50             | |\n| VPN connections per VPC (per virtual private gateway):     | 10             | |\n| Route tables per VPC:                                      | 5              | Including the main route table. You can associate one route table to one or more subnets in a VPC. |\n| Routes per route table (non-propagated routes):            | 50             | This is the limit for the number of non-propagated entries per route table. You can submit a request for an increase of up to a maximum of 100; however, network performance may be impacted. |\n| BGP advertised routes per route table (propagated routes): | 5              | You can have up to 100 propagated routes per route table; however, the total number of propagated and non-propagated entries per route table cannot exceed 100. For example, if you have 50 non-propagated entries (the default limit for this type of entry), you can only have 50 propagated entries. This limit cannot be increased. If you require more than 100 prefixes, advertise a default route. |\n| Elastic IP addresses per region for each AWS account:      | 5              | This is the limit for the number of VPC Elastic IP addresses you can allocate within a region. This is a separate limit from the Amazon EC2 Elastic IP address limit. |\n| Security groups per VPC:                                   | 500            | |\n| Inbound or outbound rules per security group:              | 50             | You can have 50 inbound and 50 outbound rules per security group (giving a total of 100 combined inbound and outbound rules). If you need to increase or decrease this limit, you can contact AWS Support — a limit change applies to both inbound and outbound rules. However, the multiple of the limit for inbound or outbound rules per security group and the limit for security groups per network interface cannot exceed 250. For example, if you want to increase the limit to 100, we decrease your number of security groups per network interface to 2. |\n| Security groups per network interface:                     | 5              | If you need to increase or decrease this limit, you can contact AWS Support. The maximum is 16. The multiple of the limit for security groups per network interface and the limit for rules per security group cannot exceed 250. For example, if you want 10 security groups per network interface, we decrease your number of rules per security group to 25. |\n| Network interfaces per instance:                           | N/A            | This limit varies by instance type. For more information, see [Private IP Addresses Per ENI Per Instance Type](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI). |\n| Network interfaces per region:                             | 350            | This limit is the greater of either the default limit (350) or your On-Demand instance limit multiplied by 5. The default limit for On-Demand instances is 20. If your On-Demand instance limit is below 70, the default limit of 350 applies. You can increase the number of network interfaces per region by contacting AWS Support, or by increasing your On-Demand instance limit. |\n| Network ACLs per VPC:                                      | 200            | You can associate one network ACL to one or more subnets in a VPC. This limit is not the same as the number of rules per network ACL. |\n| Rules per network ACL:                                     | 20             | This is the one-way limit for a single network ACL, where the limit for ingress rules is 20, and the limit for egress rules is 20. This limit can be increased upon request up to a maximum if 40; however, network performance may be impacted due to the increased workload to process the additional rules. |\n| Active VPC peering connections per VPC:                    | 50             | If you need to increase this limit, contact AWS Support . The maximum limit is 125 peering connections per VPC. The number of entries per route table should be increased accordingly; however, network performance may be impacted. |\n| Outstanding VPC peering connection requests:               | 25             | This is the limit for the number of outstanding VPC peering connection requests that you've requested from your account. |\n| Expiry time for an unaccepted VPC peering connection request: | 1 week (168 hrs) | |\n| VPC endpoints per region:                                  | 20             | The maximum limit is 255 endpoints per VPC, regardless of your endpoint limit per region. |\n| Flow logs per single eni, single subnet, or single VPC in a region:         | 2 | You can effectively have 6 flow logs per network interface if you create 2 flow logs for the subnet, and 2 flow logs for the VPC in which your network interface resides. This limit cannot be increased. |\n| NAT gateways per Availability Zone:                        | 5              | A NAT gateway in the pending, active, or deleting state counts against your limit. |\n\nFor additional information about VPC Limits, see [Limits in Amazon VPC](http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Appendix_Limits.html)\n\n<br>\n\n# Compute:\n-------\n\n> [__EC2 (Elastic Compute Cloud):__](https://aws.amazon.com/ec2/)\n\nElastic Compute Cloud - Backbone of AWS, provides re-sizable compute capacity in the cloud. Reduces the time required to obtain and boot new server instances to minutes allowing you to quickly scale capacity, both up and down, as your computing requirements change. <br><br>\n\n- This topic is covered in [AWS Solutions Architect Study Guide](aws_saa_notes.md)\n- Once an Instance has been launched with instance store storage, you can not attach additional instance store volumes after the instance is launched, only EBS volumes\n- When using an instance store volume, you can not stop the instance (the option to do so will not be available, as the instance moves to another host and and would cause complete data loss)\n- When using ephemeral storage, an underlying host failure will result in data loss\n- You can reboot both instance types (w/ephemeral and EBS volumes) and will not lose data, but again, an ephemeral volume based instance can NOT be stopped\n- By default both Root volumes will be deleted on termination, however you can tell AWS to keep the root device volume on a new instance during launch\n- You can poll an instances meta-data by using curl http://169.254.169.254/latest/meta-data/\n- You can get an instance's IP address by using curl http://169.254.169.254/latest/meta-data/public-ipv4\n- No such thing as user-data, remember its always meta-data not user-data\n- Can not encrypt root volumes, but you can encrypt any additional volumes that are added and attached to an EC2 instance.\n- You can have up to 10 tags per EC2 instance\n- AWS does not recommend ever putting RAID 5's on EBS\n- When configuring a launch configuration for an auto-scaling group, the Health Check Grace Period is the period of time to ignore health checks while instances or auto-scaled instances are added and booting.\n- Termination protection is turned off by default, you must turn it on\n- Roles:\n    - You can only assign an EC2 role to an instance on create. You can not assign a role after the instance has been created and/or is running\n    - You can change the permissions on a role post creation, but can NOT assign a new role to an existing instance\n    - Role permissions can be changed, but not swapped\n    - Roles are more secure then storing your access key and secret key on individual EC2 instances\n    - Roles are easier to manager, You can assign a role, and change permissions on that role at any time which take effect immediately\n    - Roles can only be assigned when that EC2 instance is being provisioned\n    - Roles are universal, you can use them in any region\n- Instance sizing:\n    - T2 - Lowest Cost General Purpose - Web/Small DBs\n    - M4 - General Purpose - App Servers\n    - M3 - General Purpose - App servers\n    - C4 - Compute Optimized - CPU Intensive Apps/DBs\n    - C3 - Compute Optimized - CPU Intensive Apps/DBs\n    - R3 - Memory Optimized - Memory Intensive Apps/DBs\n    - G2 - Graphics / General Purpose - Video Encoding/Machine Learning/3D App Streaming\n    - I2 - High Speed Storage - NoSQL DBs, Data Warehousing\n    - D2 - Dense Storage - Fileservers/Data Warehousing/Hadoop\n    - D - Density\n    - I - IOPS\n    - R - RAM\n    - T - Cheap General Purpose\n    - M - Main General Purpose\n    - C - Compute\n    - G - Graphics\n- Storage Types:\n    - Instance Store (Ephemeral):\n        - Also referred to as ephemeral storage and is not persistent\n        - Instances using instance store storage can not be stopped. If they are, data loss would result\n        - If there is an issue with the underlying host and your instance needs to be moved, or is lost, Data is also lost\n        - Instance store volumes cannot be detached and reattached to other instances; They exist only for the life of that instance\n        - Best used for scratch storage, storage that can be lost at any time with no bad ramifications, such as a cache store\n    - EBS (Elastic Block Storage):\n        - Elastic Block Storage is persistent storage that can be used to procure storage to EC2 instances.\n        - You can NOT mount 1 EBS volume to multiple EC2 instances instead you must use EFS\n        - Default action for EBS volumes is for the root EBS volume to be deleted when the instance is terminated\n        - By default, ROOT volumes will be deleted on termination, however with EBS volumes only, you can tell AWS to keep the root device volume\n        - EBS backed instances can be stopped, you will NOT lose any data\n        - EBS volumes can be detached and reattached to other EC2 instances\n        3 Types of available EBS volumes can be provisioned and attached to an EC2 instance:\n            - General Purpose SSD (GP2):\n                - General Purpose up to 10K IOPS\n                - 99.999% availability\n                - Ratio of 3 IOPS per GB with up to 10K IOPS and ability to burst\n                - Up to 3K IOPS for short periods for volumes under 1GB\n            - Provisioned IOPS SSD (I01)\n                - Designed for I/O intensive applications such as large relational or No-SQL DBs.\n                - Use if need more than 10K IOPS\n            - Magnetic (Standard)\n                - Lowest cost per GB\n                - Ideal for workloads where data is accessed infrequently and apps where the lowest cost storage is important.\n                - Ideal for fileservers\n        - Encryption:\n            - Root Volumes cannot be encrypted by default, you need a 3rd party utility\n            - Other volumes added to an instance can be encrypted.\n- AMIs:\n    - AMI's are simply snapshots of a root volume and is stored in S3\n    - AMI's are regional. You can only launch an AMI from the region in which it was stored\n    - You can copy AMI's to other regions using the console, CLI or Amazon EC2 API\n    - Provides information required to launch a VM in the cloud\n    - Template for the root volume for the instance (OS, Apps, etc)\n    - Permissions that control which AWS accounts can use the AMI to launch instances\n    - When you create an AMI, by default its marked private. You have to manually change the permissions to make the image public or share images with individual accounts\n    - Block device mapping that specifies volumes to attach to the instance when its launched\n    - Hardware Virtual Machines (HVM) AMI's Available\n    - Paravirtual (PV) AMI's Available\n    - You can select an AMI based on:\n        - Region\n        - OS\n        - Architecture (32 vs. 64 bit)\n        - Launch Permissions\n        - Storage for the root device (Instance Store Vs. EBS)\n- Security Groups:\n    - Act like virtual firewalls for the associated EC2 instance\n    - If you edit a security group, it takes effect immediately.\n    - You can not set any deny rules in security groups, you can only set allow rules\n    - There is an implicit deny any any at the end of the security group rules\n    - You don't need outbound rules for any inbound request. Rules are stateful meaning that any request allowed in, is automatically allowed out\n    - You can have any number of EC2 instances associated with a security group\n- Snapshots:\n    - You can take a snapshot of a volume, this will store that volumes snapshot on S3\n    - Snapshots are point in time copies of volumes\n    - The first snapshot will be a full snapshot of the volume and can take a little time to create\n    - Snapshots are incremental, which means that only the blocks that have changes since your last snapshot are moved to S3\n    - Snapshots of encrypted volumes are encrypted automatically\n    - Volumes restored from encrypted snapshots are encrypted automatically\n    - You can share snapshots but only if they are not encrypted\n    - Snapshots can be shared with other AWS accounts or made public in the market place again as long as they are NOT encrypted\n    - If you are making a snapshot of a root volume, you should stop the instance before taking the snapshot\n- RAID Volumes:\n    - If you take a snapshot, the snapshot excludes data held in the cache by applications or OS. This tends to not be an issue on a single volume, however multiple volumes in a RAID array, can cause a problem due to interdependencies of the array\n    - Take an application consistent snapshot\n        - Stop the application from writing to disk\n        - Flush all caches to the disk\n    - Snapshot of RAID array --> 3 Methods:\n        - Freeze the file system\n        - Unmount the RAID Array\n        - Shutdown the EC2 instance --> Take Snapshot --> Turn it back on\n- Placement Groups:\n    - A logical group of instance in a single AZ\n    - Using placement groups enables applications to participate in a low latency, 10Gbps network\n    - Placement groups are recommended for applications that benefit from low network latency, high network throughput or both\n    - A placement group can't span multiple AZ's so it is a SPoF.\n    - Then name you specify for a placement group must be unique within your AWS account\n    - Only certain types of instances can be launched in a placement group. Computer Optimized, GPU, Memory Optimized, and Storage Optimized.\n    - AWS recommends that you use the same instance family and same instance size within the instance group.\n    - You can't merge placement groups\n    - You can't move an existing instance into a placement group\n    - You can create an AMI from your existing instance and then launch a new instance from the AMI into a placement group\n- Pricing Models:\n    - On Demand:\n        - Pay fixed rate by the hour with no commitment\n        - Users that want the low cost and flexibility of EC2\n        - Apps with short term, spiky or unpredictable workloads that cannot be interrupted\n        - Apps being developed or tested on EC2 for the first time\n    - Reserved:\n        - Provide capacity reservation and offer significant discount on the hourly charge for an instance (1-3 year terms)\n        - Applications have steady state, or predictable usage\n        - Apps that require reserved capacity\n        - Users able to make upfront payments to reduce their total computing costs even further.\n    - Spot:\n        - Bid whatever price you want for instance capacity by the hour\n        - When your bid price is greater than or equal to the spot price, your instance will boot\n        - When the spot price is greater than your bid price, your instance will terminate with an hours notice.\n        - Applications have flexible start and end times\n        - Apps that are only feasible at very low compute prices\n        - Users with urgent computing needs for large amounts of additional capacity\n        - If the spot instance is terminated by Amazon EC2, you will not be changed for a partial hour of usage\n        - If you terminate the instance yourself you WILL be charged for any partial hours of usage.\n\n<br>\n\n__Developer Associate Specific Topics__\n\n<br>\n\n- Install the AWSCLI tools or use the Amazon AMI to have access to the Amazon Command line tools\n- Create a user in IAM, download the access key/secret access key\n- Use the __aws configure__ command to configure the CLI tools to interface with your amazon account using the IAM user access key/secret access key, and default region (Default output format can be left blank)\n- Configured credentials can be found in ~/.aws/credentials\n- Region and other configuration parameters can be found in ~/.aws/config\n- Common CLI commands\n    - aws configure: Use to configure the command line tools to access your amazon account\n    - aws s3 ls - List all buckets that are associated with your AWS account\n    - aws s3 mb s3://helloworldtestbucket - Create a new S3 bucket, in this case named helloworldtestbucket\n- SDKs\n    - PHP:\n        - From the instance that you want to install the SDK install composer (curl -sS https://getcomposer.org/installer | php)\n        - Install the SDK using composer in the web directory which is usually /var/www/html (php composer.phar require aws/aws-sdk-php)\n\n<br>\n\n| Resource or Operation                         | Default Limit        |\n| -------------                                 |-------------         |\n| Elastic IP addresses for EC2-Classic:         | 5                    |\n| Security groups for EC2-Classic per instance: | 500                  |\n| Rules per security group for EC2-Classic:     | 100                  |\n| Key pairs:                                    | 5000                 |\n| On-Demand instances:                          | [Varies based on instance type](https://aws.amazon.com/ec2/faqs/#How_many_instances_can_I_run_in_Amazon_EC2) |\n| Spot Instances:                               | [Varies based on instance type](https://aws.amazon.com/ec2/faqs/#How_many_instances_can_I_run_in_Amazon_EC2) |\n| Reserved Instances:                           | 20 instance reservations per Availability Zone, per month |\n| Dedicated Hosts:                              | Up to 2 Dedicated Hosts per instance family, per region can be allocated  |\n| AMI Copies:                                   | Destination regions are limited to 50 concurrent AMI copies at a time, with no more than 25 of those coming from a single source region. |\n| Throttle on the emails that can be sent :     | Throttle applied  |\n| Tags per EC2 instance:                        | 10                |\n\n<br>\n\n__ELB (Elastic Block Storage Limits)__\n\n| Resource or Operation                                          | Default Limit        |\n| -------------                                                  |-------------         |\n| Number of EBS volumes:                                         | 5000                 |\n| Number of EBS snapshots:                                       | 10,000               |\n| Total volume storage of General Purpose SSD (gp2) volumes:     | 20 TiB                  |\n| Total volume storage of Provisioned IOPS SSD (io1) volumes:    | 20 TiB                  |\n| Total volume storage of Throughput Optimized HDD (st1):        | 20 TiB                  |\n| Total volume storage of Cold HDD (sc1):                        | 20 TiB                  |\n| Total volume storage of Magnetic volumes:                      | 20 TiB                  |\n| Total provisioned IOPS:                                        | 40,000                  |\n\nFor additional information about EC2 Limits, see [Limits in Amazon EC2](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-resource-limits.html)\n\n<br>\n\n__ELB (Elastic Block Storage Limits)__\n\n| Resource or Operation                                          | Default Limit        |\n| -------------                                                  |-------------         |\n| Number of EBS volumes:                                         | 5000                 |\n| Number of EBS snapshots:                                       | 10,000               |\n| Total volume storage of General Purpose SSD (gp2) volumes:     | 20 TiB                  |\n| Total volume storage of Provisioned IOPS SSD (io1) volumes:    | 20 TiB                  |\n| Total volume storage of Throughput Optimized HDD (st1):        | 20 TiB                  |\n| Total volume storage of Cold HDD (sc1):                        | 20 TiB                  |\n| Total volume storage of Magnetic volumes:                      | 20 TiB                  |\n| Total provisioned IOPS:                                        | 40,000                  |\n\nFor additional information about EC2 Limits, see [Limits in Amazon EC2](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-resource-limits.html)\n\n<br>\n\n> [__ELB (Elastic Load Balancer)__](https://aws.amazon.com/elasticloadbalancing/)\n\nElastic Load Balancing offers two types of load balancers that both feature high availability, automatic scaling, and robust security. These include the Classic Load Balancer that routes traffic based on either application or network level information, and the Application Load Balancer that routes traffic based on advanced application level information that includes the content of the request. <br><br>\n\n- This topic is covered in [AWS Solutions Architect Study Guide](aws_saa_notes.md)\n- When configuring ELB health checks, bear in mind that you may want to create a file like healthcheck.html or point the ping path of the health check to the main index file in your application\n- Remember the health check interval is how often a health check will occur\n- Your Healthy/Unhealthy thresholds are how many times either will check before marking the origin either healthy or unhealthy\n    - Health Check Interval: 10 seconds\n    - Unhealthy Threshold: 2\n    - Healthy Threshold: 3\n    - This means that if the health check interval occurs twice without success, then the source will be marked as unhealthy. This is 2 checks @ 10 seconds per check, so basically after 20 seconds the origin will be marked unhealthy\n    - Likewise, if the healthy threshold is marked at 3, then it would be 3 x health check interval or 10 seconds being 30 seconds. After 30 seconds with 3 consecutive success checks, the origin will be marked as healthy. \n- Enable Cross-Zone Load Balancing will distribute load across all back-end instances, even if they exist in different AZ's\n- ELBs are NEVER given public IP Addresses, only a public DNS name\n- ELBs can be In Service or Out of Service depending on health check results\n- Charged by the hour and on a per GB basis of usage\n- Must be configured with at least one listener\n- A listener must be configured with a protocol and a port for front end (client to ELB connection), as well as a protocol and port for backed end (ELB to instances connection)\n- ELBs support HTTP, HTTPS, TCP, and SSL (Secure TCP)\n- ELBs support all ports (1-65535)\n- ELBs do not support multiple SSL certificates\n- Classic ELBs support the following ports:\n    - 25 (SMTP)\n    - 80 (HTTP)\n    - 443 (HTTPS)\n    - 465 (SMTPS)\n    - 587 (SMTPS)\n    - 1024-65535\n- HTTP Error Codes:\n    - 200 - The request has succeeded\n    - 3xx - Redirection\n    - 4xx - Client Error (404 not found)\n    - 5xx - Server Error\n\n<br>\n\n| Application Load Balancer Limit                  | Default Limit        |\n| -------------                                    |-------------         |\n| Load balancers per region:                       | 20                   |\n| Target groups per region:                        | 50                   |\n| Listeners per load balancer:                     | 10                   |\n| Targets per load balancer:                       | 1000                 |\n| Subnets per Availability Zone per load balancer: | 1                    |\n| Security groups per load balancer:               | 5                    |\n| Rules per load balancer (excluding defaults:     | 10                   |\n| No. of times a target can be registered per LB:  | 100                  |\n| Load balancers per target group:                 | 1                    |\n| Targets per target group :                       | 1000                 |\n\n<br>\n\n| Classic Load Balancer Limit                      | Default Limit        |\n| -------------                                    |-------------         |\n| Load balancers per region:                       | 20                   |\n| Listeners per load balancer:                     | 100                  |\n| Subnets per Availability Zone per load balancer: | 1                    |\n| Security groups per load balancer:               | 5                    |\n\n<br>\n\n<div class='alert alert-info'>\n<i class='fa fa-info-circle'></i> &nbsp;&nbsp; Load Balancers per Region Limit NOTE: <br>\nThis limit includes both your Application load balancers and your Classic load balancers. This limit can be increased upon request.</div>\n\n<br>\n\n> [__Elastic Beanstalk:__](https://aws.amazon.com/elasticbeanstalk/)\n\nAWS Elastic Beanstalk is an easy-to-use service for deploying and scaling web applications and services developed with Java, .NET, PHP, Node.js, Python, Ruby, Go, and Docker on familiar servers such as Apache, Nginx, Passenger, and IIS. <br><br>\n\n__Developer Associate Specific Topics__\n\n<br>\n\n- Elastic Beanstalk is free, however any resources that are used in conjunction with the service are subject to normal pricing\n- Predefined Configuration:\n    - IIS\n    - Node.js\n    - PHP\n    - Python\n    - Ruby\n    - Tomcat\n    - Docker\n    - Pre-configured Docker\n        - GlassFish\n        - Python\n\n<br>\n\n| Resource or Operation                                    | Default Limit        |\n| -------------                                            |-------------         |\n| Applications:                                            | 1000                 |\n| Application Versions:                                    | 1000                 |\n| Environments:                                            | 500                  |\n\n<br>",
      "json_metadata": "{\"tags\":[\"aws\",\"certifications\",\"study\"],\"image\":[\"https://s3.amazonaws.com/clusterfrak.com/img/vendor/amazon_web_services.png\"],\"links\":[\"https://aws.amazon.com/\",\"http://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html\",\"https://aws.amazon.com/vpc/\",\"aws_saa_notes.md\",\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI\",\"http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Appendix_Limits.html\",\"https://aws.amazon.com/ec2/\",\"http://169.254.169.254/latest/meta-data/\",\"http://169.254.169.254/latest/meta-data/public-ipv4\",\"https://getcomposer.org/installer\",\"https://aws.amazon.com/ec2/faqs/#How_many_instances_can_I_run_in_Amazon_EC2\",\"http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-resource-limits.html\",\"https://aws.amazon.com/elasticloadbalancing/\",\"https://aws.amazon.com/elasticbeanstalk/\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
2017/07/01 19:02:24
votertharindu
authorrnason
permlinkpowershell-code-snippits-and-commands
weight10000 (100.00%)
Transaction InfoBlock #13309956/Trx 374e171407752f75e493204cca46bfbc34eb902b
View Raw JSON Data
{
  "trx_id": "374e171407752f75e493204cca46bfbc34eb902b",
  "block": 13309956,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-01T19:02:24",
  "op": [
    "vote",
    {
      "voter": "tharindu",
      "author": "rnason",
      "permlink": "powershell-code-snippits-and-commands",
      "weight": 10000
    }
  ]
}
2017/07/01 19:01:12
voterrnason
authorrnason
permlinkpowershell-code-snippits-and-commands
weight10000 (100.00%)
Transaction InfoBlock #13309932/Trx ae48a69ee07a21ff528b14f52a7de9c402a20e4a
View Raw JSON Data
{
  "trx_id": "ae48a69ee07a21ff528b14f52a7de9c402a20e4a",
  "block": 13309932,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-01T19:01:12",
  "op": [
    "vote",
    {
      "voter": "rnason",
      "author": "rnason",
      "permlink": "powershell-code-snippits-and-commands",
      "weight": 10000
    }
  ]
}
2017/07/01 19:01:12
parent author
parent permlinkpowershell
authorrnason
permlinkpowershell-code-snippits-and-commands
titlePowershell Code Snippits and Commands
body# Powershell Code Snippits and Commands <br> ## Conditional or Comparison Operators ------- |Operator|Definition| |--------|----------| |# |# The hash key is for comments | |+ |Add | |- |Subtract | |* |Multiply | |/ |Divide | |% |Modulus (Some call it Modulo) - Means remainder 17 % 5 = 2 Remainder | |= |equal | |-not |logical not equal | |! |logical not equal | |-band |binary and | |-bor |binary or | |-bnot |binary not | |-replace |Replace (e.g. "abcde" –replace "b","B") (case insensitive) | |-ireplace |Case-insensitive replace (e.g. "abcde" –ireplace "B","3") | |-creplace |Case-sensitive replace (e.g. "abcde" –creplace "B","3") | |-and |AND (e.g. ($a -ge 5 -AND $a -le 15) ) | |-or |OR (e.g. ($a –eq "A" –OR $a –eq "B") ) | |-is |IS type (e.g. $a -is [int] ) | |-isnot |IS not type (e.g. $a -isnot [int] ) | |-as |convert to type (e.g. 1 -as [string] treats 1 as a string ) | |.. |Range operator (e.g. foreach ($i in 1..10) {$i } ) | |& |call operator (e.g. $a = "Get-ChildItem" &$a executes Get-ChildItem) | |. (space) |call operator (e.g. $a = "Get-ChildItem" . $a executes Get-ChildItem in the current scope) | |. |.Period or .full stop for an objects properties ($CompSys.TotalPhysicalMemory) | |-F |Format operator (e.g. foreach ($p in Get-Process) { "{0,-15} has {1,6} handles" –F |$p.processname,$p.Handlecount } ) | |-lt |Less than | |-le |Less than or equal to | |-gt |Greater than | |-ge |Greater than or equal to | |-eq |Equal to | |-ne |Not Equal to | |-contains |Determine elements in a group. (This always returns Boolean $True or $False) | |-notcontains |Determine excluded elements in a group (This always returns Boolean $True or $False) | |-like |Like - uses wildcards for pattern matching | |-notlike |Not Like - uses wildcards for pattern matching | |-match |Match - uses regular expressions for pattern matching | |-notmatch |Not Match - uses regular expressions for pattern matching | |-band |Bitwise AND | |-bor |Bitwise OR | |-is |Is of Type | |-isnot |Is not of Type | |if |If condition | |elseIf |ElseIF | |else |Else | |> |Redirect, for example, output to text file (Example .\cmdlet > stuff.txt) | |>> |Same as Redirect except it appends to an existing file | <br> ## Creating HTML Output ```powershell Get-Service | Select-object Status, Name, DisplayName | ConvertTo-HTML | Out-File C:\ServiceReport.htm ``` <br> ## Formatting HTML Output ```powershell $HTM = "<style>table {font-size: 10pt; font-family: Arial;}" $HTM = $HTM + "BODY{background-color:White;}" $HTM = $HTM + "TABLE{border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}" $HTM = $HTM + "TH{border-width: 1px;padding: 5px;border-style: solid;border-color: black;background-color:Orange}" $HTM = $HTM + "TD{border-width: 1px;padding: 5px;border-style: solid;border-color: black;background-color:SkyBlue}" $HTM = $HTM + "</style>" Get-Service | Select-Object Status, Name, DisplayName | ConvertTo-HTML -head $HTM –body "<Center><H2><I><U>Service Information</U></I></H2>" | Out-File C:\ServiceReport.htm Invoke-Expression C:\ServiceReport.htm ```
json metadata{"tags":["powershell","scripts"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #13309932/Trx ae48a69ee07a21ff528b14f52a7de9c402a20e4a
View Raw JSON Data
{
  "trx_id": "ae48a69ee07a21ff528b14f52a7de9c402a20e4a",
  "block": 13309932,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-01T19:01:12",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "powershell",
      "author": "rnason",
      "permlink": "powershell-code-snippits-and-commands",
      "title": "Powershell Code Snippits and Commands",
      "body": "# Powershell Code Snippits and Commands\n\n<br>\n\n## Conditional or Comparison Operators\n-------\n|Operator|Definition|\n|--------|----------|\n|#               |# The hash key is for comments |\n|+               |Add |\n|-               |Subtract |\n|*               |Multiply |\n|/               |Divide |\n|%               |Modulus (Some call it Modulo) - Means remainder 17 % 5 = 2 Remainder |\n|=               |equal |\n|-not            |logical not equal |\n|!               |logical not equal |\n|-band           |binary and |\n|-bor            |binary or  |\n|-bnot           |binary not |\n|-replace        |Replace (e.g.  \"abcde\" –replace \"b\",\"B\") (case insensitive) |\n|-ireplace       |Case-insensitive replace (e.g.  \"abcde\" –ireplace \"B\",\"3\") |\n|-creplace       |Case-sensitive replace (e.g.  \"abcde\" –creplace \"B\",\"3\") |\n|-and            |AND (e.g. ($a -ge 5 -AND $a -le 15) ) |\n|-or             |OR  (e.g. ($a –eq \"A\" –OR $a –eq \"B\") ) |\n|-is             |IS type (e.g. $a -is [int] ) |\n|-isnot          |IS not type (e.g. $a -isnot [int] ) |\n|-as             |convert to type (e.g. 1 -as [string] treats 1 as a string ) |\n|..              |Range operator (e.g.  foreach ($i in 1..10) {$i }  ) |\n|&               |call operator (e.g. $a = \"Get-ChildItem\" &$a executes Get-ChildItem) |\n|. (space)       |call operator (e.g. $a = \"Get-ChildItem\" . $a executes Get-ChildItem in the current scope) |\n|.               |.Period or .full stop for an objects properties ($CompSys.TotalPhysicalMemory) |\n|-F              |Format operator (e.g. foreach ($p in Get-Process) { \"{0,-15} has {1,6} handles\" –F  |$p.processname,$p.Handlecount } ) |\n|-lt             |Less than |\n|-le             |Less than or equal to |\n|-gt             |Greater than |\n|-ge             |Greater than or equal to |\n|-eq             |Equal to |\n|-ne             |Not Equal to |\n|-contains       |Determine elements in a group. (This always returns Boolean $True or $False) |\n|-notcontains    |Determine excluded elements in a group  (This always returns Boolean $True or $False) |\n|-like           |Like - uses wildcards for pattern matching |\n|-notlike        |Not Like - uses wildcards for pattern matching |\n|-match          |Match - uses regular expressions for pattern matching |\n|-notmatch       |Not Match - uses regular expressions for pattern matching |\n|-band           |Bitwise AND |\n|-bor            |Bitwise OR |\n|-is             |Is of Type |\n|-isnot          |Is not of Type |   \n|if              |If condition |\n|elseIf          |ElseIF |\n|else            |Else |\n|>               |Redirect, for example, output to text file (Example   .\\cmdlet > stuff.txt) |\n|>>              |Same as Redirect except it appends to an existing file |\n\n<br>\n\n## Creating HTML Output\n```powershell\nGet-Service | Select-object Status, Name, DisplayName | ConvertTo-HTML | Out-File C:\\ServiceReport.htm\n```\n\n<br>\n\n## Formatting HTML Output\n```powershell\n$HTM = \"<style>table {font-size: 10pt; font-family: Arial;}\"\n$HTM = $HTM + \"BODY{background-color:White;}\"\n$HTM = $HTM + \"TABLE{border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}\"\n$HTM = $HTM + \"TH{border-width: 1px;padding: 5px;border-style: solid;border-color: black;background-color:Orange}\"\n$HTM = $HTM + \"TD{border-width: 1px;padding: 5px;border-style: solid;border-color: black;background-color:SkyBlue}\"\n$HTM = $HTM + \"</style>\"\n\nGet-Service | Select-Object Status, Name, DisplayName | ConvertTo-HTML -head $HTM –body \"<Center><H2><I><U>Service Information</U></I></H2>\" | Out-File C:\\ServiceReport.htm\n\nInvoke-Expression C:\\ServiceReport.htm\n```",
      "json_metadata": "{\"tags\":[\"powershell\",\"scripts\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
2017/07/01 18:54:33
voterrnason
authorrnason
permlinkdirectory-repository-cleanup-script
weight10000 (100.00%)
Transaction InfoBlock #13309799/Trx 5bf94188c1a13703890218839419e12a0da30dbf
View Raw JSON Data
{
  "trx_id": "5bf94188c1a13703890218839419e12a0da30dbf",
  "block": 13309799,
  "trx_in_block": 7,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-01T18:54:33",
  "op": [
    "vote",
    {
      "voter": "rnason",
      "author": "rnason",
      "permlink": "directory-repository-cleanup-script",
      "weight": 10000
    }
  ]
}
2017/07/01 18:54:33
parent author
parent permlinkscripts
authorrnason
permlinkdirectory-repository-cleanup-script
titleDirectory/Repository Cleanup Script
body# Repository Cleanup Script <br> ## Description ------- The purpose of this script is to be ran against a directory containing versioned files that have the same base name. In instances where you are dumping packages such as RPMs or DEB files to a repository server, and want to keep the last 5 or 10 builds, but clean anything older than that, then this script will do just that. It can be ran against a directory and given 2 arguments, the first being the file name, the second being the number of previous versions that you would like to keep. <br> ## Usage ------- ### THIS SCRIPT REQUIRES 2 ARGUMENTS: <br> <br> * Arg1 - File Name - The non unique base name of the file being cleaned. <br> * Arg2 - Keep Revs - The number of instances of the file to keep. </div> <br> __1. &nbsp;&nbsp; Copy the script:__ <br> Copy the script and place it either in the directory that is being cleaned or in a separate directory if it will be used to clean multiple directories. <br> Lets clean this directory up using the script, feeding it the 2 required arguments. <br> * Arg1 - File Name - fuse <br> * Arg2 - Keep Revs - 5 <br> __2. &nbsp;&nbsp; Prepare to run the script:__ <br> In this example we will look at a directory containing 9 rpms that came from jenkins builds and were deposited into the proper yum server directory. ```bash -rwxr-xr-x. 1 root root 2.8K May 19 14:18 clean.sh -rw-r--r--. 1 root root 77K May 19 14:12 fuse-2.9.4-29.x86_64.rpm -rw-r--r--. 1 root root 77K May 19 14:12 fuse-2.9.4-30.x86_64.rpm -rw-r--r--. 1 root root 69K May 19 14:12 fuse-2.9.5-1.x86_64.rpm -rw-r--r--. 1 root root 335K May 19 14:12 fuse-2.9.5-2.x86_64.rpm -rw-r--r--. 1 root root 335K May 19 14:12 fuse-2.9.5-3.x86_64.rpm -rw-r--r--. 1 root root 335K May 19 14:12 fuse-2.9.5-4.x86_64.rpm -rw-r--r--. 1 root root 31K May 19 14:12 fuse-2.9.5-5.x86_64.rpm -rw-r--r--. 1 root root 31K May 19 14:12 fuse-2.9.5-6.x86_64.rpm -rw-r--r--. 1 root root 32K May 19 14:12 fuse-2.9.5-7.x86_64.rpm ``` <br> __3. &nbsp;&nbsp; Run the script:__ <br> Running this statement should run through the directory and keep the latest 5 copies of the RPMs in the directory, while removing anything more than the selected 5. <br> ### NOTICE: <br> This script will prompt you to ensure that the files that it has selected to remove are correct. You can avert this by running the script piping the answer into it <br> i.e echo "y" | ./clean.sh fuse 5 </div> <br> ```bash ./clean.sh fuse 5 ``` ```bash List of files that have been saved: ----------------------------------- fuse-2.9.5-7.x86_64.rpm fuse-2.9.5-6.x86_64.rpm fuse-2.9.5-5.x86_64.rpm fuse-2.9.5-4.x86_64.rpm fuse-2.9.5-3.x86_64.rpm List of files that have been removed: ------------------------------------- fuse-2.9.5-2.x86_64.rpm fuse-2.9.5-1.x86_64.rpm fuse-2.9.4-30.x86_64.rpm fuse-2.9.4-29.x86_64.rpm Would you like to delete the files in the delete list? (Y/y|N/n) y removed ‘fuse-2.9.5-2.x86_64.rpm’ removed ‘fuse-2.9.5-1.x86_64.rpm’ removed ‘fuse-2.9.4-30.x86_64.rpm’ removed ‘fuse-2.9.4-29.x86_64.rpm’ ``` <br> __4. &nbsp;&nbsp; Verify:__ <br> List the directory and ensure that the files that were removed were correctly removed. ```bash -rwxr-xr-x. 1 root root 2.8K May 19 14:18 clean.sh -rw-r--r--. 1 root root 335K May 19 14:12 fuse-2.9.5-3.x86_64.rpm -rw-r--r--. 1 root root 335K May 19 14:12 fuse-2.9.5-4.x86_64.rpm -rw-r--r--. 1 root root 31K May 19 14:12 fuse-2.9.5-5.x86_64.rpm -rw-r--r--. 1 root root 31K May 19 14:12 fuse-2.9.5-6.x86_64.rpm -rw-r--r--. 1 root root 32K May 19 14:12 fuse-2.9.5-7.x86_64.rpm ``` <br> # Script ------- ### NOTICE: <br> This script can be copied as is. There is no need to modify anything within the script contents.</div> <br> ```bash #!/bin/bash # Repo Cleanup Script # Rich Nason # Copyright 2016 appcontainers.com # Grab argument from command line and assign to FileName variable FILENAME=$1 REVS=$2 # If no arguement was supplied, then exit the script with indicator message if [[ -z $1 ]];then printf "\n" printf "\n" echo "You must supply an argument after the script to specify the rpm name to search for" echo "The argument will consist only of the package name, not the extention." echo "A second argument with the number of revisions to keep can also be supplied. (Default: 5)" printf "\n" echo "example 1: ./clean.sh nodejs" echo "example 2: ./clean.sh nodejs 10" printf "\n"printf "\n" exit 0 fi # If no number of revisions is set, auto set to 5 if [[ -z $2 ]];then REVS=5 fi # Set the FILELIST=(`ls -vr $FILENAME*`) SAVELIST=() DELETELIST=() # For each file in the directory with the name specified in the argument Reset the SAVE Bit to 0 # Then run a comparison test against latest 10 version numbers of the build. If there is a match, # then set the SAVE bit to 1, if there is no match, then the SAVE bit will remain at 0. # All files with the save bit set to 0 will be deleted. for x in ${FILELIST[@]}; do SAVE=0; #for y in `ls -vr eros_ads_content* | head`; do #for y in `ls -vr eros_ads_content* | head`; do # Head will only list the first 5 entries of the LS operation, If one of those files, matches a file # in the complete file list from the parent for loop, then the SAVE bit is set, which will save the file. for y in `ls -vr $FILENAME* | head -$REVS`; do if [[ $y == $x ]]; then SAVE=1; SAVELIST=(${SAVELIST[@]} $y) fi done # If the SAVE bit was not marked, via a comparison match meaning it is not one of first 10 files, # then it will be removed. if [[ $SAVE == 0 ]]; then DELETELIST=(${DELETELIST[@]} $x) #echo $x fi done # Print Report to show which files are to be deleted, and which are to be saved echo "List of files that have been saved:" echo "-----------------------------------" #echo ${SAVELIST[@]} for f in ${SAVELIST[@]};do echo $f; done printf "\n" printf "\n" echo "List of files that have been removed:" echo "-------------------------------------" #echo ${DELETELIST[@]} for f in ${DELETELIST[@]};do echo $f; done printf "\n" printf "\n" # Ask if you would like the files deleted, and if y then delete the files echo -e "Would you like to delete the files in the delete list? (Y/y|N/n)" read CONFIRM if [ "$CONFIRM" = "y" ] || [ "$CONFIRM" = "Y" ]; then for f in ${DELETELIST[@]};do rm -frv $f; done fi printf "\n" printf "\n" ```
json metadata{"tags":["scripts","bash","repos","devops"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #13309799/Trx 5bf94188c1a13703890218839419e12a0da30dbf
View Raw JSON Data
{
  "trx_id": "5bf94188c1a13703890218839419e12a0da30dbf",
  "block": 13309799,
  "trx_in_block": 7,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-01T18:54:33",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "scripts",
      "author": "rnason",
      "permlink": "directory-repository-cleanup-script",
      "title": "Directory/Repository Cleanup Script",
      "body": "# Repository Cleanup Script\n<br>\n\n## Description\n-------\n\nThe purpose of this script is to be ran against a directory containing versioned files\nthat have the same base name. In instances where you are dumping packages such as RPMs\nor DEB files to a repository server, and want to keep the last 5 or 10 builds, but clean\nanything older than that, then this script will do just that. It can be ran against a\ndirectory and given 2 arguments, the first being the file name, the second being the\nnumber of previous versions that you would like to keep.\n\n<br>\n\n## Usage\n-------\n\n### THIS SCRIPT REQUIRES 2 ARGUMENTS: <br> <br>\n\n* Arg1 - File Name - The non unique base name of the file being cleaned. <br>\n* Arg2 - Keep Revs - The number of instances of the file to keep. </div>\n\n<br>\n\n__1. &nbsp;&nbsp; Copy the script:__ <br>\nCopy the script and place it either in the directory that is being cleaned or\nin a separate directory if it will be used to clean multiple directories.\n\n<br>\n\nLets clean this directory up using the script, feeding it the 2 required arguments. <br>\n\n* Arg1 - File Name - fuse <br>\n* Arg2 - Keep Revs - 5\n\n<br>\n\n__2. &nbsp;&nbsp; Prepare to run the script:__ <br>\n\nIn this example we will look at a directory containing 9 rpms that came from jenkins builds\nand were deposited into the proper yum server directory.\n\n```bash\n-rwxr-xr-x.  1 root root 2.8K May 19 14:18 clean.sh\n-rw-r--r--.  1 root root  77K May 19 14:12 fuse-2.9.4-29.x86_64.rpm\n-rw-r--r--.  1 root root  77K May 19 14:12 fuse-2.9.4-30.x86_64.rpm\n-rw-r--r--.  1 root root  69K May 19 14:12 fuse-2.9.5-1.x86_64.rpm\n-rw-r--r--.  1 root root 335K May 19 14:12 fuse-2.9.5-2.x86_64.rpm\n-rw-r--r--.  1 root root 335K May 19 14:12 fuse-2.9.5-3.x86_64.rpm\n-rw-r--r--.  1 root root 335K May 19 14:12 fuse-2.9.5-4.x86_64.rpm\n-rw-r--r--.  1 root root  31K May 19 14:12 fuse-2.9.5-5.x86_64.rpm\n-rw-r--r--.  1 root root  31K May 19 14:12 fuse-2.9.5-6.x86_64.rpm\n-rw-r--r--.  1 root root  32K May 19 14:12 fuse-2.9.5-7.x86_64.rpm\n```\n\n<br>\n\n__3. &nbsp;&nbsp; Run the script:__ <br>\nRunning this statement should run through the directory and keep the latest 5 copies\nof the RPMs in the directory, while removing anything more than the selected 5.\n\n<br>\n\n### NOTICE: <br>\nThis script will prompt you to ensure that the files that it has selected to remove are correct. You can avert this by running the script piping the answer into it <br>\n\ni.e echo \"y\" | ./clean.sh fuse 5\n</div>\n\n<br>\n\n```bash\n./clean.sh fuse 5\n```\n\n```bash\nList of files that have been saved:\n-----------------------------------\nfuse-2.9.5-7.x86_64.rpm\nfuse-2.9.5-6.x86_64.rpm\nfuse-2.9.5-5.x86_64.rpm\nfuse-2.9.5-4.x86_64.rpm\nfuse-2.9.5-3.x86_64.rpm\n\n\nList of files that have been removed:\n-------------------------------------\nfuse-2.9.5-2.x86_64.rpm\nfuse-2.9.5-1.x86_64.rpm\nfuse-2.9.4-30.x86_64.rpm\nfuse-2.9.4-29.x86_64.rpm\n\n\nWould you like to delete the files in the delete list? (Y/y|N/n)\ny\n\nremoved ‘fuse-2.9.5-2.x86_64.rpm’\nremoved ‘fuse-2.9.5-1.x86_64.rpm’\nremoved ‘fuse-2.9.4-30.x86_64.rpm’\nremoved ‘fuse-2.9.4-29.x86_64.rpm’\n```\n\n<br>\n\n__4. &nbsp;&nbsp; Verify:__ <br>\nList the directory and ensure that the files that were removed were correctly removed.\n\n```bash\n-rwxr-xr-x.  1 root root 2.8K May 19 14:18 clean.sh\n-rw-r--r--.  1 root root 335K May 19 14:12 fuse-2.9.5-3.x86_64.rpm\n-rw-r--r--.  1 root root 335K May 19 14:12 fuse-2.9.5-4.x86_64.rpm\n-rw-r--r--.  1 root root  31K May 19 14:12 fuse-2.9.5-5.x86_64.rpm\n-rw-r--r--.  1 root root  31K May 19 14:12 fuse-2.9.5-6.x86_64.rpm\n-rw-r--r--.  1 root root  32K May 19 14:12 fuse-2.9.5-7.x86_64.rpm\n```\n\n<br>\n\n# Script\n-------\n\n### NOTICE: <br>\nThis script can be copied as is. There is no need to modify anything within the script contents.</div>\n\n<br>\n\n```bash\n#!/bin/bash\n\n# Repo Cleanup Script\n# Rich Nason\n# Copyright 2016 appcontainers.com\n\n# Grab argument from command line and assign to FileName variable\nFILENAME=$1\nREVS=$2\n\n# If no arguement was supplied, then exit the script with indicator message\nif [[ -z $1 ]];then\n        printf \"\\n\"\n        printf \"\\n\"\n        echo \"You must supply an argument after the script to specify the rpm name to search for\"\n        echo \"The argument will consist only of the package name, not the extention.\"\n        echo \"A second argument with the number of revisions to keep can also be supplied. (Default: 5)\"\n        printf \"\\n\"\n        echo \"example 1: ./clean.sh nodejs\"\n        echo \"example 2: ./clean.sh nodejs 10\"\n        printf \"\\n\"printf \"\\n\"\n\n        exit 0\nfi\n\n# If no number of revisions is set, auto set to 5\nif [[ -z $2 ]];then\n        REVS=5\nfi\n\n# Set the\nFILELIST=(`ls -vr $FILENAME*`)\nSAVELIST=()\nDELETELIST=()\n\n# For each file in the directory with the name specified in the argument Reset the SAVE Bit to 0\n# Then run a comparison test against latest 10 version numbers of the build. If there is a match,\n# then set the SAVE bit to 1, if there is no match, then the SAVE bit will remain at 0.\n# All files with the save bit set to 0 will be deleted.\nfor x in ${FILELIST[@]}; do\n        SAVE=0;\n        #for y in `ls -vr eros_ads_content* | head`; do\n        #for y in `ls -vr eros_ads_content* | head`; do\n\n        # Head will only list the first 5 entries of the LS operation, If one of those files, matches a file\n        # in the complete file list from the parent for loop, then the SAVE bit is set, which will save the file.\n        for y in `ls -vr $FILENAME* | head -$REVS`; do\n                if [[ $y == $x ]]; then\n                        SAVE=1;\n                        SAVELIST=(${SAVELIST[@]} $y)\n                fi\n        done\n\n        # If the SAVE bit was not marked, via a comparison match meaning it is not one of first 10 files,\n        # then it will be removed.\n        if [[ $SAVE == 0 ]]; then\n                DELETELIST=(${DELETELIST[@]} $x)\n                #echo $x\n        fi\ndone\n\n# Print Report to show which files are to be deleted, and which are to be saved\necho \"List of files that have been saved:\"\necho \"-----------------------------------\"\n#echo ${SAVELIST[@]}\nfor f in ${SAVELIST[@]};do\n        echo $f;\ndone\n\nprintf \"\\n\"\nprintf \"\\n\"\n\necho \"List of files that have been removed:\"\necho \"-------------------------------------\"\n\n#echo ${DELETELIST[@]}\nfor f in ${DELETELIST[@]};do\n        echo $f;\ndone\n\nprintf \"\\n\"\nprintf \"\\n\"\n# Ask if you would like the files deleted, and if y then delete the files\necho -e \"Would you like to delete the files in the delete list? (Y/y|N/n)\"\nread CONFIRM\n\nif [ \"$CONFIRM\" = \"y\" ] || [ \"$CONFIRM\" = \"Y\" ]; then\n        for f in ${DELETELIST[@]};do\n                rm -frv $f;\n        done\nfi\n\nprintf \"\\n\"\nprintf \"\\n\"\n```",
      "json_metadata": "{\"tags\":[\"scripts\",\"bash\",\"repos\",\"devops\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
2017/07/01 18:49:00
voterrnason
authorrnason
permlinkpowershell-send-mail-script
weight10000 (100.00%)
Transaction InfoBlock #13309688/Trx ebe4fcf932ce43cc945a8d879a890c9660cf5028
View Raw JSON Data
{
  "trx_id": "ebe4fcf932ce43cc945a8d879a890c9660cf5028",
  "block": 13309688,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-01T18:49:00",
  "op": [
    "vote",
    {
      "voter": "rnason",
      "author": "rnason",
      "permlink": "powershell-send-mail-script",
      "weight": 10000
    }
  ]
}
rnasonpublished a new post: powershell-send-mail-script
2017/07/01 18:49:00
parent author
parent permlinkscripts
authorrnason
permlinkpowershell-send-mail-script
titlePowershell Send Mail Script
body# Powershell Send Mail Script <br> ## Description ------- This script is designed to Execute a VBS script and then use Powershell to e-mail the VBS created report. To use this script copy the contents of the script into notepad and save the file as FileName.ps1 Remember that in order to run scripts you may need to change the Powershell Execution Policy. <br> ## Usage ------- ### THIS SCRIPT REQUIRES MODIFICATION: <br> <br> The following variables will need to be changed:<br> * $From = "The e-mail address you wish the script to send mail as"<br> * $To = "The e-mail address you wish to send the mail to"<br> * $Subject = "The subject line of the e-mail"<br> * $Body = "The text you wish to put in the body of the e-mail message"<br> * $FileAttach = "The location and file name of the file you wish to attach to in the e-mail message"<br> * $SMTPServer = "The name or IP of the e-mail server you which will relay the e-mail"</div> <br> __1. &nbsp;&nbsp; Copy the script:__ <br> Copy the script and place the script in whatever directory that you will execute it from. <br> __3. &nbsp;&nbsp; Run the script:__ <br> Run the script using cscript to send the email notification. ```powershell cscript.exe "C:\Scripts\ScriptName.vbs" ``` <br> # Script ------- ### NOTICE: <br> This script can be copied as is. The top half containing fields such as from, to, subject, body, attachments, and the smtp server will need to be modified before execution.</div> <br> ```powershell $Date = get-date $From = "[email protected]" $To = "[email protected]" $Subject = "Weekly Log Report - $Date" $Body = "Please browse the included report for a list of Log files that have reached the set retention period and have been deleted" $FileAttach = "C:\Scripts\LogReport.txt" $SMTPServer = "exchange-server.somedomain.com" $Attachment = new-object Net.Mail.Attachment($FileAttach) $SMTP = new-object Net.Mail.SmtpClient($SMTPServer) $MSG = new-object Net.Mail.MailMessage($From, $To, $Subject, $Body) $MSG.attachments.add($Attachment) $SMTP.send($msg) ```
json metadata{"tags":["scripts","powershell"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #13309688/Trx ebe4fcf932ce43cc945a8d879a890c9660cf5028
View Raw JSON Data
{
  "trx_id": "ebe4fcf932ce43cc945a8d879a890c9660cf5028",
  "block": 13309688,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-07-01T18:49:00",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "scripts",
      "author": "rnason",
      "permlink": "powershell-send-mail-script",
      "title": "Powershell Send Mail Script",
      "body": "# Powershell Send Mail Script\n<br>\n\n## Description\n-------\n\nThis script is designed to Execute a VBS script and then use Powershell to e-mail the VBS created report.\nTo use this script copy the contents of the script into notepad and save the file as FileName.ps1\nRemember that in order to run scripts you may need to change the Powershell Execution Policy.\n\n<br>\n\n## Usage\n-------\n\n### THIS SCRIPT REQUIRES MODIFICATION: <br> <br>\nThe following variables will need to be changed:<br>\n\n* $From = \"The e-mail address you wish the script to send mail as\"<br>\n* $To = \"The e-mail address you wish to send the mail to\"<br>\n* $Subject = \"The subject line of the e-mail\"<br>\n* $Body = \"The text you wish to put in the body of the e-mail message\"<br>\n* $FileAttach = \"The location and file name of the file you wish to attach to in the e-mail message\"<br>\n* $SMTPServer = \"The name or IP of the e-mail server you which will relay the e-mail\"</div>\n\n<br>\n\n__1. &nbsp;&nbsp; Copy the script:__ <br>\nCopy the script and place the script in whatever directory that you will execute it from.\n\n<br>\n\n__3. &nbsp;&nbsp; Run the script:__ <br>\nRun the script using cscript to send the email notification.\n\n```powershell\ncscript.exe \"C:\\Scripts\\ScriptName.vbs\"\n```\n\n<br>\n\n# Script\n-------\n\n### NOTICE: <br>\nThis script can be copied as is. The top half containing fields such as from, to, subject, body, attachments, and the smtp server will need to be modified before execution.</div>\n\n<br>\n\n```powershell\n$Date = get-date\n\n$From = \"[email protected]\"\n$To = \"[email protected]\"\n$Subject = \"Weekly Log Report - $Date\"\n$Body = \"Please browse the included report for a list of Log files that have reached the set retention period and have been deleted\"\n$FileAttach = \"C:\\Scripts\\LogReport.txt\"\n$SMTPServer = \"exchange-server.somedomain.com\"\n\n$Attachment = new-object Net.Mail.Attachment($FileAttach)\n$SMTP = new-object Net.Mail.SmtpClient($SMTPServer)\n$MSG = new-object Net.Mail.MailMessage($From, $To, $Subject, $Body)\n$MSG.attachments.add($Attachment)\n$SMTP.send($msg)\n```",
      "json_metadata": "{\"tags\":[\"scripts\",\"powershell\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
2017/06/29 00:23:03
voterklausthaler
authorrnason
permlinkethereum-aws-miner-node-installation-and-setup
weight10000 (100.00%)
Transaction InfoBlock #13230016/Trx df9a603545ef58c63e1a8d8184b2ffea6096e41e
View Raw JSON Data
{
  "trx_id": "df9a603545ef58c63e1a8d8184b2ffea6096e41e",
  "block": 13230016,
  "trx_in_block": 9,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-06-29T00:23:03",
  "op": [
    "vote",
    {
      "voter": "klausthaler",
      "author": "rnason",
      "permlink": "ethereum-aws-miner-node-installation-and-setup",
      "weight": 10000
    }
  ]
}
rnasonclaimed reward balance: 0.256 SBD, 0.157 SP
2017/06/21 12:43:42
accountrnason
reward steem0.000 STEEM
reward sbd0.256 SBD
reward vests254.603651 VESTS
Transaction InfoBlock #13014811/Trx e83c3a7a5ba4ac00e1cd193dbc1b2e9177e77231
View Raw JSON Data
{
  "trx_id": "e83c3a7a5ba4ac00e1cd193dbc1b2e9177e77231",
  "block": 13014811,
  "trx_in_block": 20,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-06-21T12:43:42",
  "op": [
    "claim_reward_balance",
    {
      "account": "rnason",
      "reward_steem": "0.000 STEEM",
      "reward_sbd": "0.256 SBD",
      "reward_vests": "254.603651 VESTS"
    }
  ]
}
rnasonreceived 0.121 SBD, 0.071 SP author reward for @rnason / setting-static-routes-in-linux
2017/06/21 11:51:24
authorrnason
permlinksetting-static-routes-in-linux
sbd payout0.121 SBD
steem payout0.000 STEEM
vesting payout115.914291 VESTS
Transaction InfoBlock #13013768/Virtual Operation #10
View Raw JSON Data
{
  "trx_id": "0000000000000000000000000000000000000000",
  "block": 13013768,
  "trx_in_block": 4294967295,
  "op_in_trx": 0,
  "virtual_op": 10,
  "timestamp": "2017-06-21T11:51:24",
  "op": [
    "author_reward",
    {
      "author": "rnason",
      "permlink": "setting-static-routes-in-linux",
      "sbd_payout": "0.121 SBD",
      "steem_payout": "0.000 STEEM",
      "vesting_payout": "115.914291 VESTS"
    }
  ]
}
2017/06/21 11:33:18
authorrnason
permlinkhow-i-booted-my-un-bootable-mac-another-osx-grey-screen-recovery-tale
sbd payout0.050 SBD
steem payout0.000 STEEM
vesting payout49.677587 VESTS
Transaction InfoBlock #13013408/Virtual Operation #9
View Raw JSON Data
{
  "trx_id": "0000000000000000000000000000000000000000",
  "block": 13013408,
  "trx_in_block": 4294967295,
  "op_in_trx": 0,
  "virtual_op": 9,
  "timestamp": "2017-06-21T11:33:18",
  "op": [
    "author_reward",
    {
      "author": "rnason",
      "permlink": "how-i-booted-my-un-bootable-mac-another-osx-grey-screen-recovery-tale",
      "sbd_payout": "0.050 SBD",
      "steem_payout": "0.000 STEEM",
      "vesting_payout": "49.677587 VESTS"
    }
  ]
}
rnasonreceived 0.028 SBD, 0.017 SP author reward for @rnason / apple-osx-tips-and-tricks
2017/06/21 11:24:18
authorrnason
permlinkapple-osx-tips-and-tricks
sbd payout0.028 SBD
steem payout0.000 STEEM
vesting payout26.908702 VESTS
Transaction InfoBlock #13013228/Virtual Operation #4
View Raw JSON Data
{
  "trx_id": "0000000000000000000000000000000000000000",
  "block": 13013228,
  "trx_in_block": 4294967295,
  "op_in_trx": 0,
  "virtual_op": 4,
  "timestamp": "2017-06-21T11:24:18",
  "op": [
    "author_reward",
    {
      "author": "rnason",
      "permlink": "apple-osx-tips-and-tricks",
      "sbd_payout": "0.028 SBD",
      "steem_payout": "0.000 STEEM",
      "vesting_payout": "26.908702 VESTS"
    }
  ]
}
2017/06/20 16:59:57
voterroscrypto
authorrnason
permlinkethereum-aws-miner-node-installation-and-setup
weight10000 (100.00%)
Transaction InfoBlock #12991275/Trx ee9545abd28f4250114e6b7cda4b7ccd8ca17f71
View Raw JSON Data
{
  "trx_id": "ee9545abd28f4250114e6b7cda4b7ccd8ca17f71",
  "block": 12991275,
  "trx_in_block": 35,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-06-20T16:59:57",
  "op": [
    "vote",
    {
      "voter": "roscrypto",
      "author": "rnason",
      "permlink": "ethereum-aws-miner-node-installation-and-setup",
      "weight": 10000
    }
  ]
}
rnasonreceived 0.012 SBD, 0.009 SP author reward for @rnason / building-an-ethereum-go-geth-rpm
2017/06/19 16:40:48
authorrnason
permlinkbuilding-an-ethereum-go-geth-rpm
sbd payout0.012 SBD
steem payout0.000 STEEM
vesting payout14.490683 VESTS
Transaction InfoBlock #12962209/Virtual Operation #6
View Raw JSON Data
{
  "trx_id": "0000000000000000000000000000000000000000",
  "block": 12962209,
  "trx_in_block": 4294967295,
  "op_in_trx": 0,
  "virtual_op": 6,
  "timestamp": "2017-06-19T16:40:48",
  "op": [
    "author_reward",
    {
      "author": "rnason",
      "permlink": "building-an-ethereum-go-geth-rpm",
      "sbd_payout": "0.012 SBD",
      "steem_payout": "0.000 STEEM",
      "vesting_payout": "14.490683 VESTS"
    }
  ]
}
rnasonreceived 0.045 SBD, 0.029 SP author reward for @rnason / installing-nginx-using-ansible
2017/06/19 15:19:39
authorrnason
permlinkinstalling-nginx-using-ansible
sbd payout0.045 SBD
steem payout0.000 STEEM
vesting payout47.612388 VESTS
Transaction InfoBlock #12960590/Virtual Operation #3
View Raw JSON Data
{
  "trx_id": "0000000000000000000000000000000000000000",
  "block": 12960590,
  "trx_in_block": 4294967295,
  "op_in_trx": 0,
  "virtual_op": 3,
  "timestamp": "2017-06-19T15:19:39",
  "op": [
    "author_reward",
    {
      "author": "rnason",
      "permlink": "installing-nginx-using-ansible",
      "sbd_payout": "0.045 SBD",
      "steem_payout": "0.000 STEEM",
      "vesting_payout": "47.612388 VESTS"
    }
  ]
}
2017/06/17 22:09:51
voterarrogantswine
authorrnason
permlinkethereum-aws-miner-node-installation-and-setup
weight10000 (100.00%)
Transaction InfoBlock #12911247/Trx 52dabd8a3191044ef0df250a218209b8501db86c
View Raw JSON Data
{
  "trx_id": "52dabd8a3191044ef0df250a218209b8501db86c",
  "block": 12911247,
  "trx_in_block": 5,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-06-17T22:09:51",
  "op": [
    "vote",
    {
      "voter": "arrogantswine",
      "author": "rnason",
      "permlink": "ethereum-aws-miner-node-installation-and-setup",
      "weight": 10000
    }
  ]
}

Account Metadata

POSTING JSON METADATA
profile{"profile_image":"https://s3.amazonaws.com/nason.co/assets/custom/images/Rich-Cafe.png","name":"Rich Nason","website":"http://nason.co"}
JSON METADATA
profile{"profile_image":"https://s3.amazonaws.com/nason.co/assets/custom/images/Rich-Cafe.png","name":"Rich Nason","website":"http://nason.co"}
{
  "posting_json_metadata": {
    "profile": {
      "profile_image": "https://s3.amazonaws.com/nason.co/assets/custom/images/Rich-Cafe.png",
      "name": "Rich Nason",
      "website": "http://nason.co"
    }
  },
  "json_metadata": {
    "profile": {
      "profile_image": "https://s3.amazonaws.com/nason.co/assets/custom/images/Rich-Cafe.png",
      "name": "Rich Nason",
      "website": "http://nason.co"
    }
  }
}

Auth Keys

Owner
Single Signature
Public Keys
STM8T1fLvndVZ8ugza43rHGmfbxxtP8xafvYnRqGz2sWBgJCcRwa71/1
Active
Single Signature
Public Keys
STM6AJRaY7mu2FqTgJTAWHyTwyjYKhVunGgLyvfz4hoUSpCWZpUrB1/1
Posting
Single Signature
Public Keys
STM8YrgoiZFKR8PddtiE56zLPzVcWp5ovNtXGSm4miiFTKKgzeKJD1/1
Memo
STM5wrGzEo5952zWDRw2ftCJpVzcLSsRkxK4WaM8DDzRo75Kvwymb
{
  "owner": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM8T1fLvndVZ8ugza43rHGmfbxxtP8xafvYnRqGz2sWBgJCcRwa7",
        1
      ]
    ]
  },
  "active": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM6AJRaY7mu2FqTgJTAWHyTwyjYKhVunGgLyvfz4hoUSpCWZpUrB",
        1
      ]
    ]
  },
  "posting": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM8YrgoiZFKR8PddtiE56zLPzVcWp5ovNtXGSm4miiFTKKgzeKJD",
        1
      ]
    ]
  },
  "memo": "STM5wrGzEo5952zWDRw2ftCJpVzcLSsRkxK4WaM8DDzRo75Kvwymb"
}

Witness Votes

0 / 30
No active witness votes.
[]