tag:blogger.com,1999:blog-49122264164009690492024-03-29T03:30:08.305+00:00My Public NotepadBits and bobs about computers and programmingBojan Komazechttp://www.blogger.com/profile/05437236807206825832noreply@blogger.comBlogger369125tag:blogger.com,1999:blog-4912226416400969049.post-5369644030034280632024-03-06T15:59:00.008+00:002024-03-06T15:59:46.001+00:00Go Methods<div style="text-align: left;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ3lA9uklO42hjbFd4933GW7wV2uzLO1pkbGAUjYMKL5KJ6QOAYRnwQPZTzWLTvHo2AUTk19f99kvfAkUwyWQB0oyQtvvbKyv-DO5aoSFjh7FFLXLG74jUyaULvhOKUAREdw_d2CWl2d-jpTTjGBMTdfBXfwXsM5WAZn4jn16RiuFCFnfLQI40NxHFWZs/s331/Go%20Methods.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="228" data-original-width="331" height="440" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJ3lA9uklO42hjbFd4933GW7wV2uzLO1pkbGAUjYMKL5KJ6QOAYRnwQPZTzWLTvHo2AUTk19f99kvfAkUwyWQB0oyQtvvbKyv-DO5aoSFjh7FFLXLG74jUyaULvhOKUAREdw_d2CWl2d-jpTTjGBMTdfBXfwXsM5WAZn4jn16RiuFCFnfLQI40NxHFWZs/w640-h440/Go%20Methods.png" width="640" /></a></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div>In Go, <b>methods</b> are functions which are associated with some type; this type is called <b>Receiver Type</b> and methods are often called <b>Receiver Functions</b>. Their format is:</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><span style="color: #38761d; font-family: courier;">func (rcv RcvT) foo(arg1 TArg1, arg2 TArg2, ...) RtnT {</span></div><div style="text-align: left;"><span style="color: #38761d; font-family: courier;"> ...</span></div><div style="text-align: left;"><span style="color: #38761d; font-family: courier;"> // use rcv</span></div><div style="text-align: left;"><span style="color: #38761d; font-family: courier;">}<br /></span><div><br /></div><div><br /></div><div>This example shows some interesting properties of methods:</div><div><br /></div><div><br /></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">package main</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><br /></span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">import "fmt"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><br /></span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">type MyInt struct {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small; white-space: normal;"><span style="white-space: pre;"> </span>i int</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">}</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><br /></span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">// associate function to a structure</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">// *MyInt is a Receiver type (here, it's a pointer type)</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">// multiply is now a Receiver function. From now on it requires a receiver in order to be called: (*MyInt).multiply</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">// When called on MyInt instance pointer, a copy of that pointer is passed to this function.</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">func (mi *MyInt) multiply(i int) {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small; white-space: normal;"><span style="white-space: pre;"> </span>mi.i = mi.i * i</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">}</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><br /></span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">// Receiver type can also be a value type.</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">// From now on it requires a receiver in order to be called: (MyInt).multiply</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">// When called on MyInt instance, a copy of that object is passed to this function.</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">func (mi MyInt) add(i int) {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small; white-space: normal;"><span style="white-space: pre;"> </span>mi.i = mi.i + i</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">}</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><br /></span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">func assign_struct_function_to_var(mi *MyInt) {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small; white-space: normal;"><span style="white-space: pre;"> </span>// Although function variable does not mention Receiver type...</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small; white-space: normal;"><span style="white-space: pre;"> </span>var f func(i int)</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small; white-space: normal;"><span style="white-space: pre;"> </span>// ...we can assign Receiver function to it!</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small; white-space: normal;"><span style="white-space: pre;"> </span>f = mi.multiply</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><br /></span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small; white-space: normal;"><span style="white-space: pre;"> </span>f(2)</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small; white-space: normal;"><span style="white-space: pre;"> </span>fmt.Printf("%d\n", mi.i)</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><br /></span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small; white-space: normal;"><span style="white-space: pre;"> </span>// function associated to struct can't be used in assignments on its own</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small; white-space: normal;"><span style="white-space: pre;"> </span>// error:</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small; white-space: normal;"><span style="white-space: pre;"> </span>// undefined: multiply</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small; white-space: normal;"><span style="white-space: pre;"> </span>// f = multiply</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">}</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><br /></span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">func main() {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small; white-space: normal;"><span style="white-space: pre;"> </span>mi := MyInt{}</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small; white-space: normal;"><span style="white-space: pre;"> </span>mi.i = 1</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small; white-space: normal;"><span style="white-space: pre;"> </span>fmt.Printf("%d\n", mi.i)</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><br /></span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small; white-space: normal;"><span style="white-space: pre;"> </span>// function associated to struct can't be invoked on its own</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small; white-space: normal;"><span style="white-space: pre;"> </span>// error:</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small; white-space: normal;"><span style="white-space: pre;"> </span>// undefined: multiply</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small; white-space: normal;"><span style="white-space: pre;"> </span>// multiply(2)</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><br /></span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small; white-space: normal;"><span style="white-space: pre;"> </span>assign_struct_function_to_var(&mi)</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">}</span></div><div><br /></div></div>Bojan Komazechttp://www.blogger.com/profile/05437236807206825832noreply@blogger.com0tag:blogger.com,1999:blog-4912226416400969049.post-11217802210436695762024-03-04T13:38:00.002+00:002024-03-04T13:38:37.364+00:00HashiCorp Packer<div style="text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhV99_zJSa9JDnp3efjBwQMV8RA_Qtaw1HcY-lrV9zS92R1vwsqLJDOyfEv2eSOrPRQGEkqQ7Ra99xMfD_nOJXgsL9tr_8PeSrKYku89T0-eT8CwYHPeGjZ1zW3vFknRGkiPYAoahTkIvHXyxKI0AbIuee9ntDILT55bgeHRU2VHADCKg2Po67Napv-aDI/s1200/packer-logo.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="600" data-original-width="1200" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhV99_zJSa9JDnp3efjBwQMV8RA_Qtaw1HcY-lrV9zS92R1vwsqLJDOyfEv2eSOrPRQGEkqQ7Ra99xMfD_nOJXgsL9tr_8PeSrKYku89T0-eT8CwYHPeGjZ1zW3vFknRGkiPYAoahTkIvHXyxKI0AbIuee9ntDILT55bgeHRU2VHADCKg2Po67Napv-aDI/w640-h320/packer-logo.jpeg" width="640" /></a></div><br /><div style="text-align: left;">Packer is a tool for creating (golden) images from a configurable template. </div><div style="text-align: left;"><br /></div><div style="text-align: left;">Packer configuration file is a JSON file e.g. config.json.</div><div style="text-align: left;"><br /></div><div style="text-align: left;">config.json contains:</div><div style="text-align: left;"><ul style="text-align: left;"><li>variables</li><li>builders</li><ul><li>type</li><ul><li> amazon-ebs</li></ul></ul><li>provisioners</li><ul><li>type</li><ul><li>shell</li><li>ansible</li></ul></ul></ul></div><div style="text-align: left;"><br /></div><div style="text-align: left;">Example of configuration file used to create AWS AMI for multiple environments, by using Ansible as a provisioner:</div><div style="text-align: left;"><br /></div><div style="text-align: left;">config.json:</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><div><span style="color: #38761d; font-family: courier; font-size: x-small;">{</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "variables": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "env_name": "{{env `env_name`}}",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "instance_profile": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "ami_name": "asb-linux-al23-arm-{{timestamp}}",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "kms_key_id": "{{env `kms_key_id`}}",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "sg_default": "{{env `SG_DEFAULT`}}",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "current_user": "{{env `USER`}}"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "builders": [</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "ami_name": "{{user `ami_name`}}",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "instance_type": "t4g.medium",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "region": "us-east-1",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "source_ami_filter": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "filters": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "virtualization-type": "hvm",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "name": "al2023-ami-2023.*-kernel-6.1-arm64",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "root-device-type": "ebs"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "owners": "amazon",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "most_recent": true</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "ssh_username": "ec2-user",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "ssh_bastion_host": "bastion.mycorp.com",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "ssh_bastion_username": "{{user `current_user`}}",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "ssh_bastion_agent_auth": true,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "ssh_bastion_port": 22,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "ssh_timeout": "2m",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "ssh_clear_authorized_keys": "true",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "iam_instance_profile": "{{user `instance_profile`}}",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "type": "amazon-ebs",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "tags": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Name": "{{user `ami_name`}}",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Environment": "{{user `env_name`}}"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "vpc_filter": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "filters": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "tag:Environment": "{{user `env_name`}}",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "isDefault": "false"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> }</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "subnet_filter": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "filters": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "tag:Name": "vpc-{{user `env_name`}}-private-us-east-*"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "most_free": true</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "security_group_ids": [</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "{{user `sg_default`}}"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> ],</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "launch_block_device_mappings": [</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "device_name": "/dev/xvda",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "encrypted": true,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "kms_key_id": "{{user `kms_key_id`}}",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "delete_on_termination": true,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "volume_type": "gp3"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> }</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> ]</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> }</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> ],</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "provisioners": [</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "type": "shell",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "inline": [</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "sudo dnf update -y",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "sudo dnf install -y python3"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> ]</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "type": "ansible",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "host_alias": "packer",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "user": "ec2-user",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "inventory_directory": "ansible/env/aws/{{user `env_name`}}",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "playbook_file": "ansible/playbooks/playbook.yml",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "extra_arguments": [</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "-D",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "--vault-password-file",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "./aws-{{user `env_name`}}-vault.pw",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "--scp-extra-args", "'-O'",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "--extra-vars",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "'ansible_python_interpreter=/usr/bin/python3'"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> ]</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> }</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> ]</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">}</span></div><div><br /></div><div><br /></div><div>To run Packer:</div> <br /><span style="color: #38761d; font-family: courier;">$ packer build [-debug] config.json</span></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;">AWS AMI gets created in the following way:</div><div style="text-align: left;"><ul style="text-align: left;"><li>a temporary SSH keypair is created</li><li>new temporary EC2 instance is started. This instance is based on source AMI specified in configuration file</li><li>SSH tunnel is established between local/dev host and remote EC2 instance</li><li>provisioners are run e.g. Ansible is installing packages etc...</li><li>once provisioners work is completed ephemeral key is removed from authorized_keys file on temp EC2 instance</li><li>temp EC2 instance is terminated</li><li>a snapshot of the root disk of that EC2 instance is created</li><li>a new AMI is created based on that snapshot</li><li>tags are added to snapshot</li><li>tags are added to AMI</li><li>temp SSH keypair is destroyed</li></ul></div><div style="text-align: left;"><br /></div><div style="text-align: left;">Once AMI is created, it is not possible to find out which AMI was used as a source (base) AMI (<a href="https://stackoverflow.com/questions/74322483/is-it-possible-to-find-the-source-ami-for-an-existing-ami">amazon web services - Is it possible to find the source AMI for an existing AMI? - Stack Overflow</a>). But soon after AMI is created, we can check properties of temp EC2 instance (which is in Terminated state) and check its AMI. For source AMI filter as above, it could be e.g. <span style="font-family: courier;">al2023-ami-2023.3.20240219.0-kernel-6.1-arm64</span>.</div><div style="text-align: left;"><br /></div><div style="text-align: left;">---</div>Bojan Komazechttp://www.blogger.com/profile/05437236807206825832noreply@blogger.com0tag:blogger.com,1999:blog-4912226416400969049.post-70383926660467505012024-02-29T01:00:00.004+00:002024-02-29T13:17:41.291+00:00Amazon Elastic Block Store (EBS)<p> </p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQ7S8jTOz9ZGwcAlmLy1guN6NwkfuP2_bMl4PZaNZTLmyr8ymKm4VlyECwCtgNx8jrPNT2-D1bBVgDgGo9eITWMcR5YWyHzYhu9UBwenvS2OnvkWq3YcO1WIDQRBNCNfjR8om9Dz4fAci7wS-jvWHbHYkzmFHrIT_QVidA4dnG638ipGSuLkXtbBZC/s1200/AWS_Simple_Icons_Storage_Amazon_EBS.svg.png" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="1200" data-original-width="1200" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQ7S8jTOz9ZGwcAlmLy1guN6NwkfuP2_bMl4PZaNZTLmyr8ymKm4VlyECwCtgNx8jrPNT2-D1bBVgDgGo9eITWMcR5YWyHzYhu9UBwenvS2OnvkWq3YcO1WIDQRBNCNfjR8om9Dz4fAci7wS-jvWHbHYkzmFHrIT_QVidA4dnG638ipGSuLkXtbBZC/w640-h640/AWS_Simple_Icons_Storage_Amazon_EBS.svg.png" width="640" /></a>Amazon <b>Elastic Block Store (EBS)</b></p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYdxcxR35dYXIJJQh2PXNiiGJOG62hqGyIT_t9aDE2DCMMRyEZ6DClAU0bluuPWYNja8JXdgA7yT80MGmMf5gwi2B54VzRMQO95tiHlhv-PjR2SiMEvUcEwR7-p_J7b0jva10oCI6gpPthuTlJkvymzsvOqMo78VuZ8nHYAV4j__xRJSXb3sFwLZkIQWM/s1668/Screenshot%202024-02-29%20at%2000.54.59.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1668" data-original-width="376" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYdxcxR35dYXIJJQh2PXNiiGJOG62hqGyIT_t9aDE2DCMMRyEZ6DClAU0bluuPWYNja8JXdgA7yT80MGmMf5gwi2B54VzRMQO95tiHlhv-PjR2SiMEvUcEwR7-p_J7b0jva10oCI6gpPthuTlJkvymzsvOqMo78VuZ8nHYAV4j__xRJSXb3sFwLZkIQWM/s16000/Screenshot%202024-02-29%20at%2000.54.59.png" /></a></div><br /><b><br /></b><p></p><ul style="text-align: left;"><li>Part of EC2 ecosystem</li><li>Manages 3 entities:</li><ul><li>Volumes</li><li>Snapshots</li><li>Lifecycle Manager</li></ul><li>system storage for AWS EC2 VMs</li><li>reduces risk</li><li>durable</li><li>secure</li><li>avoid risks of physical media handling</li><li>2 types:</li><ul><li>Solid State Drive (SSD) - backed:<br /></li><ul><li>general purpose<br /></li><li>provisioned IOPS <br /></li></ul><li>Hard Disk Drive (HDD) - backed:<br /></li><ul><li>Throughput optimized</li><li>Cold</li></ul></ul></ul><div style="text-align: left;"><br /></div><div style="text-align: left;">Data is broken down into blocks and stored as a separate piece. Each block has unique ID. <br />Only a single EC2 instance, in a single AZ can access data on EBS.</div><div style="text-align: left;"><br /></div><div style="text-align: left;">When we're launching a new EC2 instance, we need to specify the storage for root volume and (optionally) more volumes. These are basically "hard disks" which are used to persistently store OS and (our) applications, between (EC2) virtual machine restarts.</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDH-sub5WGIlf0XbxYjF-PWgkvSdTgRvEZRNE-wxRP3koK9Epy5kcUP4E_1Yyu8eP7lIgLXpSKuiUHtvmR-yf-GiX8cdHEEH1bcJkGcvv5ovldM8QzAX2c-DFMYX2LG8Ki2Z1yzgKI5TjCSj6_JjwpKzcJNqgGFffX585zRtwshkdzrOTxwN0wmdr4YTk/s1406/Screenshot%202024-02-29%20at%2000.32.46.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1406" data-original-width="1208" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDH-sub5WGIlf0XbxYjF-PWgkvSdTgRvEZRNE-wxRP3koK9Epy5kcUP4E_1Yyu8eP7lIgLXpSKuiUHtvmR-yf-GiX8cdHEEH1bcJkGcvv5ovldM8QzAX2c-DFMYX2LG8Ki2Z1yzgKI5TjCSj6_JjwpKzcJNqgGFffX585zRtwshkdzrOTxwN0wmdr4YTk/w550-h640/Screenshot%202024-02-29%20at%2000.32.46.png" width="550" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><blockquote><div><i><b><br class="Apple-interchange-newline" />Storage type</b></i></div><div><i>The storage type used for the volume.</i></div><div><i><br /></i></div><div><i><b>EBS volumes</b> are block-level storage volumes that <u>persist independently from the lifetime of an EC2 instance</u>, so you can stop and restart your instance at a later time without losing your data. You can also detach an EBS volume from one instance and attach it to another instance. EBS volumes are billed separately from the instance’s usage cost.</i></div><div><i><br /></i></div><div><i><b>Instance store volumes</b> are physically attached to the host computer. These volumes provide temporary block storage that persists only during the lifetime of the instance. If you stop, hibernate, or terminate an instance, data on instance store volumes is lost. The instance type determines the size and number of the instance store volumes available and the type of hardware used for the instance store volumes. Instance store volumes are included as part of the instance's usage cost.</i></div></blockquote><div></div><div><br /></div><div><div></div></div><blockquote><div><div><i><b>Device name</b></i></div><div><i>The available device names for the volume.</i></div><div><i><br /></i></div><div><i>The device name that you assign is used by Amazon EC2. The block device driver for the instance assigns the actual volume name <u>when mounting the volume</u>. The volume name assigned by the block device driver might differ from the device name that you assign.</i></div><div><i><br /></i></div><div><i>The device names that you're allowed to assign depends on the virtualization type of the selected instance.</i></div></div><div></div></blockquote><div><br /></div><div><div></div><blockquote><div><i><b>Snapshot</b></i></div><div><i>The snapshot from which to create the volume. A snapshot is a point-in-time backup of an EBS volume.</i></div><div><i><br /></i></div><div><i>When you create a new volume from a snapshot, it's an exact copy of the original volume at the time the snapshot was taken.</i></div><div><i><br /></i></div><div><i>EBS volumes created from encrypted snapshots are automatically encrypted and you can’t change their encryption status. EBS volumes created from unencrypted snapshots can be optionally encrypted.</i></div></blockquote><div></div></div><div><br /></div><div><div></div><blockquote><div><i><b>Size (GiB)</b></i></div><div><i>The size of the volume, in GiB.</i></div><div><i><br /></i></div><div><i>If you are creating the volume from a snapshot, then the size of the volume can’t be smaller than the size of the snapshot.</i></div><div><i><br /></i></div><div><i>Supported volume sizes are as follows:</i></div><div><i>io1: 4 GiB to 16,384 GiB</i></div><div><i>io2: 4 GiB to 65,536 GiB</i></div><div><i>gp2 and gp3: 1 GiB to 16,384 GiB</i></div><div><i>st1 and sc1: 125 GiB to 16,384 GiB</i></div><div><i>Magnetic (standard): 1 GiB to 1024 GiB</i></div></blockquote><div></div></div></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><div class="separator" style="clear: both;"></div><blockquote><div class="separator" style="clear: both;"><i><b>Volume type</b></i></div><div class="separator" style="clear: both;"><i>The type of volume to attach. Volume types include:</i></div><div class="separator" style="clear: both;"><ul style="text-align: left;"><li><i>General Purpose SSD (gp2 and gp3) volumes offer cost-effective storage that is ideal for a broad range of workloads.</i></li><li><i>Provisioned IOPS SSD (io1 and io2) volumes provide low latency and are designed to meet the needs of I/O-intensive workloads. They are best for EBS-optimized instances.</i></li><li><i>Throughput Optimized HDD (st1) volumes provide low-cost magnetic storage that is a good fit for large, sequential workloads.</i></li><li><i>Cold HDD (sc1) volumes provide low-cost magnetic storage that offers lower throughput than st1. sc1 is a good fit for large, sequential cold-data workloads that require infrequent access to data.</i></li><li><i>Magnetic (standard) volumes are best suited for workloads where data is accessed infrequently.</i></li></ul></div></blockquote><div class="separator" style="clear: both;"></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPirj8LC2OYqEBJskY1ztz4xZTHcdf9yfu_UlPIh7f0rSypPRGk8wbhWvrEhXg_NTC-hx4EfT68NoEYzxiwVdPewzz3y0iI22pLQVU4gbiV7zUp1zg4OXh11zvb450Ta1g8lcSmWC7I-pSVFKZPKFozRHnWGXKmb8oED4omJRjE8zwAOrCgfZLG9KIQGs/s554/Screenshot%202024-02-29%20at%2000.42.13.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="554" data-original-width="536" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPirj8LC2OYqEBJskY1ztz4xZTHcdf9yfu_UlPIh7f0rSypPRGk8wbhWvrEhXg_NTC-hx4EfT68NoEYzxiwVdPewzz3y0iI22pLQVU4gbiV7zUp1zg4OXh11zvb450Ta1g8lcSmWC7I-pSVFKZPKFozRHnWGXKmb8oED4omJRjE8zwAOrCgfZLG9KIQGs/w620-h640/Screenshot%202024-02-29%20at%2000.42.13.png" width="620" /></a></div><div class="separator" style="clear: both;"></div><blockquote><div class="separator" style="clear: both;"><i><b>IOPS</b></i></div><div class="separator" style="clear: both;"><i>The requested number of I/O operations per second that the volume can support.</i></div><div class="separator" style="clear: both;"><i><br /></i></div><div class="separator" style="clear: both;"><i>It is applicable to Provisioned IOPS SSD (io1 and io2) and General Purpose SSD (gp2 and gp3) volumes only.</i></div><div class="separator" style="clear: both;"><i><br /></i></div><div class="separator" style="clear: both;"><i>Provisioned IOPS SSD (io1 and io2) io1 volumes support between 100 and 64,000 IOPS, and io2 volumes support between 100 and 256,000 IOPS depending on the volume size. For io1 volumes, you can provision up to 50 IOPS per GiB. For io2 volumes, you can provision up to 1000 IOPS per GiB.</i></div><div class="separator" style="clear: both;"><i><br /></i></div><div class="separator" style="clear: both;"><i>For General Purpose SSD (gp2) volumes, baseline performance scales linearly at 3 IOPS per GiB from a minimum of 100 IOPS (at 33.33 GiB and below) to a maximum of 16,000 IOPS (at 5,334 GiB and above). General Purpose SSD (gp3) volumes support a baseline of 3,000 IOPS. Additionally, you can provision up to 500 IOPS per GiB up to a maximum of 16,000 IOPS.</i></div><div class="separator" style="clear: both;"><i><br /></i></div><div class="separator" style="clear: both;"><i>Magnetic (standard) volumes deliver approximately 100 IOPS on average, with a burst capability of up to hundreds of IOPS.</i></div><div class="separator" style="clear: both;"><i><br /></i></div><div class="separator" style="clear: both;"><i>For Throughput Optimized HDD (st1) and Cold HDD (sc1) volumes, performance is measured in throughput (MiB/s).</i></div></blockquote><div class="separator" style="clear: both;"></div><div><br /></div><div><div></div><blockquote><div><i><b>Delete on termination</b></i></div><div><i>Indicates whether the volume should be automatically deleted when the instance is terminated.</i></div><div><i><br /></i></div><div><i>If you disable this feature, the volume will persist independently from the running life of an EC2 instance. When you terminate the instance, the volume will remain provisioned in your account. If you no longer need the volume after the instance has been terminated, you must delete it manually.</i></div><div><i><br /></i></div><div><i>You can also change the delete on termination behavior after the instance has been launched.</i></div></blockquote><div></div></div><div><br /></div><div class="separator" style="clear: both;"><div class="separator" style="clear: both;"></div><blockquote><div class="separator" style="clear: both;"><i><b>Encrypted</b></i></div><div class="separator" style="clear: both;"><i>The encryption status of the volume.</i></div><div class="separator" style="clear: both;"><i><br /></i></div><div class="separator" style="clear: both;"><i>Amazon EBS encryption is an encryption solution for your EBS volumes. Amazon EBS encryption uses AWS KMS keys to encrypt volumes.</i></div><div class="separator" style="clear: both;"><i><br /></i></div><div class="separator" style="clear: both;"><i>Considerations:</i></div><div class="separator" style="clear: both;"><ul style="text-align: left;"><li><i>If your account is enabled for encryption by default, you can't create unencrypted volumes.</i></li><li><i>If you selected an encrypted snapshot, the volume is automatically encrypted.</i></li><li><i>If your account is not enabled for encryption by default, and you did not select a snapshot or you selected an unencrypted snapshot, encryption is optional.</i></li><li><i>You can create an encrypted io2 volumes in any size and IOPS configuration. However, to create an encrypted volume that has a size greater than 16 TiB, or IOPS greater than 64,000 from an unencrypted snapshot, or a shared encrypted snapshot from an unencrypted snapshot, you must first create an encrypted snapshot in your account and then use that snapshot to create the volume.</i></li></ul></div></blockquote><div class="separator" style="clear: both;"></div><div class="separator" style="clear: both;"><br /></div></div><div class="separator" style="clear: both;"><div class="separator" style="clear: both;"></div><blockquote><div class="separator" style="clear: both;"><i><b>KMS key</b></i></div><div class="separator" style="clear: both;"><i>The KMS key that will be used to encrypt the volume.</i></div><div class="separator" style="clear: both;"><i><br /></i></div><div class="separator" style="clear: both;"><i>Amazon EBS encryption uses AWS KMS keys when creating encrypted volumes and snapshots. EBS encrypts your volume with a data key using the industry-standard AES-256 algorithm. Your data key is stored on disk with your encrypted data, but not before EBS encrypts it with your KMS key. Your data key never appears on disk in plaintext. The same data key is shared by snapshots of the volume and any subsequent volumes created from those snapshots.</i></div></blockquote><div class="separator" style="clear: both;"></div><div class="separator" style="clear: both;"><br /></div><div class="separator" style="clear: both;"><div class="separator" style="clear: both;"></div><blockquote><div class="separator" style="clear: both;"><i><b>Throughput</b></i></div><div class="separator" style="clear: both;"><i>Throughput that the volume can support specified for Streaming Optimized volumes</i></div></blockquote><div class="separator" style="clear: both;"></div><div class="separator" style="clear: both;"><br /></div></div></div></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">If we click on "Add new volume", <i>Volume 2 (Custom)</i> section appears:</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIt9-4Nuh_G2Ih518Q26mKX4n08IrnOLgxRtY901vj1gY6ICXzUXOFFiH7bPdQc_IfJ9YTeHfzBtJAP9C77vBs0cWF1hMvFvmrYSdHcJkmO0w6JWHYthkQ5bwrftZmnPQgK4FLuYdAK0tVEychSNjnaCP7MoBVSAIfnICERW5CjhxXujpEOz12Aj7N-qY/s1864/Screenshot%202024-02-29%20at%2000.33.24.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1864" data-original-width="1208" height="847" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIt9-4Nuh_G2Ih518Q26mKX4n08IrnOLgxRtY901vj1gY6ICXzUXOFFiH7bPdQc_IfJ9YTeHfzBtJAP9C77vBs0cWF1hMvFvmrYSdHcJkmO0w6JWHYthkQ5bwrftZmnPQgK4FLuYdAK0tVEychSNjnaCP7MoBVSAIfnICERW5CjhxXujpEOz12Aj7N-qY/w548-h847/Screenshot%202024-02-29%20at%2000.33.24.png" width="548" /></a></div><br /><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><h3 style="text-align: left;">Creating a volume snapshot</h3><div style="text-align: left;"><br /></div><div><b>Why do we want to create an EBS volume snapshot?</b></div><div><br /></div><div>If we terminate (intentionally or not) the EC2 instance, the root EBS volume (which might be the only one used by that EC2 instance) will be deleted:</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJO2Y4QkU_CfpnAz6L9GyNOCR-EJzMRmDS5lMfn0uee3vO0k4tbcbuNBTEhyphenhyphena1aGQ8y_Ks2gRJ0zvUDsnfPwYGNDmElIPe7NbPBXaCHMD4hvxv1tIAvRRP1rEiNmCSSLROqkHeW1zou3NmbgkAnITFxoHRYskQEGsJlxH742v3O_d02nKAJgYRaxcq4pc/s1250/Screenshot%202024-02-29%20at%2013.07.20.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="878" data-original-width="1250" height="450" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJO2Y4QkU_CfpnAz6L9GyNOCR-EJzMRmDS5lMfn0uee3vO0k4tbcbuNBTEhyphenhyphena1aGQ8y_Ks2gRJ0zvUDsnfPwYGNDmElIPe7NbPBXaCHMD4hvxv1tIAvRRP1rEiNmCSSLROqkHeW1zou3NmbgkAnITFxoHRYskQEGsJlxH742v3O_d02nKAJgYRaxcq4pc/w640-h450/Screenshot%202024-02-29%20at%2013.07.20.png" width="640" /></a></div><br /><div>If we take a snapshot of the root EBS volume, then we'll be able later to restore that EC2 instance.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4T59LD1IGxR4plJc60_V9qcf2Zqc1RBi3_cP3s3jiJi_oSGG0gK724ehs9WxJYrFom8ZN1NwBnu7kkxdJYB8BSDKqnCKml9KW1CTeP0_yvDKwXumETgtfP1_t3AKsASZ6hX63KdCbXkiJyruAwiqFOXJP-BdEiU2c-qleVEACFQuIyvrYxaLqWFJYdKw/s3044/Screenshot%202024-02-29%20at%2000.18.33%20copy.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="3044" height="336" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4T59LD1IGxR4plJc60_V9qcf2Zqc1RBi3_cP3s3jiJi_oSGG0gK724ehs9WxJYrFom8ZN1NwBnu7kkxdJYB8BSDKqnCKml9KW1CTeP0_yvDKwXumETgtfP1_t3AKsASZ6hX63KdCbXkiJyruAwiqFOXJP-BdEiU2c-qleVEACFQuIyvrYxaLqWFJYdKw/w640-h336/Screenshot%202024-02-29%20at%2000.18.33%20copy.png" width="640" /></a></div><br /><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiUQJDmwNCe8GRixOk_P87iH8zdrgXmFgVu6zMON-FWoZtqEZ_gcLJ3tNGl1o6jf1Cpowmu6ngwfvCVlODc5F56SGHazJJ0UMp44otELyWHcyyBJWvNC1Q42v7e2I77SFAIMMASW5y8pobJDrM2eQni-2b21ueATALwqN3f14jYjXZsJznBZ31028Fvw4/s1402/Screenshot%202024-02-29%20at%2001.04.30%20copy.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1402" data-original-width="1266" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiUQJDmwNCe8GRixOk_P87iH8zdrgXmFgVu6zMON-FWoZtqEZ_gcLJ3tNGl1o6jf1Cpowmu6ngwfvCVlODc5F56SGHazJJ0UMp44otELyWHcyyBJWvNC1Q42v7e2I77SFAIMMASW5y8pobJDrM2eQni-2b21ueATALwqN3f14jYjXZsJznBZ31028Fvw4/w578-h640/Screenshot%202024-02-29%20at%2001.04.30%20copy.png" width="578" /></a></div><br /><div><br /></div><div><br /></div><div>Create a point-in-time snapshot to back up the data on an Amazon EBS volume to Amazon S3.</div><div><br /></div><div><div></div><blockquote><div><i>You can back up the data on your Amazon EBS volumes to Amazon S3 by taking point-in-time snapshots. Snapshots are incremental backups, which means that only the blocks on the device that have changed since the last snapshot are backed up. Each snapshot that you create contains all of the information that is needed to fully restore an EBS volume.</i></div><div><i><br /></i></div><div><i>When you create a snapshot, only data that has already been written to the volume is backed up. This might exclude data that has been cached by any applications or the operating system. To ensure a consistent and complete snapshot, we recommend that you pause write operations to the volume or that you unmount the volume from the instance before creating the snapshot.</i></div><div><i><br /></i></div><div><i>Snapshots that are taken from encrypted volumes are automatically encrypted. Volumes that are created from encrypted snapshots are also automatically encrypted.</i></div></blockquote></div><div><a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-creating-snapshot.html">Create Amazon EBS snapshots - Amazon Elastic Compute Cloud</a></div><div><br /></div><div>---</div><h2 style="text-align: left;">References:</h2><div><br /></div><div><a href="http://aws.amazon.com" rel="nofollow" target="_blank">aws.amazon.com</a></div>Bojan Komazechttp://www.blogger.com/profile/05437236807206825832noreply@blogger.com0tag:blogger.com,1999:blog-4912226416400969049.post-25276845238601915892024-02-27T12:32:00.003+00:002024-03-21T16:41:16.625+00:00Introduction to MySQL DB<p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKaw5H7ttNS4bfOmi8NJw1vBapaTIq_6XtnEet74-teys1TBdzuGywkdR54eL_c17r1nlJkbdVfvKud2a0yH_IBEFYIaI-APzfNQiOzg5lgiA943sMkQlabd1Q1m235jNgS0VynkLM6xycX3PZS44pRhNsNEzh4dWyVpgYbGWTdlZWp8nPmIFXFydyhtA/s711/Screenshot%20from%202022-02-08%2011-15-58.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="293" data-original-width="711" height="264" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKaw5H7ttNS4bfOmi8NJw1vBapaTIq_6XtnEet74-teys1TBdzuGywkdR54eL_c17r1nlJkbdVfvKud2a0yH_IBEFYIaI-APzfNQiOzg5lgiA943sMkQlabd1Q1m235jNgS0VynkLM6xycX3PZS44pRhNsNEzh4dWyVpgYbGWTdlZWp8nPmIFXFydyhtA/w640-h264/Screenshot%20from%202022-02-08%2011-15-58.png" width="640" /></a></div><br /><p></p><p><br /></p><div style="text-align: left;">To connect to MySQL instance:</div><div style="text-align: left;"><br /><span style="color: #38761d; font-family: courier;">% <b>/opt/homebrew/opt/mysql-client/bin/mysql \ <br />-u USER \<br />-pPASS \<br />-h DB_HOST \<br />DB_NAME</b></span></div><div style="text-align: left;"><span style="color: #38761d; font-family: courier;"> <br />mysql: [Warning] Using a password on the command line interface can be insecure.<br />Reading table information for completion of table and column names<br />You can turn off this feature to get a quicker startup with -A<br />Welcome to the MySQL monitor. Commands end with ; or \g.<br />Your MySQL connection id is 1198<br />Server version: 8.0.35 Source distribution<br />Copyright (c) 2000, 2023, Oracle and/or its affiliates.<br />Oracle is a registered trademark of Oracle Corporation and/or its<br />affiliates. Other names may be trademarks of their respective<br />owners.<br />Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.<br />mysql> </span><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;">To show all databases in this MySQL server:</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><div><span style="color: #38761d; font-family: courier;">mysql> <b>show databases;</b></span></div><div><span style="color: #38761d; font-family: courier;">+--------------------+</span></div><div><span style="color: #38761d; font-family: courier;">| Database |</span></div><div><span style="color: #38761d; font-family: courier;">+--------------------+</span></div><div><span style="color: #38761d; font-family: courier;">| my_wordpress |</span></div><div><span style="color: #38761d; font-family: courier;">| information_schema |</span></div><div><span style="color: #38761d; font-family: courier;">| mysql |</span></div><div><span style="color: #38761d; font-family: courier;">| performance_schema |</span></div><div><span style="color: #38761d; font-family: courier;">| sys |</span></div><div><span style="color: #38761d; font-family: courier;">+--------------------+</span></div><div><span style="color: #38761d; font-family: courier;">5 rows in set (0.09 sec)</span></div></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;">To change the current database:</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><div><span style="color: #38761d; font-family: courier;">mysql> <b>use my_wordpress;</b></span></div><div><span style="color: #38761d; font-family: courier;">Database changed</span></div><div><br /></div><div><br /></div><div>To list all columns in some table:</div><div><br /></div><div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">mysql> <b>describe my_table;</b></span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">+------------+---------------------+------+-----+---------------------+----------------+</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">| Field | Type | Null | Key | Default | Extra |</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">+------------+---------------------+------+-----+---------------------+----------------+</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">| id | bigint(20) unsigned | NO | PRI | NULL | auto_increment </span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">| post_id | bigint(20) unsigned | NO | MUL | 0 | </span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">| post_type | varchar(20) | NO | | post | </span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">| created_at | datetime | NO | | 0000-00-00 00:00:00 | </span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">| author_id | bigint(20) unsigned | NO | MUL | 0 | </span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">| new | tinyint(1) | YES | | 0 | </span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">+------------+---------------------+------+-----+---------------------+----------------+</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">6 rows in set (0.003 sec)</span></div></div><div><br /></div><div>Another way to find out the names of all columns:</div><div><br /></div><div><span style="color: #38761d; font-family: courier;">mysql> <b>select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='wp_postmeta';</b></span></div><div><span style="color: #38761d; font-family: courier;">+-------------+</span></div><div><span style="color: #38761d; font-family: courier;">| COLUMN_NAME |</span></div><div><span style="color: #38761d; font-family: courier;">+-------------+</span></div><div><span style="color: #38761d; font-family: courier;">| meta_id |</span></div><div><span style="color: #38761d; font-family: courier;">| post_id |</span></div><div><span style="color: #38761d; font-family: courier;">| meta_key |</span></div><div><span style="color: #38761d; font-family: courier;">| meta_value |</span></div><div><span style="color: #38761d; font-family: courier;">+-------------+</span></div><div><span style="color: #38761d; font-family: courier;">4 rows in set (0.08 sec)</span></div><div><br /></div><div>Note that columns returned might not be listed in the order that they are in the table. On some other MySQL instance, the same query returned the columns listed in different order:</div><div><br /></div><div><div><span style="color: #38761d; font-family: courier;">MySQL [my_db]> select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='wp_postmeta';</span></div><div><span style="color: #38761d; font-family: courier;">+-------------+</span></div><div><span style="color: #38761d; font-family: courier;">| COLUMN_NAME |</span></div><div><span style="color: #38761d; font-family: courier;">+-------------+</span></div><div><span style="color: #38761d; font-family: courier;">| meta_id |</span></div><div><span style="color: #38761d; font-family: courier;">| meta_key |</span></div><div><span style="color: #38761d; font-family: courier;">| meta_value |</span></div><div><span style="color: #38761d; font-family: courier;">| post_id |</span></div><div><span style="color: #38761d; font-family: courier;">+-------------+</span></div><div><span style="color: #38761d; font-family: courier;">4 rows in set (0.002 sec)</span></div></div><div><br /></div><div>To make sure you're using the right values for the right column, the best is to see how e.g. 1st row looks like:</div><div><div><br /></div><div><span style="color: #38761d; font-family: courier;">MySQL [my_db]> select * from wp_postmeta where meta_key like '%custom_string_%' LIMIT 1;</span></div><div><span style="color: #38761d; font-family: courier;">+---------+---------+---------------------------+------------+</span></div><div><span style="color: #38761d; font-family: courier;">| meta_id | post_id | meta_key | meta_value |</span></div><div><span style="color: #38761d; font-family: courier;">+---------+---------+---------------------------+------------+</span></div><div><span style="color: #38761d; font-family: courier;">| 225532 | 2289 | _custom_string_enabled | 0 |</span></div><div><span style="color: #38761d; font-family: courier;">+---------+---------+---------------------------+------------+</span></div><div><span style="color: #38761d; font-family: courier;">1 row in set (0.034 sec)</span></div></div><div><br /></div><div>To list all records (rows) that contain field/attribute value that ends with some string e.g. "origin" (% means <i>any</i> character):</div><div> </div><div><span style="color: #38761d; font-family: courier;">mysql> <b>select * from wp_postmeta where meta_key like '%origin';</b></span></div><div><span style="color: #38761d; font-family: courier;"><br /></span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">+---------+---------+-----------------------------+---------------------+</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">| meta_id | post_id | meta_key | meta_value |</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">+---------+---------+-----------------------------+---------------------+</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">| 1085763 | 8845 | origin | |</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">| 1085764 | 8845 | _origin | field_5d99d579566f1 |</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">...</span></div><div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">| 5836494 | 88486 | origin | 1 |</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">| 5836495 | 88486 | _origin | field_5d99d579566f1 |</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">+---------+---------+-----------------------------+---------------------+</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">2980 rows in set (2.08 sec)</span></div></div><div><br /></div><div>Sometimes we're interested only in the number of returned rows:</div><div><br /></div><div><div><span style="color: #38761d; font-family: courier;">mysql> select count(*) from wp_postmeta where meta_key like '%origin';</span></div><div><span style="color: #38761d; font-family: courier;">+----------+</span></div><div><span style="color: #38761d; font-family: courier;">| count(*) |</span></div><div><span style="color: #38761d; font-family: courier;">+----------+</span></div><div><span style="color: #38761d; font-family: courier;">| 6444 |</span></div><div><span style="color: #38761d; font-family: courier;">+----------+</span></div><div><span style="color: #38761d; font-family: courier;">1 row in set (1.364 sec)</span></div></div><div><br /></div><div><br /></div></div><div style="text-align: left;">To delete rows above:</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><div><span style="color: #38761d; font-family: courier;">mysql> <b>delete from wp_postmeta where meta_key like '%origin';</b></span></div><div><span style="color: #38761d; font-family: courier;"><br /></span></div><div><span style="color: #38761d; font-family: courier;">Query OK, 2980 rows affected (2.81 sec)</span></div><div><br /></div><div><br /></div><div>After deleting rows from a table, it's recommended to optimize the affected table:</div><div><br /></div><div><div><span style="color: #38761d; font-family: courier;">mysql> <b>optimize table wp_postmeta;</b></span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">+-----------------------------+----------+----------+-------------------------------------------------------------------+</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">| Table | Op | Msg_type | Msg_text |</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">+-----------------------------+----------+----------+-------------------------------------------------------------------+</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">| my_wordpress.wp_postmeta | optimize | note | Table does not support optimize, doing recreate + analyze instead |</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">| my_wordpress.wp_postmeta | optimize | status | OK |</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">+-----------------------------+----------+----------+-------------------------------------------------------------------+</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">2 rows in set (34.30 sec)</span></div></div><div><br /></div><div><br /></div><div>To exit from the interactive terminal:</div><div><br /></div><div><div><span style="color: #38761d; font-family: courier;">mysql> exit</span></div><div><span style="color: #38761d; font-family: courier;">Bye</span></div></div><div><br /></div></div><div style="text-align: left;"><br />To find out which tables contain some string:</div><div style="text-align: left;"><span style="color: #38761d; font-family: courier;"><br /></span></div><div style="text-align: left;"><span style="color: #38761d; font-family: courier;">% <b>/opt/homebrew/opt/mysql-client/bin/mysqldump \<br />-u <span>USER</span> \<br />-pPASS \<br />-h DB_HOST \<br />--no-create-info \<br />--extended-insert=FALSE \<br />DB_NAME | grep STRING > dump_STRING.txt</b></span></div><div style="text-align: left;"><span style="font-family: courier;"><span style="color: #38761d;"><br />mysqldump: [Warning] Using a password on the command line interface can be insecure.<br />Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events. <br />Warning: A dump from a server that has GTIDs enabled will by default include the GTIDs of all transactions, even those that were executed during its extraction and might not be represented in the dumped data. This might result in an inconsistent data dump. <br />In order to ensure a consistent backup of the database, pass --single-transaction or --lock-all-tables or --source-data.</span> </span></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;">---</div>Bojan Komazechttp://www.blogger.com/profile/05437236807206825832noreply@blogger.com0tag:blogger.com,1999:blog-4912226416400969049.post-45008891339442394842024-02-26T12:38:00.010+00:002024-02-27T11:50:42.104+00:00Introduction to Amazon Elastic Container Service (ECS)<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinDfWINZZbDMNTo-9rjwJTrEjpKtKdjmC1dpw4lxdePH7M8OjYOJi4850_izZ9rJ0hCGhbACrT0uL-lLTc_rJkl9-IJKf1Xfc2vogo96wRUuun0gWpbHWZ3ebqL722oICivd3ri2ir0z9ckThK15hIyX7o1gONzNACPdNi1k1u-M_wCtgTJ9WvLFDbkik/s626/aws-ecs.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="626" data-original-width="626" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinDfWINZZbDMNTo-9rjwJTrEjpKtKdjmC1dpw4lxdePH7M8OjYOJi4850_izZ9rJ0hCGhbACrT0uL-lLTc_rJkl9-IJKf1Xfc2vogo96wRUuun0gWpbHWZ3ebqL722oICivd3ri2ir0z9ckThK15hIyX7o1gONzNACPdNi1k1u-M_wCtgTJ9WvLFDbkik/w640-h640/aws-ecs.png" width="640" /></a></div><br /><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><ul style="text-align: left;"><li>container management service</li><li>highly scalable and fast</li><li>makes it easy to run, stop and manage containers on a cluster</li><li>integrated with the AWS Fargate serverless compute engine which automatically provisions and manages Amazon EC2 instances</li></ul><div><br /></div><div>AWS ECS is organised in the following groups:</div><div><ul style="text-align: left;"><li>Clusters</li><li>Namespaces</li><li>Task definitions</li></ul><div><br /></div></div><h3 style="text-align: left;">Clusters</h3><div><br /></div><div><div></div><blockquote><div><i>A cluster is a logical grouping of services or standalone tasks.</i></div><div><i><br /></i></div><div><i>The cluster list view provides a snapshot of the status of each of your clusters. This view displays the number of active <b>services</b> and the deployment status of all <b>tasks</b> within the cluster.</i></div></blockquote><div></div></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Namespaces</h3><div><br /></div><div><div></div><blockquote><div><i>A namespace groups together Amazon ECS services to configure <u>common connectivity</u>. Amazon ECS can manage namespaces in AWS Cloud Map on your behalf.</i></div><div><i><br /></i></div><div><i>The namespace list view provides a snapshot of each of your namespaces. This view displays the namespace ID in AWS Cloud Map, the short name of the namespace, and the date that it was created.</i></div><div><i><br /></i></div><div><i><u>Use namespaces to correlate Amazon ECS services that connect to each other</u>. Each service can be in a single namespace. A service can be in the <b>default namespace </b>configured in the cluster, or specify a different namespace. The namespace must be in the same AWS Region as the Amazon ECS service and cluster. The type of namespace in AWS Cloud Map doesn't affect Service Connect.</i></div><div><i><br /></i></div><div><i>Amazon ECS can create a namespace as you create a cluster, or you can assign a default namespace to an existing cluster at any time. <u>Services that you create in these clusters can connect to the other services in the namespace without additional configuration</u>. Additional configuration of a domain name and port is required when you want to make a service available for your other services to connect to.</i></div></blockquote><div></div></div><div><br /></div><h3 style="text-align: left;">Task definitions</h3><div><br /></div><div><div></div><blockquote><div><i>The Task definitions view lists each task definition family you've created.</i></div><div><i>You can perform the following actions:</i></div><div><i>- Deploy the task definition as a <b>service</b> or a <b>task</b>.</i></div><div><i>- Create a new revision</i></div></blockquote><div></div></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Creating a new Task definition</h3><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPQkDcOyyhat725f13kjHp1WBvDvm4CyaOIYlLlYpj17p3iFJaqgWCtCaB7DoubLlGCSpYg8G8d009kAnuMSvSkLngDTGlJ1T9gnDg9xegDr5ufu2MN4V9eFlOUKT6GiQiPrp9mG9YxfibdUT5dLNDfNB6O8taQY7DgMqmAWDJVHYq_SORmcqcxuSXeU4/s1878/Screenshot%202024-02-26%20at%2014.48.32.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1878" data-original-width="1638" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPQkDcOyyhat725f13kjHp1WBvDvm4CyaOIYlLlYpj17p3iFJaqgWCtCaB7DoubLlGCSpYg8G8d009kAnuMSvSkLngDTGlJ1T9gnDg9xegDr5ufu2MN4V9eFlOUKT6GiQiPrp9mG9YxfibdUT5dLNDfNB6O8taQY7DgMqmAWDJVHYq_SORmcqcxuSXeU4/w558-h640/Screenshot%202024-02-26%20at%2014.48.32.png" width="558" /></a></div><br /><div><b><br /></b></div><div><b>Family (Info):</b></div><div><br /></div><div><blockquote><i>A task definition family is used to group multiple versions, also referred to as revisions, of the same task definition. The first task definition that is registered into a particular family is given a revision of 1, and any task definitions registered after that are given a sequential revision number.</i></blockquote></div><div><br /></div><div><br /></div><div><div><b>Launch type </b><b>(Info):</b></div><div><br /></div><div></div><blockquote><div><i>The Launch type specified for a task definition determines where Amazon ECS launches the task or service. The task definition parameters are validated against the allowed values for the launch type.</i></div><div><i><br /></i></div><div><i>By default, the AWS Fargate option is selected. You can also select Amazon EC2 instances.</i></div><div><i><br /></i></div><div><i>Amazon ECS returns an error if the task definition is not valid for use on the infrastructure type specified when creating a service or running a task.</i></div><div><i><br /></i></div><div><i>This field corresponds to the requiresCompatibilities task definition parameter.</i></div></blockquote></div><div><div><b><br /></b></div><div><b>Operating system/Architecture </b><b>(Info):</b></div><div><br /></div><div><blockquote><i>The Operating system/Architecture configuration for the task definition defines the operating system and the CPU architecture that your tasks run on. When you have multiple tasks that are part of a service, the tasks must all have the same configuration for this option. To use the 64-bit ARM CPU architecture, select Linux/ARM64.</i></blockquote></div></div><div><br /></div><div><br /></div><div><div><b>Network mode </b><b>(Info):</b></div><div><br /></div><div></div><blockquote><div><i>The network mode specifies what type of networking the containers in the task use. The following are available:</i></div><div><ul style="text-align: left;"><li><i>The <b>awsvpc</b> network mode, which provides the task with an elastic network interface (ENI). When creating a service or running a task with this network mode you must specify a network configuration consisting of one or more subnets, security groups, and whether to assign the task a public IP address.</i></li><ul><li><i>The awsvpc network mode is required for tasks hosted on Fargate.</i></li></ul><li><i>The bridge network mode uses Docker's built-in virtual network, which runs inside each Amazon EC2 instance hosting the task. The bridge is an internal network namespace that allows each container connected to the same bridge network to communicate with each other. It provides an isolation boundary from containers that aren't connected to the same bridge network. You use static or dynamic port mappings to map ports in the container with ports on the Amazon EC2 host.</i></li><ul><li><i>If you choose bridge for the network mode, under Port mappings, for Host port, specify the port number on the container instance to reserve for your container.</i></li></ul><li><i>The default mode uses Docker's built-in virtual network mode on Windows, which runs inside each Amazon EC2 instance that hosts the task. This is the default network mode on Windows if a network mode isn't specified in the task definition.</i></li><li><i>The host network mode has the task bypass Docker's built-in virtual network and maps container ports directly to the ENI of the Amazon EC2 instance hosting the task. As a result, you can't run multiple instantiations of the same task on a single Amazon EC2 instance when port mappings are used.</i></li><li><i>The none network mode provides a task with no external network connectivity.</i></li></ul></div><div><i>For tasks hosted on Amazon EC2 instances, the available network modes are awsvpc, bridge, host, and none. If no network mode is specified, the bridge network mode is used by default.</i></div></blockquote><div></div><div><br /></div></div><div><br /></div><div><div><b>Task size</b></div><div><br /></div><div></div><blockquote><div><i>For task size, specify the amount of CPU and memory to reserve for the task. The CPU value is specified as a number of vCPUs. The memory value is specified in GB.</i></div><div><i><br /></i></div><div><i>For Amazon ECS tasks hosted on AWS Fargate, the task CPU and memory values are required and there are specific values for both CPU and memory that are supported.</i></div><div><i><br /></i></div><div><ul style="text-align: left;"><li><i>For .25 vCPU CPU, the valid memory values are .5 GB, 1 GB, or 2 GB.</i></li><li><i>For .5 vCPU, the valid memory values are 1 GB, 2 GB, 3 GB, or 4 GB.</i></li><li><i>For 1 vCPU, the valid memory values are 2 GB, 3 GB, 4 GB, 5 GB, 6 GB, 7 GB, or 8 GB.</i></li><li><i>For 2 vCPU, the valid memory values are between 4 GB and 16 GB in 1 GB increments.</i></li><li><i>For 4 vCPU, the valid memory values are between 8 GB and 30 GB in 1 GB increments.</i></li><li><i>For 8 vCPU, the valid memory values are between 16 GB and 60 GB in 4 GB increments. This option requires Linux platform 1.4.0 or later.</i></li><li><i>For 16 vCPU, the valid memory values are between 32GB and 120 GB in 8 GB increments.</i></li><li><i>This option requires Linux platform 1.4.0 or later.</i></li></ul></div><div><i><br /></i></div><div><i>For Amazon ECS tasks hosted on Amazon EC2 instances, the task size fields are optional. If your cluster doesn't have any registered container instances with the requested CPU units available, the task fails. Supported values are between 128 CPU units (0.125 vCPUs) and 10240 CPU units (10 vCPUs). To specify the memory value in GB, enter GB after the value. For example, to set the Memory value to 3GB, enter 3GB.</i></div></blockquote><div></div></div><div><br /></div><div><div><b>Task role</b></div><div><br /></div><div></div><blockquote><div><i>The task role is an IAM role that is used by containers in a task to make AWS API calls on your behalf. Applications must sign their AWS API requests with AWS credentials, and a task role provides a strategy for managing credentials for your applications to use, similar to the way that Amazon EC2 instance profiles provide credentials to Amazon EC2 instances.</i></div><div><i><br /></i></div><div><i>A task IAM role is required when using the AWS Distro for OpenTelemetry integration to collect trace data or metrics.</i></div></blockquote><div></div></div><div><br /></div><div><br /></div><div><div><b>Task execution role</b></div><div><br /></div><div></div><blockquote><div><i>The task execution role is an IAM role that grants the Amazon ECS container and Fargate agents permission to make AWS API calls on your behalf.</i></div><div><i><br /></i></div><div><i>To use the task execution role, you must run container agent 1.16.0 or later.</i></div><div><i><br /></i></div><div><i>The following are common use cases for a task execution AWS Identity and Access Management (IAM) role:</i></div><div><ul style="text-align: left;"><li><i>Your task is hosted on AWS Fargate or on an external instance and it does the following:</i></li><ul><li><i>Pulls a container image from an Amazon ECR private repository.</i></li><li><i>Sends container logs to Amazon CloudWatch Logs by using the awslogs log driver.</i></li></ul><li><i>Your tasks are hosted on either AWS Fargate or Amazon EC2 instances and they do the following:</i></li><ul><li><i>Use private registry authentication.</i></li><li><i>Reference sensitive data in the task definition by using AWS Secrets Manager secrets or AWS Systems Manager Parameter Store parameters.</i></li></ul></ul></div></blockquote></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8RXLg34rzp7EadvuM31IZYqlCa3KOekW-sG7wK-uWB22mpulktAWtaeQ0sAsjyNG7K_GYZEp9T38toNluBWwYZZh8sBfDh38uyLRdHlao7F4KRW9tYggNS43Z3cPOsZRFNN4FWhHLD9VCq4aovHfLvc-FkMSMuGtVlHUSCJARt2DyMElJfmn4SlWHlpQ/s1862/Screenshot%202024-02-26%20at%2014.58.02.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1862" data-original-width="1662" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8RXLg34rzp7EadvuM31IZYqlCa3KOekW-sG7wK-uWB22mpulktAWtaeQ0sAsjyNG7K_GYZEp9T38toNluBWwYZZh8sBfDh38uyLRdHlao7F4KRW9tYggNS43Z3cPOsZRFNN4FWhHLD9VCq4aovHfLvc-FkMSMuGtVlHUSCJARt2DyMElJfmn4SlWHlpQ/w572-h640/Screenshot%202024-02-26%20at%2014.58.02.png" width="572" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div><br /></div><div><b>Container</b></div><div><br /></div><div></div><blockquote><div><i>A container definition provides details and resource requirements for a container that is passed to the Docker daemon. A task definition may contain one or more container definitions.</i></div><div><i><br /></i></div><div><i>For applications that require multiple containers, you should group the containers in the same task definition under the following conditions.</i></div><div><ul style="text-align: left;"><li><i>If the containers share a common lifecycle. For example, if they must launch or be terminated together.</i></li><li><i>If the containers must share the same resources or data volumes.</i></li><li><i>If the containers must run on the same underlying host. For example, if one container references the other on a localhost port.</i></li></ul></div></blockquote><div style="text-align: left;">Image URI e.g. </div><div><br /></div><div><br /></div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRavRYH9D87HlGTsHeY0_WXEqa7ZkQsrbaOW6T8WzsWrP1S9rlRvFCqgsvSAI_89nDZ_sOi0oEUFNhZaG5ALCcm0XChbUS1IHlOqdMTSB20Ek-byZmLb6RAbGoXiqOu2kquKAl-zEVistPue7UFUlI2clL0TZcjfw13d9-Nardcf_M_L3oMHpgfN3_6cE/s1678/Screenshot%202024-02-26%20at%2014.58.35.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="998" data-original-width="1678" height="380" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRavRYH9D87HlGTsHeY0_WXEqa7ZkQsrbaOW6T8WzsWrP1S9rlRvFCqgsvSAI_89nDZ_sOi0oEUFNhZaG5ALCcm0XChbUS1IHlOqdMTSB20Ek-byZmLb6RAbGoXiqOu2kquKAl-zEVistPue7UFUlI2clL0TZcjfw13d9-Nardcf_M_L3oMHpgfN3_6cE/w640-h380/Screenshot%202024-02-26%20at%2014.58.35.png" width="640" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJovCiKjkJSVZDXfE28PkfZGBmpDVkI9DX6rctE6Na9odtr49bfMmRd1Vg6oTiMBIEhY0Lx9j45E6l9fCy-8RagVLl_bVbOYDwvU9StubEup9rxtQInKjJASNMRMjl0kRZrIT8ZLr7NtjsSoy5-TdM8lqkhhyj9nJ-Y2G3dhhD1JuLUegShNxiszYm7zE/s1662/Screenshot%202024-02-26%20at%2014.59.02.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1660" data-original-width="1662" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJovCiKjkJSVZDXfE28PkfZGBmpDVkI9DX6rctE6Na9odtr49bfMmRd1Vg6oTiMBIEhY0Lx9j45E6l9fCy-8RagVLl_bVbOYDwvU9StubEup9rxtQInKjJASNMRMjl0kRZrIT8ZLr7NtjsSoy5-TdM8lqkhhyj9nJ-Y2G3dhhD1JuLUegShNxiszYm7zE/w640-h640/Screenshot%202024-02-26%20at%2014.59.02.png" width="640" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxn_J-nHeKC4Kn4Ou_StKcK_w3iCsj7oBA1RkgUzxN2YcQiZHtbGRbZV3zwHsWP8oNiOzqZS2otoJrqsVpOghfyZxiY39cmdgVgf-HQpSUFOWey5MnczA96c0c3qa7Ofzd7jo-Wu5y7NL6ts_hfoEmNb4-lYHNslE54ME7B72gy4RZODs0LV-pMJFdgg4/s1668/Screenshot%202024-02-26%20at%2014.59.13.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1160" data-original-width="1668" height="446" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxn_J-nHeKC4Kn4Ou_StKcK_w3iCsj7oBA1RkgUzxN2YcQiZHtbGRbZV3zwHsWP8oNiOzqZS2otoJrqsVpOghfyZxiY39cmdgVgf-HQpSUFOWey5MnczA96c0c3qa7Ofzd7jo-Wu5y7NL6ts_hfoEmNb4-lYHNslE54ME7B72gy4RZODs0LV-pMJFdgg4/w640-h446/Screenshot%202024-02-26%20at%2014.59.13.png" width="640" /></a></div><div style="text-align: left;"><br /></div><div style="text-align: left;">Command can be used for executing an entrypoint, for example: /usr/local/my-app/entrypoint.sh</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibc6_3wJbUrIS511kwJGCaAM5KtC9AGsB-QVDH6SfqeWwy0nSEjyIqa7Gv6PQvcNCtYc1nxsQDy8k1Y2WE8PPVWSy6ssq_omAnkod5PdSBq7q4FK1gaPQOrOkqqxBMglOFuOv761wgbUE0rqdXFNttpRb9h60a3QQ2v2iBePaj1UMVilieeLXZqce1cD8/s1878/Screenshot%202024-02-26%20at%2014.59.36.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1878" data-original-width="1638" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibc6_3wJbUrIS511kwJGCaAM5KtC9AGsB-QVDH6SfqeWwy0nSEjyIqa7Gv6PQvcNCtYc1nxsQDy8k1Y2WE8PPVWSy6ssq_omAnkod5PdSBq7q4FK1gaPQOrOkqqxBMglOFuOv761wgbUE0rqdXFNttpRb9h60a3QQ2v2iBePaj1UMVilieeLXZqce1cD8/w558-h640/Screenshot%202024-02-26%20at%2014.59.36.png" width="558" /></a></div><br /><div><br /></div><div><br /></div><div><div>Deregister</div><div><br /></div><div>When a task definition revision is deregistered, the revision transitions to an INACTIVE state. Existing tasks and services that use the inactive task definition revision continue to run without disruption.</div><div>Inactive revisions can't be used to run new tasks or create new services, and you can't update an existing service to use an inactive revision.</div><div>Are you sure you want to deregister the following task definition:revision?</div></div><div><br /></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Creating a cluster</h3><div><br /></div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgARGx2T_1gMw_z8g49epa2QZsGXEoyK_b7ZWRo7mL1xvGTovwAsGop_FTVna4jT4ryZPZdtCM0Me8Zke8bj8_TUkkGqfV1bY_ITCRiF4XljEd8xEdXsN9SQOVOGu7M6dGwBH16ATAImn2eF6cEqs1N_XkM5HiAuEXpNnhuVRvryuVOn0jT4BZuhowQeBs/s1860/Screenshot%202024-02-26%20at%2013.00.48.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1860" data-original-width="1338" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgARGx2T_1gMw_z8g49epa2QZsGXEoyK_b7ZWRo7mL1xvGTovwAsGop_FTVna4jT4ryZPZdtCM0Me8Zke8bj8_TUkkGqfV1bY_ITCRiF4XljEd8xEdXsN9SQOVOGu7M6dGwBH16ATAImn2eF6cEqs1N_XkM5HiAuEXpNnhuVRvryuVOn0jT4BZuhowQeBs/w460-h640/Screenshot%202024-02-26%20at%2013.00.48.png" width="460" /></a></div><br /><div><br /></div><div><b>Infrastructure (Info):</b></div><div><br /></div><div><div></div><blockquote><div><i>From the Infrastructure workflow, you can configure the infrastructure where your containers run.</i></div><div><i><br /></i></div><div><i>The valid options are:</i></div><div><i><br /></i></div><div><ul style="text-align: left;"><li><i>AWS Fargate</i></li><ul><li><i>Fargate is a serverless, pay-as-you-go compute engine. With Fargate you don't need to manage servers, handle capacity planning, or isolate container workloads for security.</i></li></ul><li><i>Amazon EC2 instances</i></li><ul><li><i>You choose the instance type, the number of instances, and manage the capacity.</i></li></ul><li><i>External instances using ECS Anywhere</i></li><ul><li><i>Amazon ECS Anywhere provides support for registering an external instance such as an on-premises server or virtual machine (VM), to your Amazon ECS cluster.</i></li></ul></ul></div><div><i><br /></i></div><div><i>By default, when you create a cluster, the cluster is configured for AWS Fargate.</i></div><div><i><br /></i></div><div><i>To use EC2 instances, clear AWS Fargate and select Amazon EC2 instances. When you add EC2 instances, you can use an existing group, or create a new Auto Scaling group to act as the capacity provider.</i></div><div><i><br /></i></div><div><i>To use your on-premises servers, clear AWS Fargate and select External instances using ECS Anywhere. When the cluster creation is complete, go to Cluster details page to generate the registration command for your external instances, and then run the command on all your external instances.</i></div></blockquote><div></div></div><div><br /></div><div><b>Monitoring (Info):</b></div><div><br /></div><div><div></div><blockquote><div><i>From the Monitoring workflow, you can turn on CloudWatch Container Insights.</i></div><div><i><br /></i></div><div><i>CloudWatch Container Insights comes at an additional cost and is a fully managed service. It automatically collects, aggregates, and summarizes Amazon ECS metrics and logs. It provides the following information for clusters and services with tasks in the RUNNING state:</i></div><div><ul style="text-align: left;"><li><i>CPU and memory utilization</i></li><li><i>The number of task and services</i></li><li><i>Read and write storage</i></li><li><i>Network transmit and receive rates (for tasks that use the bridge or awsvpc network mode)</i></li><li><i>Container instance counts for clusters, services, and tasks</i></li></ul></div><div><i>You can view the metrics in the CloudWatch Container Insights dashboard and perform the following operations:</i></div><div><ul style="text-align: left;"><li><i>Query and analyze container application logs by integrating with CloudWatch Container Insights logs.</i></li><li><i>Create CloudWatch alarms so that you can track issues.</i></li></ul></div></blockquote><div style="text-align: left;"><br /></div></div><div>Inside the cluster, we create a service which runs a task defined via selected task definition (in Deployment configuration >> Task definition >> Family):</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc_iKlCXV0DtVM5tEEuwZ77i_0MS7IoRHhXNMk1y8uLQToHau_whw3T25Q5yRTlHasNoZ5unnU41UBi4X9nF-7UczNchq_FeCHzbyRlXbioKTS3bleZQG2pLjD578WyrlQJ813WunGTXiZjI7zBcoAJ3OsfI2bRMisPEwAirCq5m6mIt0U8R5I8_DD7pQ/s1780/Screenshot%202024-02-26%20at%2014.29.27.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1080" data-original-width="1780" height="388" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc_iKlCXV0DtVM5tEEuwZ77i_0MS7IoRHhXNMk1y8uLQToHau_whw3T25Q5yRTlHasNoZ5unnU41UBi4X9nF-7UczNchq_FeCHzbyRlXbioKTS3bleZQG2pLjD578WyrlQJ813WunGTXiZjI7zBcoAJ3OsfI2bRMisPEwAirCq5m6mIt0U8R5I8_DD7pQ/w640-h388/Screenshot%202024-02-26%20at%2014.29.27.png" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifo9v10tLj-xbC6hIscADd-COpgb1IxlnNw_nuw_WsPh0Yu9YAf3acfiP8-Q46FwKnoyoaXTSjPRuk2jQMwS1W0J1_LLIwbcC3rRKY9DMKYvcGAiLc8433NWxTH9EkHcKmGVofROdwxgs8XU-W84I2TSojI8ZOOWVIF7diagoMF065AYr4Aehympsz8-I/s1846/Screenshot%202024-02-26%20at%2014.35.16.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1846" data-original-width="1658" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifo9v10tLj-xbC6hIscADd-COpgb1IxlnNw_nuw_WsPh0Yu9YAf3acfiP8-Q46FwKnoyoaXTSjPRuk2jQMwS1W0J1_LLIwbcC3rRKY9DMKYvcGAiLc8433NWxTH9EkHcKmGVofROdwxgs8XU-W84I2TSojI8ZOOWVIF7diagoMF065AYr4Aehympsz8-I/w574-h640/Screenshot%202024-02-26%20at%2014.35.16.png" width="574" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgk1tiQ_mq2RSI31HsQAtFgiAfc2m_0wV8YrVJN0cjr4x60YgVq9LZmIvf_lWZxaDc6czXZ-pk41Atq-DQ90BHcUPOO9pUXHoxbvkWs5xk50jOz6cnRV25ft1iU33YGLOLcF_YoE8x4YCCTky80dGjEFrsP3ukuVM38Nh4dRWEUYr730foZnpajtNL49-4/s1660/Screenshot%202024-02-26%20at%2014.37.51.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="956" data-original-width="1660" height="368" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgk1tiQ_mq2RSI31HsQAtFgiAfc2m_0wV8YrVJN0cjr4x60YgVq9LZmIvf_lWZxaDc6czXZ-pk41Atq-DQ90BHcUPOO9pUXHoxbvkWs5xk50jOz6cnRV25ft1iU33YGLOLcF_YoE8x4YCCTky80dGjEFrsP3ukuVM38Nh4dRWEUYr730foZnpajtNL49-4/w640-h368/Screenshot%202024-02-26%20at%2014.37.51.png" width="640" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8mXAnxiUjHEn3kbaeI8yK2k84uxmvtPEe4BXBbpBIuQ0fKeH6fTBm5aWHWIboKheBWd9FBDhULFg0wiIEEK-lAVvCuEfcqJGm-ddskbdjuXdkIZys8Xjpx7EoRuN2kBINglf8M2Zpu3q3SrcA4P0rgjLNXL_Hnt9Qq74ZmwW_Y5ZcffdFYqHAdE8RMSU/s1672/Screenshot%202024-02-26%20at%2014.39.30.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1112" data-original-width="1672" height="426" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8mXAnxiUjHEn3kbaeI8yK2k84uxmvtPEe4BXBbpBIuQ0fKeH6fTBm5aWHWIboKheBWd9FBDhULFg0wiIEEK-lAVvCuEfcqJGm-ddskbdjuXdkIZys8Xjpx7EoRuN2kBINglf8M2Zpu3q3SrcA4P0rgjLNXL_Hnt9Qq74ZmwW_Y5ZcffdFYqHAdE8RMSU/w640-h426/Screenshot%202024-02-26%20at%2014.39.30.png" width="640" /></a></div><div><br /></div><div><br /></div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEis2-vusmmvyyhkFYmB3FOFNr-YVE7FO74y4jIpBIU6iRp-LsvhmK31ZXAO1WK-shEnGjk86irWwxKsD6z-b8U_FpacDtSnqxuOgHaNT35QdmE_4_6djXk2SuPofS40kM3-DzHcIonvBCpWM-NU6zxgOjmy3stWHy3bmoy7wPtWoery6W0nE7nUyzsXjMs/s1748/Screenshot%202024-02-26%20at%2014.44.44.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1748" data-original-width="1666" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEis2-vusmmvyyhkFYmB3FOFNr-YVE7FO74y4jIpBIU6iRp-LsvhmK31ZXAO1WK-shEnGjk86irWwxKsD6z-b8U_FpacDtSnqxuOgHaNT35QdmE_4_6djXk2SuPofS40kM3-DzHcIonvBCpWM-NU6zxgOjmy3stWHy3bmoy7wPtWoery6W0nE7nUyzsXjMs/w610-h640/Screenshot%202024-02-26%20at%2014.44.44.png" width="610" /></a></div><br /><div><br /></div><div><br /></div><div>This is a list of all AWS resources involved in running a (Docker) container in one ECS cluster:</div><div><br /></div><div><ul style="text-align: left;"><li>Task definition</li><ul><li>Revisions</li><li>Task role</li><ul><li>policies: ...</li><ul><li>resources: ...</li></ul></ul><li>Task execution role</li><li>Containers</li><ul><li>Container</li><ul><li>Image. This is a <b>Amazon Elastic Container Registry (Amazon ECR)</b> image URI e.g. 03623477220.dkr.ecr.us-east-1.amazonaws.com/my-app:36 (36 is its tag which is usually a docker image version)</li><ul><li>In Amazon ECR >> Private registry >> Repositories: my-app</li></ul><li>Log configuration</li><ul><li>awslogs-group (In CloudWatch >> Log groups)</li></ul></ul></ul></ul><li>Cluster - contains services</li><ul><li>Service</li><ul><li>Task definition: revision <-- this is the link between a Cluster and Task definition</li><li>Network (VPC)</li><li>Subnets</li><li>Security groups</li><li>Service role e.g. <b>AWSServiceRoleForECS</b> (AWS-defined role. Amazon ECS uses the service-linked role named AWSServiceRoleForECS to enable Amazon ECS Service to call AWS APIs on your behalf.)</li><li>Load balancers</li></ul></ul><li>Namespace</li></ul></div><div>---</div><h2 style="text-align: left;">References:</h2><div><a href="http://aws.amazon.com">aws.amazon.com</a></div></div><div class="separator" style="clear: both; text-align: center;"><br /></div>Bojan Komazechttp://www.blogger.com/profile/05437236807206825832noreply@blogger.com0tag:blogger.com,1999:blog-4912226416400969049.post-60259212915890518652024-02-22T11:51:00.008+00:002024-02-23T00:26:09.926+00:00Introduction to AWS CloudFront<div style="text-align: left;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0bPIhgVRoB0uDUND7-A-2ViMjfoeTDmSu-jEgmzLMLPAlpkbxfH4jZ7w7XnIk4TJ1e6jY5zPGvWWGhuOwM2BXj0BZUnV0jTuY3HbjFlfb0XLWI8v2Ae7_7SycodMIac7etyQ5VTFeuUDfeU_kO3C0Oy2UhMYCa938z-dho957ZcMzuIouB8MOjTSwx9g/s1000/aws-cf-logo.webp" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="420" data-original-width="1000" height="268" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0bPIhgVRoB0uDUND7-A-2ViMjfoeTDmSu-jEgmzLMLPAlpkbxfH4jZ7w7XnIk4TJ1e6jY5zPGvWWGhuOwM2BXj0BZUnV0jTuY3HbjFlfb0XLWI8v2Ae7_7SycodMIac7etyQ5VTFeuUDfeU_kO3C0Oy2UhMYCa938z-dho957ZcMzuIouB8MOjTSwx9g/w640-h268/aws-cf-logo.webp" width="640" /></a></div><br /> </div><div style="text-align: left;"><br /></div><div style="text-align: left;"><b>What is AWS CloudFront?</b></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><ul style="text-align: left;"><li>Content delivery network (CDN) provided by AWS</li></ul><div><br /></div><div><b>Why to use it?</b></div><div><br /></div><div style="text-align: left;"><ul style="text-align: left;"><li>To speed up delivery of web content (dynamic, static, streaming, interactive)</li><li>Content is distributed with low latency and high data transfer speeds</li></ul><br /><b>How does it work?</b></div><div><br /><ul style="text-align: left;"><li>Files are delivered to end-users using a global network of edge locations</li><li>Users who request web content are automatically routed to the edge location that gives them the lowest latency.</li></ul><div><br /></div><div><b>How to set it for selected content?</b></div><div><br /></div><div><ul style="text-align: left;"><li>Create a distribution and specify settings for it</li><ul><li>Amazon S3 bucket or HTTP server that we want CloudFront to get the content from</li><li>whether we want only selected users to have access to that content</li><li>whether we want users to use HTTPS</li><li>Alternate domain name (CNAME). This optional setting is a custom domain name that we use in URLs for the files served by this distribution. Example: my-content.example.com.</li></ul><li>CloudFront then assigns a domain name to the distribution (e.g. abcdef0123456.cloudfront.net) but it's possible to use custom domain name (e.g. example.com)</li><li>We can now access our resource via URL:</li><ul><li>http://abcdef0123456.cloudfront.net/index.html or</li><li>http://example.com/index.html</li></ul><li>...</li></ul><div><div>CloudFront >> Distributions are not region-specific, they are global.</div></div></div><div><br /></div><span><a name='more'></a></span><h3 style="text-align: left;">Creating a new distribution in AWS Console</h3><div><br /></div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2NNwBaiGSLkPVDPSpZhgpPVu5_oWdDou8O3DVeId4QRn5-mgqr7AFPdPYX30kHAMjR5VI1Tmwf1fO7TkjqgK19C2xnaG-9LsONzPak2o9zaGMN0t61B_a3sbA3IEIAX7RsIUYK3jhtrcHytaJNNsR5yMHEMRZdNyhPnUdzELm5xN3_Wpmbs_wm28guGs/s1892/Screenshot%202024-02-21%20at%2022.48.58.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1892" data-original-width="1442" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2NNwBaiGSLkPVDPSpZhgpPVu5_oWdDou8O3DVeId4QRn5-mgqr7AFPdPYX30kHAMjR5VI1Tmwf1fO7TkjqgK19C2xnaG-9LsONzPak2o9zaGMN0t61B_a3sbA3IEIAX7RsIUYK3jhtrcHytaJNNsR5yMHEMRZdNyhPnUdzELm5xN3_Wpmbs_wm28guGs/w488-h640/Screenshot%202024-02-21%20at%2022.48.58.png" width="488" /></a></div><div class="separator" style="clear: both; text-align: left;">Origin:</div><div class="separator" style="clear: both;"><ul style="text-align: left;"><li><b>Origin domain</b>: domain name of the origin server</li><ul><li>Clicking into the field opens a drop-down list of items grouped as:</li><ul><li>Amazon S3 - list of S3 buckets</li><li>Elastic Load Balancer - list of ELBs</li><li>API Gateway - list of API GWs</li><li>Mediastore container</li><li>Mediapackage container</li></ul><li>Example: <span style="font-family: courier;">my-test-bucket.s3.us-east-1.amazonaws.com</span></li></ul><li><b>Origin path</b> (optional): this can be:</li><ul><li>a path in S3 bucket e.g. <span style="font-family: courier;">/images</span></li></ul><li><b>Name</b>: origin name</li><ul><li>it gets populated automatically e.g. <span style="font-family: courier;">S3-my-test-bucket/images</span></li></ul></ul><div><span style="font-family: courier;"><br /></span></div>If we choose S3 bucket for origin domain the following options appear:</div><div class="separator" style="clear: both;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifHQIgc3iqFv3fCobqQxGaEBzMeEU7iGYTGFx5fwqX8ufpos2eXqv7QoU_PwKhK1YFDfni7WqY1GBJ4EY0oV-3H7XaJIHGQ9QNeVLW5vXIGqY7Ps8xqHW8eimfGPszKPeynv1whqusjrqRrfWQIfL1zyPVZunFdGg67yZ_L1BL4VqBtDNbF-48zqpEwQQ/s680/Screenshot%202024-02-22%20at%2013.35.35.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="308" data-original-width="680" height="290" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifHQIgc3iqFv3fCobqQxGaEBzMeEU7iGYTGFx5fwqX8ufpos2eXqv7QoU_PwKhK1YFDfni7WqY1GBJ4EY0oV-3H7XaJIHGQ9QNeVLW5vXIGqY7Ps8xqHW8eimfGPszKPeynv1whqusjrqRrfWQIfL1zyPVZunFdGg67yZ_L1BL4VqBtDNbF-48zqpEwQQ/w640-h290/Screenshot%202024-02-22%20at%2013.35.35.png" width="640" /></a></div><ul style="text-align: left;"><li><b>Origin access</b> - You can limit the access to your origin to only authenticated requests from CloudFront.</li><ul><li><b>Public</b></li><ul><li>Not an option if bucket does not allow public access</li></ul><li><b>Origin access control settings (OAC)</b></li><ul><li>Recommended for its wider range of features, including support of S3 buckets in all AWS Regions</li></ul><li><b>Legacy access identities </b></li><ul><li>Origin access identity (OAI)</li><li>Not recommended</li></ul></ul></ul><div>If we choose <b>Origin access control settings (OAC)</b> S3 bucket can restrict access to only CloudFront (<i>Block public access</i> is ON) in which case S3 bucket policy must be updated (S3 bucket >> Permissions >> Bucket Policy). CloudFront provides the policy statement after creating the distribution (once distribution's ARN is known). Such policy JSON might look like this:</div><div><br /></div><div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">{</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Version": "2012-10-17",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Statement": [</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Sid": "<b>AllowCloudFrontServicePrincipalReadOnly</b>",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Effect": "Allow",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Principal": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Service": "<b>cloudfront.amazonaws.com</b>"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Action": "<b>s3:GetObject</b>",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Resource": "arn:aws:s3:::my-test-bucket/*",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Condition": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "StringEquals": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "AWS:SourceArn": "arn:aws:cloudfront::431123456827:distribution/E1WH4T3V3RREB3"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> }</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> }</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> }</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> ]</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">}</span></div></div><div><br /></div><div>If S3 bucket has <i>Block public access</i> is ON but no attached policy that allows CloudFront to access it, requesting a resource like e.g. https://example.com/image/background.jpg will result with this:</div><div><br /></div><div><div><span style="color: red; font-family: courier; font-size: x-small;">This XML file does not appear to have any style information associated with it. The document tree is shown below.</span></div><div><span style="color: red; font-family: courier; font-size: x-small;"><Error></span></div><div><span style="color: red; font-family: courier; font-size: x-small;"> <Code>AccessDenied</Code></span></div><div><span style="color: red; font-family: courier; font-size: x-small;"> <Message><b>Access Denied</b></Message></span></div><div><span style="color: red; font-family: courier; font-size: x-small;"> <RequestId>ATEESSECBE0DZ92Z</RequestId></span></div><div><span style="color: red; font-family: courier; font-size: x-small;"> <HostId>81spSu0E0+kk7wpvd/IiG/4VuU9u2I7D/a43d+378SHau9HDRKyc724ert5Rxhh3j3oNemNXkZA=</HostId></span></div><div><span style="color: red; font-family: courier; font-size: x-small;"></Error></span></div></div><div class="separator" style="clear: both;"><div><span style="font-family: courier;"><br /></span></div><ul style="text-align: left;"><li><b>Add custom header</b> (optional)</li><ul><li>CloudFront includes this header in all requests that it sends to your origin</li></ul><li></li><li><b>Enable Origin Shield</b> (yes/no)</li><ul><li>Origin shield is an additional caching layer that can help reduce the load on your origin and help protect its availability.</li></ul><li></li><li>Additional settings</li><ul><li><b>Connection attempts</b></li><ul><li>The number of times that CloudFront attempts to connect to the origin, from 1 to 3. The default is 3.</li></ul><li><b>Connection timeout</b></li><ul><li>The number of seconds that CloudFront waits for a response from the origin, from 1 to 10. The default is 10.</li></ul><li><b>Response timeout</b> - only applicable to custom origins</li><ul><li>The number of seconds that CloudFront waits for a response from the origin, from 1 to 60. The default is 30.</li></ul><li><b>Keep-alive timeout </b>- only applicable to custom origins</li><ul><li>The number of seconds that CloudFront maintains an idle connection with the origin, from 1 to 60. The default is 5.</li></ul></ul></ul></div><br /><div><br /></div><div><br /></div><div style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir4eXVpDov5juZ3KyTJ1cwrgTJ1L9K0ooId6Ro65phwK6MK7Iyuei5PMyPJe2oXmfL6rvxgnNDYQ5KLb7Rof0oBq-ro8d7zicpP0FxUIsnb9r29gmLkIqJQiinVY31ELMYEUgqT6O-HfSyKpe6WAVNLuZdKSNlEkNYbH5Wu9nTYW94mMGcBe43f38uSlw/s1942/Screenshot%202024-02-21%20at%2023.13.22.png"><img border="0" data-original-height="1942" data-original-width="1432" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEir4eXVpDov5juZ3KyTJ1cwrgTJ1L9K0ooId6Ro65phwK6MK7Iyuei5PMyPJe2oXmfL6rvxgnNDYQ5KLb7Rof0oBq-ro8d7zicpP0FxUIsnb9r29gmLkIqJQiinVY31ELMYEUgqT6O-HfSyKpe6WAVNLuZdKSNlEkNYbH5Wu9nTYW94mMGcBe43f38uSlw/w472-h640/Screenshot%202024-02-21%20at%2023.13.22.png" width="472" /></a></div><br /><div><br /></div><div>Default Cache Behavior:</div><div><br /></div><div><ul style="text-align: left;"><li>Path pattern</li><ul><li>Default (*)</li></ul><li>Compress objects automatically (yes/no)</li><li>Viewer</li><ul><li>Viewer protocol policy</li><ul><li>HTTP and HTTPS</li><li>Redirect HTTP to HTTPS</li><li>HTTPS only</li></ul><li>Allowed HTTP methods</li><ul><li>GET, HEAD</li><li>GET, HEAD, OPTIONS</li><li>GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE</li></ul><li>Restrict viewer access (yes/no)</li><ul><li>If you restrict viewer access, viewers must use CloudFront signed URLs or signed cookies to access your content.</li></ul></ul><li>Cache key and origin requests. We recommend using a cache policy and origin request policy to control the cache key and origin requests.</li><ul><li>Cache policy and origin request policy (recommended)</li><ul><li>Cache policy - Choose an existing cache policy or create a new one.</li><ul><li>Select cache policy</li></ul></ul></ul></ul><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG-wd4FFjFNCQ4Yhxz77pOF_jL1fddNangnDD_VjnBKIM9z8O9ciTl3eba05pMNAh4n0ktfz9LmM1u1U9Im3fqQjohyphenhyphenbvlwRXcu-oAYzlZVbn3GtWEcGy4qgYH57zwcO4uuNxG5Wx8jbImwu461I8Y3N-3bC69-c6GkltcvY7AqEcZ66aNhFNlZEjLtqo/s1104/Screenshot%202024-02-21%20at%2023.15.52.png" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="836" data-original-width="1104" height="484" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiG-wd4FFjFNCQ4Yhxz77pOF_jL1fddNangnDD_VjnBKIM9z8O9ciTl3eba05pMNAh4n0ktfz9LmM1u1U9Im3fqQjohyphenhyphenbvlwRXcu-oAYzlZVbn3GtWEcGy4qgYH57zwcO4uuNxG5Wx8jbImwu461I8Y3N-3bC69-c6GkltcvY7AqEcZ66aNhFNlZEjLtqo/w640-h484/Screenshot%202024-02-21%20at%2023.15.52.png" width="640" /></a><br /><div><br /></div><ul style="text-align: left;"><ul><ul><li>Origin request policy - optional. Choose an existing origin request policy or create a new one.</li><ul><li>Select origin policy</li></ul></ul></ul></ul><div><br /></div><div><br /></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd1eS0Z95oXYWGUpxYGeCB9Qq4KsVfZXpD3NdOKD3YQ4FKgeebIvWY0PMpdWVmCGBGhmmj6Jn_M5K7_00mHYjjtZS2y0hmH29QscsKNcgslL-XMyAEzmCQeKbkasWPL1WdV4Vm7vBfBjwyJsVj6EhvPlDdcrAJQQSrrw334aOdvJFl7FDlI-QBBRin9bk/s1160/Screenshot%202024-02-21%20at%2023.16.02.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="874" data-original-width="1160" height="482" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd1eS0Z95oXYWGUpxYGeCB9Qq4KsVfZXpD3NdOKD3YQ4FKgeebIvWY0PMpdWVmCGBGhmmj6Jn_M5K7_00mHYjjtZS2y0hmH29QscsKNcgslL-XMyAEzmCQeKbkasWPL1WdV4Vm7vBfBjwyJsVj6EhvPlDdcrAJQQSrrw334aOdvJFl7FDlI-QBBRin9bk/w640-h482/Screenshot%202024-02-21%20at%2023.16.02.png" width="640" /></a></div><br /></div><ul style="text-align: left;"><ul><li>Legacy cache settings</li></ul><li>Response headers policy - optional</li><ul><li>Choose an existing response headers policy or create a new one.</li><li>Select response headers</li><li>Create response headers policy</li></ul></ul> </div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf7SkpdSQ31rLn7GI4LZQqRbTjHZh-ny9KCglkY6t8WGQGlzjwSBjxWR4MR3c4vbYWnsVxdaobTEXgQWP2xIl75rEoHnr6QUbDd1LJR2glC3G2ZWCaPP67tfqaitS21r-U4w6DV3vQyK8QDPXoJw1UA-irQOGKIFc3IZ2ZLcLf5Xr20M9H9AT9afgs8cU/s986/Screenshot%202024-02-21%20at%2023.16.25.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="662" data-original-width="986" height="430" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf7SkpdSQ31rLn7GI4LZQqRbTjHZh-ny9KCglkY6t8WGQGlzjwSBjxWR4MR3c4vbYWnsVxdaobTEXgQWP2xIl75rEoHnr6QUbDd1LJR2glC3G2ZWCaPP67tfqaitS21r-U4w6DV3vQyK8QDPXoJw1UA-irQOGKIFc3IZ2ZLcLf5Xr20M9H9AT9afgs8cU/w640-h430/Screenshot%202024-02-21%20at%2023.16.25.png" width="640" /></a></div><br /></div><div><br /></div><div><ul style="text-align: left;"><li>Additional settings</li><ul><li>Smooth streaming (yes/no)</li><ul><li>Choose No if your origin is configured to use Microsoft IIS for Smooth Streaming.</li></ul><li>Field-level encryption</li><ul><li>Choose a field-level encryption configuration.</li><li>Select a field-level encryption profile</li></ul><li>Enable real-time logs (yes/no)</li></ul></ul><div><br /></div></div><span><!--more--></span><div><br /></div><div><div>CloudFront itself does not provide a DNS service but some other DNS provider can be used together with CloudFront:</div><div><ul style="text-align: left;"><li>Route 53</li><li>CloudFare</li><li>Godaddy</li></ul></div><div><br /></div><div>We need to:</div><div><ul style="text-align: left;"><li>Define the domain</li><li>Create a certificate in AWS Certificate Manager (ACM) and associate it with Cloudfront</li><li>With DNS provider to point the CNAME to the Cloudfront distribution.</li></ul></div></div><div><br /></div><div><h3><b>CloudFront and Cloudflare</b></h3><div><br /></div><div>Both CloudFront and Cloudflare provide CDN service. We might be using Cloudflare for other proxy capabilities (e.g. injecting headers like <span style="font-family: courier;">X-Country-Code</span>) and also like a <b>DNS registrar</b> (contains DNS records which are mapping hostnames to IP addresses). </div><div><br /></div><div>Here are some examples of setups where Cloudflare is used as DNS registrar for underlying CloudFront distribution:</div><div><br /></div><div><h4>Example #1: CloudFront distribution targets <u>entire</u> S3 bucket</h4><div><br /></div><div>On <b>AWS</b> we have:</div><div><ul><li>S3 bucket:</li><ul><li>contains only content for the website's blog</li><li><b>Name</b>: <span style="font-family: courier;">my-website-blog-bucket.s3.us-east-1.amazonaws.com</span></li><li>Example of the inner hierarchy: </li><ul><li><span style="font-family: courier;">images/background.png</span></li><li><span style="font-family: courier;">posts/1/text.txt</span></li><li>...</li></ul></ul><li>CloudFront distribution:</li><ul><li>e.g. We want to use CDN only for blog content - entire S3 bucket</li><li><b>Domain name</b>: <span style="font-family: courier;">a330nfs2u0uf9xj.cloudfront.net</span></li><li><b>Alternate domain names</b>: <span style="font-family: courier;"><span style="color: #2b00fe;">blog</span>.mywebsite.com</span></li><li><b>Origin</b>: </li><ul><li><b>Domain</b>: <span style="font-family: courier;">my-website-blog-bucket.s3.us-east-1.amazonaws.com</span></li><li><span style="font-family: courier;"><b style="font-family: Times;">Origin path:</b><span style="font-family: Times;"> (empty)</span></span></li></ul></ul></ul><br /><div>On <b>Cloudfront</b> we have:</div></div><div><ul><li>Website: <span style="font-family: courier;">mywebsite.com</span></li><ul><li>DNS record: </li><ul><li><b>Type</b>: <span style="font-family: courier;">CNAME</span> (maps subdomain, in our case <span style="font-family: courier;">blog.mywebiste.com</span> into domain <span style="font-family: courier;">a330nfs2u0uf9xj.cloudfront.net</span>)</li><li><b>Name</b>: <span style="font-family: courier;"><span style="color: #2b00fe;">blog </span></span>(name of the subdomain of the website)<br /></li><li><b>Target</b>: <span style="font-family: courier;">a330nfs2u0uf9xj.cloudfront.net</span></li><li><b>Proxy status</b>: DNS only (don't cache, only serve as DNS service)</li><li><b>TTL</b>: Auto</li></ul></ul></ul><div><br /></div></div><div>This means that url <span style="font-family: courier;">https://<span style="color: #2b00fe;">blog</span>.mywebsite.com/</span> is now mapped to <span style="font-family: courier;">a330nfs2u0uf9xj.cloudfront.net </span>which is mapped to <span style="font-family: courier;">my-website-blog-bucket.s3.us-east-1.amazonaws.com</span>. </div><div><br /></div><div><br /></div><div><div>Here is how the original request gets transformed:</div><div><br /></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">https://</span><span style="color: #2b00fe; font-family: courier; font-size: x-small;">blog</span><span style="color: #38761d; font-family: courier; font-size: x-small;">.mywebsite.com/images/backgroud.jpg</span></div><div><span style="color: #38761d; font-size: x-small;"><span style="font-family: courier;"><br /></span></span></div><div><span style="color: #38761d; font-size: x-small;"><span style="font-family: courier;">https://</span><span style="font-family: courier;">a330nfs2u0uf9xj.cloudfront.net</span><span style="font-family: courier;">/images/backgroud.jpg</span> </span></div><span style="color: #38761d; font-family: courier; font-size: x-small;"><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><br /></span></div>s3://my-website-blog-bucket.s3.us-east-1.amazonaws.com/images/backgroud.jpg</span></div><div><br /></div></div><div><br /></div><h4>Example #2: CloudFront distribution targets <u>one folder</u> in S3 bucket</h4><div><br /></div><div>On <b>AWS</b> we have:</div><div><ul><li>S3 bucket:</li><ul><li>e.g. contains entire content of the website</li><li><b>Name</b>: <span style="font-family: courier;">my-website-bucket.s3.us-east-1.amazonaws.com</span></li><li>Example of the inner hierarchy: </li><ul><li><span style="font-family: courier;"><span style="color: #2b00fe;">blog</span>/images/background.png</span></li><li><span style="font-family: courier;">store/itemA/description.txt</span></li><li><span style="font-family: courier;">...</span></li></ul></ul><li>CloudFront distribution:</li><ul><li>e.g. We want to use CDN only for blog content - one folder within S3 bucket</li><li><b>Domain name</b>: <span style="font-family: courier;">a330nfs2u0uf9xj.cloudfront.net</span></li><li><b>Alternate domain names</b>: <span style="font-family: courier;"><span style="color: #2b00fe;">blog</span>.mywebsite.com</span></li><li><b>Origin</b>:</li><ul><li><b>Domain</b>: <span style="font-family: courier;">my-website-bucket.s3.us-east-1.amazonaws.com</span></li><li><b>Origin path</b> (optional but we need to specify it here) - a URL path to append to the origin domain name for origin requests. In our case that path is: <span style="color: #2b00fe; font-family: courier;">/blog</span>. This means that when request is sent to <span style="font-family: courier;">my-website-bucket.s3.us-east-1.amazonaws.com/path/to/file</span> this turns into <span style="font-family: courier;">my-website-bucket.s3.us-east-1.amazonaws.com/<span style="color: #2b00fe;">blog</span>/path/to/file</span>.</li></ul></ul></ul><br /><div>On <b>Cloudfront</b> we have:</div></div><div><ul><li><b>Website</b>: <span style="font-family: courier;">mywebsite.com</span></li><ul><li><b>DNS record</b>: </li><ul><li><b>Type</b>: <span style="font-family: courier;">CNAME</span> (maps subdomain, in our case blog.mywebiste.com into domain a330nfs2u0uf9xj.cloudfront.net)</li><li><b>Name</b>: <span style="color: #2b00fe; font-family: courier;">blog</span></li><li><b>Target</b>: <span style="font-family: courier;">a330nfs2u0uf9xj.cloudfront.net</span></li><li><b>Proxy status</b>: DNS only</li><li><b>TTL</b>: Auto</li></ul></ul></ul><div><br /></div></div><div>This means that url <span style="font-family: courier;">https://blog.mywebsite.com/</span> is now mapped to <span style="font-family: courier;">a330nfs2u0uf9xj.cloudfront.net</span> which is mapped to <span style="font-family: courier;">my-website-bucket.s3.us-east-1.amazonaws.com/blog</span>. </div><div><br /></div><div>Here is how the original request gets transformed:</div><div><br /></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">https://</span><span style="color: #2b00fe; font-family: courier; font-size: x-small;">blog</span><span style="color: #38761d; font-family: courier; font-size: x-small;">.mywebsite.com/images/backgroud.jpg</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><br /></span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">https://a330nfs2u0uf9xj.cloudfront.net/images/backgroud.jpg </span></div><span style="color: #38761d; font-family: courier; font-size: x-small;"><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><br /></span></div>s3://my-website-bucket.s3.us-east-1.amazonaws.com/</span><span style="color: #2b00fe; font-family: courier; font-size: x-small;">blog</span><span style="color: #38761d; font-family: courier; font-size: x-small;">/images/backgroud.jpg</span><div><br /></div><div><br /></div><div>Also see the following: <a href="https://advancedweb.hu/how-to-use-a-custom-domain-on-cloudfront-with-cloudflare-managed-dns/">How to use a custom domain on CloudFront with Cloudflare-managed DNS - Advanced Web Machinery</a></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Distribution States</h3><div><ul style="text-align: left;"><li>Enabled</li><li>Disabled</li><ul><li></li><li>Distribution is offline and cannot respond to requests</li><li>We can enable the distribution later to restore it</li><li>A distribution must be disabled before it can be deleted.</li><li>It may take a few minutes for CloudFront to fully propagate the disabled status to all edge locations after disabling the distribution. During this period distribution is not in deletable state so "Delete" button is disabled.</li><li>Once this propagation is completed, we should then be able to select the distribution and click Delete on the CloudFront console.</li></ul></ul></div><div><br /></div><div>---</div></div></div></div>Bojan Komazechttp://www.blogger.com/profile/05437236807206825832noreply@blogger.com0tag:blogger.com,1999:blog-4912226416400969049.post-68901109581693304332024-02-16T13:21:00.005+00:002024-02-16T13:33:23.482+00:00Introduction to ELK Stack<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0LDObOjSwrCdyhyCl3iBVLdk6WT3mbiMoXf95C-ehdhsHYLImlVtrS1D99fj1CwpfzWId69uVOa1E4fHeCnKdkvyPnTtH7UeEhXhjHl0NvhjlaDEgE9Ln3R6FEm9lgzaSdi0qhyphenhyphenVrHBI9wv9zW6bzHodbs4BPvA7SFiSAdY_Tu-PEnGPesHc4ct8KDUg/s500/elk.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="258" data-original-width="500" height="330" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0LDObOjSwrCdyhyCl3iBVLdk6WT3mbiMoXf95C-ehdhsHYLImlVtrS1D99fj1CwpfzWId69uVOa1E4fHeCnKdkvyPnTtH7UeEhXhjHl0NvhjlaDEgE9Ln3R6FEm9lgzaSdi0qhyphenhyphenVrHBI9wv9zW6bzHodbs4BPvA7SFiSAdY_Tu-PEnGPesHc4ct8KDUg/w640-h330/elk.png" width="640" /></a></div><br /><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;">What is ELK stack?</div><div style="text-align: left;"><ul style="text-align: left;"><li>Elasticsearch [<a href="https://www.elastic.co/elasticsearch">https://www.elastic.co/elasticsearch</a>]</li><li>Logstash [<a href="https://www.elastic.co/logstash">https://www.elastic.co/logstash</a>]</li><li>Kibana [<a href="https://www.elastic.co/kibana">https://www.elastic.co/kibana</a>]</li></ul></div><div style="text-align: left;"><br /></div><div style="text-align: left;">What is it used for?</div><div style="text-align: left;"><ul style="text-align: left;"><li>aggregates logs from all systems and applications</li><li>logs analytics</li><li>visualizations for application and infrastructure monitoring, faster troubleshooting, security analytics etc.</li></ul><div><br /></div><h2 style="text-align: left;">Elasticsearch</h2><div><br /></div><div><ul style="text-align: left;"><li>distributed search and analytics engine built on Apache Lucene</li><li>licensed, not open source</li><ul><li><a href="https://opensearch.org/" rel="nofollow" target="_blank">OpenSearch</a> is open-sourced alternative (supported by AWS)</li><li><a href="https://www.fluentd.org/" rel="nofollow" target="_blank">FluentD</a> is another open-source data collection alternative</li></ul><li>data in the form of JSON documents is sent to Elasticsearch using:</li><ul><li>API</li><li>ingestion tools</li><ul><li>Logstash</li><li>Amazon Kinesis Data Firehose</li></ul></ul><li>the original document automatically stored and a searchable reference is added to the document in the cluster’s index</li><li>Elasticsearch REST-based API is used to manipulate with documents:</li><ul><li>send</li><li>search</li><li>retrieve </li></ul><li>uses schema-free JSON documents</li><li>distributed system</li><ul><li>enables it to process large volumes of data in parallel, quickly finding the best matches for your queries</li></ul><li>operations such as reading or writing data usually take less than a second to complete => Elasticsearch can be used for near real-time use cases such as application monitoring and anomaly detection</li><li>has support for various languages: Java, Python, PHP, JavaScript, Node.js, Ruby etc...</li><li>.</li></ul><div><br /></div></div><div><br /></div><h2 style="text-align: left;">Logstash</h2><div><br /></div><div><ul style="text-align: left;"><li>log shipper</li><li>helps easily transform source data and load it into Elasticsearch cluster</li><li>.</li></ul><div><br /></div></div><h2 style="text-align: left;">Filebeat</h2><div><br /></div><div><ul style="text-align: left;"><li><a href="https://www.elastic.co/beats/filebeat">https://www.elastic.co/beats/filebeat</a></li><li>log shipper</li><li>both Filebeat and Logstash can be used to send logs from a file-based data source to a supported output destination</li><li>Filebeat is a lightweight option, ideal for environments with limited resources and basic log parsing needs. Conversely, Logstash is tailored for scenarios that demand advanced log processing</li><li>both FB and LS can be used in tandem when building a logging pipeline with the ELK Stack because both have a different function</li>.</ul></div><div><br /></div><h2 style="text-align: left;">Kibana</h2><div><br /></div><div style="text-align: left;"><ul style="text-align: left;"><li>visualisation and reporting tool</li><li>used with Elasticsearch to:</li><ul><li>visualize the data</li><li>build interactive dashboards</li></ul><li>.</li></ul></div></div>Bojan Komazechttp://www.blogger.com/profile/05437236807206825832noreply@blogger.com0tag:blogger.com,1999:blog-4912226416400969049.post-266461791006950852024-02-02T12:00:00.007+00:002024-02-02T12:00:45.863+00:00Installing GraphViz on MacOS<div style="text-align: left;">I wanted to test <a href="https://developer.hashicorp.com/terraform/cli/commands/graph">Command: graph | Terraform | HashiCorp Developer</a> by cd-ing to an arbitrary Terraform module and executing:<br /><br /></div><div style="text-align: left;"><span style="color: #38761d; font-family: courier;">% terraform graph -type=plan | dot -Tpng >graph.png</span><br /><br /></div><div style="text-align: left;">But this issued an error:<br /><br /></div><div style="text-align: left;"><span style="color: red; font-family: courier;">zsh: command not found: dot</span><br /><br /></div><div style="text-align: left;">Solution:<br /><br /></div><div style="text-align: left;"><span style="color: #38761d; font-family: courier;">% brew install graphviz <br />...<br />==> Installing graphviz<br />==> Pouring graphviz--9.0.0.arm64_ventura.bottle.tar.gz<br />🍺 /opt/homebrew/Cellar/graphviz/9.0.0: 287 files, 7.1MB<br />==> Running `brew cleanup graphviz`...<br />Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.<br />Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).</span><br /><br /></div><div style="text-align: left;">To verify installation:<br /><br /></div><div style="text-align: left;"><span style="color: #38761d; font-family: courier;">% dot --version </span></div><div style="text-align: left;"><span style="color: #38761d; font-family: courier;">dot - graphviz version 9.0.0 (20230911.1827)</span></div>Bojan Komazechttp://www.blogger.com/profile/05437236807206825832noreply@blogger.com0tag:blogger.com,1999:blog-4912226416400969049.post-90335137586035869632023-11-15T12:01:00.001+00:002023-11-22T09:40:43.190+00:00Pingdom vs Site24x7 - Feature Comparison<p> </p><span id="docs-internal-guid-ebff5953-7fff-cd54-98ba-214b3bca6d07"><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none; table-layout: fixed; width: 468pt;"><colgroup><col></col><col></col><col></col></colgroup><tbody><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Pingdom</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Site24x7</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Note</span></p></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Check</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">(Website) Monitor</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Name of check</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Display Name</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">URL/IP</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Web page URL</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Check interval</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Check Frequency</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Default is 1 minute in both</span></p></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Test from</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Monitoring Locations</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Port</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">N/A for Website Monitors but is available for e.g. Port Monitor (Custom Protocol) </span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">If the website url starts with http://, port 80 is used; if https:// port 443 is used.</span></p></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">User name</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Web Credentials</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Password</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Web Credentials</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Check for string:</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Should contain</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Should contain string(s)</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Pingdom: If this text is missing from the page, the site will be considered as </span><span face="Arial, sans-serif" style="font-size: 11pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">down</span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. </span></p><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Site24x7 offers flagging this as </span><span face="Arial, sans-serif" style="font-size: 11pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Trouble</span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> or </span><span face="Arial, sans-serif" style="font-size: 11pt; font-style: italic; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Down</span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">. </span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 14.6667px; white-space-collapse: preserve;">Provide a space-separated list of strings, all of which must be present in the response. Specify each string within double quotes.</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 14.6667px; white-space-collapse: preserve;"><br /></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 14.6667px; white-space-collapse: preserve;">Example: </span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 14.6667px; white-space-collapse: preserve;"> {"status":"ok"} needs to be entered as </span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 14.6667px; white-space-collapse: preserve;">{\"status\":\"ok\"}</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 14.6667px; white-space-collapse: preserve;">In Terraform:</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 14.6667px; white-space-collapse: preserve;">"\"{\\\"status\\\":\\\"ok\\\"}\""</span></p></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Check for string:</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Should not contain</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Should not contain string(s) </span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Site24x7 offers flagging this as Trouble or Down</span></p></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">N/A</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Case sensitive</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">N/A</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Should match regular expression</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Site24x7 offers flagging this as Trouble or Down</span></p></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">N/A</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Should contain HTTP Response Header(s)</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Site24x7 offers flagging this as Trouble or Down</span></p></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">POST data</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">HTTP Method = POST</span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Request Body:</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">FORM</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Text</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">XML</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">JSON </span></p></li></ul><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Send data to website via POST method, one per line. Eg.j_username=joe</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">N/A</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">HTTP Method:</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">POST</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">GET</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">HEAD</span></p></li></ul></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Request headers</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">HTTP Request Headers</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">N/A (included in Req. headers)</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">User Agent </span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Authentication Method</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Basic / NTLM</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">OAuth</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Web Token</span></p></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">N/A</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Client Certificate</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Only PKCS #12 files are supported</span></p></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">N/A</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Query Authoritative Name Server</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">N/A</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Force Domain / IP Addresses</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">N/A </span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Accepted HTTP Status Codes</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">N/A</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Follow HTTP Redirection</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Monitor SSL/TLS</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">certificate</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Trust the Server SSL Certificate</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">N/A</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">SSL Protocol</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">SSL version</span></p></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">N/A</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">HTTP Protocol</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">HTTP version</span></p></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">N/A</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Enable ALPN</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Consider down prior</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">to certificate expiring</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Use IPv6</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Prefer IPv6</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><br /></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="color: blue; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Connection Timeout</span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> </span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">(e.g. 10 secs)</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">(socket connection)</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Monitor Groups</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Dependent on Monitor</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Tags</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">IT Automation Templates</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Execute IT Automation during Scheduled Maintenance</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr></tbody></table></div><br /><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Alerts</span></p><br /><br /><div align="left" dir="ltr" style="margin-left: 0pt;"><table style="border-collapse: collapse; border: none; table-layout: fixed; width: 468pt;"><colgroup><col></col><col></col><col></col></colgroup><tbody><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Pingdom</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Site24x7</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt; text-align: center;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Note</span></p></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Alerting Settings</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">(within Check settings)</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; font-weight: 700; vertical-align: baseline; white-space-collapse: preserve;">Threshold Profile</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">(referenced in Monitor)</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">N/A</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Monitor Type </span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">(e.g. Website)</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">N/A</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Display Name</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">(Pingdom uses 1 Second Opinion probe server)</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Number of locations to report monitor as down</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">N/A</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Notify when website content is modified (yes/no)</span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /><br /></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Notify as:</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Down</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Trouble </span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Critical</span></p></li></ul></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Check importance </span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">(High or Low)</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">User profile >> Alert Settings</span></p><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Choose notification mode:</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Email</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">SMS</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Voice Call</span></p></li></ul><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">…for alert severity:</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Down </span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Critical</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Trouble</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Up</span></p></li></ul></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Who to alert?</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">User Alert Group</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="color: blue; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Consider down after</span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">:__ sec</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">(e.g. 30 sec timeout)</span></p><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">(</span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">response</span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> time)</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Notify in case of </span><span face="Arial, sans-serif" style="color: blue; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">read timeout </span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">(yes/no)</span></p><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">Response</span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"> receive timeout period is 30 seconds and it can’t be changed.</span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;"><br /></span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Notify as:</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Down</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Trouble </span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Critical</span></p></li></ul></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">When down, alert after</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">(e.g. 2 mins)</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Notification Profile >> Notification Delay</span></p><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">When the status is:</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Down</span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Trouble </span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Critical</span></p><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">…Notification Delay:</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Notify immediately after failure</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Notify after [2-5] continuous failures]</span></p></li></ul></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Resend alert every</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Notification Profile >> Persistent Alert</span></p><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Notify After Every: __th error</span></p><br /></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Customized message</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Alert when back up</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Notification Profile >> Alert Configuration</span></p><br /><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">When the status is:</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Any</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Down </span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Critical</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Trouble</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-decoration-line: underline; text-decoration-skip-ink: none; text-wrap: wrap; vertical-align: baseline;">Up</span></p></li></ul><br /></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr><tr style="height: 0pt;"><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Connect Integrations</span></p></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; vertical-align: baseline; white-space-collapse: preserve;">Third-Party Integrations</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Webhooks</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">Microsoft Teams</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-variant-position: normal; text-wrap: wrap; vertical-align: baseline;">…</span></p></li></ul></td><td style="border-bottom: solid #000000 1pt; border-color: rgb(0, 0, 0); border-left: solid #000000 1pt; border-right: solid #000000 1pt; border-style: solid; border-top: solid #000000 1pt; border-width: 1pt; overflow-wrap: break-word; overflow: hidden; padding: 5pt; vertical-align: top;"><br /></td></tr></tbody></table></div><br /></span><p><br /></p><p><br /></p>Bojan Komazechttp://www.blogger.com/profile/05437236807206825832noreply@blogger.com1tag:blogger.com,1999:blog-4912226416400969049.post-22160410805927040562023-10-26T12:51:00.004+01:002023-10-30T13:15:29.611+00:00Overview of the Pingdom service<div class="separator" style="clear: both; text-align: center; text-decoration-line: underline;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzn0zqXD2-Et_GdnW2tLytXkJk-EdTqv5J1O4nHwaNvY40YMZR4QwrfUloMiyfS6ku5SX8vNe-lmVtv4SxPxQlO8sqcO0TW3DFfTeM7MtBShMlkfDk0zLj2_ydklBQ-HMOCzeImfBpeN9O8zFrLdGmd6Fnbti1bREsdclSnca8EaYhGWX61W3CAXVAlj0/s2400/pingdom-2-logo-png-transparent.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2400" data-original-width="2400" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzn0zqXD2-Et_GdnW2tLytXkJk-EdTqv5J1O4nHwaNvY40YMZR4QwrfUloMiyfS6ku5SX8vNe-lmVtv4SxPxQlO8sqcO0TW3DFfTeM7MtBShMlkfDk0zLj2_ydklBQ-HMOCzeImfBpeN9O8zFrLdGmd6Fnbti1bREsdclSnca8EaYhGWX61W3CAXVAlj0/w640-h640/pingdom-2-logo-png-transparent.png" width="640" /></a></div><div style="text-decoration-line: underline;"><u><br /></u></div><div><a href="https://www.pingdom.com/" rel="nofollow" target="_blank">Pingdom</a> is a Swedish company which provides a website monitoring service of the same name. It tests website accessibility/availability by pinging it from multiple locations around the globe. </div><div><br /></div><h2 style="text-align: left;">How does Pingdom work</h2><div><br /></div><div>Pingdom has a global network of so called <b>probe servers</b> (bots). The full list of their IP addresses can be found here: <a href="https://documentation.solarwinds.com/en/success_center/pingdom/content/topics/pingdom-probe-servers-ip-addresses.htm">Pingdom URLs and IP addresses</a>. It is important that these IP addresses are whitelisted in firewalls or Access Control Lists (if they are used). </div><div><br /></div><div>From <a href="https://documentation.solarwinds.com/en/success_center/pingdom/content/topics/why-does-pingdom-say-my-site-is-down-when-it-is-not-.htm#:~:text=When%20one%20of%20our%20probe,as%20possible%20to%20make%20it">Why does Pingdom say my site is down, when it is not?</a>:</div><div><br /></div><div><blockquote><i>When one of our probe servers cannot connect to a site or server, Pingdom's system will first mark the check as <b>Unconfirmed Down</b> and then ask another probe server to try to make the same connection, we call this a <b>Second Opinion</b>, we try to make the second opinion as geographically different as possible to make it easier to determine where the issue is. Your check (site or server) will only be marked as confirmed <b>Down</b> if the second test fails. <u>It will continue to be marked as Down as long as consecutive probe requests register errors.</u></i></blockquote></div><div><br /></div><div><br /></div><h2 style="text-align: left;">When does Pingdom flags that webiste is down (that it has an outage)?</h2><div><br /></div><div>From <a href="https://documentation.solarwinds.com/en/success_center/pingdom/content/topics/why-does-pingdom-say-my-site-is-down-when-it-is-not-.htm#:~:text=When%20one%20of%20our%20probe,as%20possible%20to%20make%20it">Why does Pingdom say my site is down, when it is not?</a>:</div><div><br /></div><div><div></div><blockquote><div><i>Some common <b>outage</b> reasons and their most common causes:</i></div><div><i><br /></i></div><div><i><b>Timeouts</b> (30 seconds to connect to site, load HTML), mostly caused by either our <u>servers being blocked</u> or the site being really really <u>slow</u>.</i></div><div><i><br /></i></div><div><i><b>HTTP Error 403</b>, our servers are being forbidden from visiting the site. Again this is most likely caused by a block against our servers, or the site showing an error page that forbids people to view it.</i></div><div><i><br /></i></div><div><i><b>HTTP Error 500/502/503</b>, something is wrong with this server. Or the server is showing Pingdom servers an error page.</i></div></blockquote><div></div><div><br /></div></div><div><br /></div><h2 style="text-align: left;">Overview of Pingdom products</h2><div><br /></div><div>On its website, Pingdom offers four products:</div><div><br /></div><div><ul style="text-align: left;"><li><b>Visitor Insights (Real User Monitoring - RUM)</b> - to better understand website visitors</li><li><b>Uptime</b> - monitoring and alerting when website is down</li><li><b>Page Speed</b> - for measuring page performance</li><li><b>Transactions</b> - for simulating user interactions</li></ul></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8e5IL_qYGWNUnhA9aSLRxp8CQUATPCPgVlZqqjqhbMslwryj56S0sSxLdFXFE4r5gNSO8rvucMUJMBq9npIxksr97Cu_55_yvYKo7y6RkY00uV-FYzsgVPS2QJnkXQyGEfod2kpqOeA7Ud2MmWQl72KgttvBwC-5Op1v2JTyuNDaS3X0rLthiPMBqoYE/s2462/Screenshot%202023-10-26%20at%2012.07.13.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="602" data-original-width="2462" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8e5IL_qYGWNUnhA9aSLRxp8CQUATPCPgVlZqqjqhbMslwryj56S0sSxLdFXFE4r5gNSO8rvucMUJMBq9npIxksr97Cu_55_yvYKo7y6RkY00uV-FYzsgVPS2QJnkXQyGEfod2kpqOeA7Ud2MmWQl72KgttvBwC-5Op1v2JTyuNDaS3X0rLthiPMBqoYE/w640-h156/Screenshot%202023-10-26%20at%2012.07.13.png" width="640" /></a></div><div><br /></div><h3 style="text-align: left;">Uptime</h3><div><br /></div><div>To set up the new check, we ned to click on Add new button:</div><div><br /></div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS76PaLWNyRehZRqM135hjvMVZK_QnhST3q0r2us8M2nzjXdXqrBsNZj4iZF1ETVxKNE1laAIkYBU66QxBUR-d0xTsL9JVw-AZVZi95LapBqt9wOIjJzy18sRByB_-GK01gWnuzcdkiQn2BE9yFIo0LvyVhf7eZZXqtjsxRqrUVv7gcORvQDCEPu05w-U/s2770/Screenshot%202023-10-26%20at%2012.12.18.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="528" data-original-width="2770" height="122" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjS76PaLWNyRehZRqM135hjvMVZK_QnhST3q0r2us8M2nzjXdXqrBsNZj4iZF1ETVxKNE1laAIkYBU66QxBUR-d0xTsL9JVw-AZVZi95LapBqt9wOIjJzy18sRByB_-GK01gWnuzcdkiQn2BE9yFIo0LvyVhf7eZZXqtjsxRqrUVv7gcORvQDCEPu05w-U/w640-h122/Screenshot%202023-10-26%20at%2012.12.18.png" width="640" /></a></div><br /><div>And fill the Add Uptime Check form:</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAEfn2q6J73DjUYiZZLtsf7njWWDcxqpUg0WUAwOuPa48hxg72VoE-5wtbx3zCfiYkqLh6blC93KzUSTQAhP4lzirbZpbR6TBTLZeWJZ8JJpgMUiHjtg5r1Diuv4eifUt1bwPq_MOv8-uO4lNJRyIgYdui4NgWEurnxoj3Kg1fNu_Zkj3x0XnwWttj47w/s1772/Screenshot%202023-10-26%20at%2012.24.15.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1772" data-original-width="1346" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAEfn2q6J73DjUYiZZLtsf7njWWDcxqpUg0WUAwOuPa48hxg72VoE-5wtbx3zCfiYkqLh6blC93KzUSTQAhP4lzirbZpbR6TBTLZeWJZ8JJpgMUiHjtg5r1Diuv4eifUt1bwPq_MOv8-uO4lNJRyIgYdui4NgWEurnxoj3Kg1fNu_Zkj3x0XnwWttj47w/w486-h640/Screenshot%202023-10-26%20at%2012.24.15.png" width="486" /></a></div><br /><div><br /></div><div style="text-decoration-line: underline;"><u><br /></u></div><u>Check Settings (general):</u><br /><ul style="text-align: left;"><li><b>Name of check</b> - arbitrary name of the check</li><li><b>Check interval</b> - number (minutes); Determines how often this check will be tested. 1 minute is recommended. Other options are 5, 15, 30 and 60 minutes. </li><li>There are 3 tabs which represent 3 check targets and we need pick one:</li><ul><li><b><i>Web</i></b></li><ul><li><b>Check type</b>:</li><ul><li>HTTP(S) - Monitor a web page</li><li>HTTP Custom - Monitor scripts on your web page</li></ul><li>Required:</li><ul><li><b>URL/IP</b>: http:// or https:// + hostname and path</li></ul><li>Optional</li><ul><li><b>Port</b>: You only need to specify this when not using the standard port (80 for HTTP, 443 for HTTPS).</li><li><b>User name</b>: The username required to access the page, if any (HTTP Authentication). Case sensitive.</li><li><b>Password</b>: The password for the username above, if any. Case sensitive.</li><li><b>Check for string</b>: A text string that has to be (or must not be) present in the HTML code of the page. If this text is missing from the page, the site will be considered as down. Leave this field empty if you do not want to require a string to be present. This text is NOT case sensitive.</li><ul><li>Should contain <string></li><li>Should not contain <string></li></ul><li><b>POST data</b>: Data that should be posted to the web page, for example submission data for a sign-up or login form. The data needs to be formatted in the same way as a web browser would send it to the web server.</li><li><b>Request headers</b>: Headers that should be sent with the HTTP request. You may set a custom header. It is not possible to remove the user agent header. e.g. User-Agent = Pingdom.com_bot_version_1.4_(http://www.pingdom.com/)</li><li><b>Monitor SSL/TLS certificate</b>: Monitor the validity of your SSL/TLS certificate. With this enabled Uptime checks will be considered DOWN when the certificate becomes invalid or expires.<ul><li>SSL/TLS certificate monitoring is available for HTTP checks</li></ul></li><li><b>Consider down prior to certificate expiring</b>: number of days. Select the number of days prior to your certificate expiry date that you want to consider the check down. At this day your check will be considered down and if applicable a down alert will be sent.</li><li><b>Use IPv6</b>: By default is set to IPv4, select only if you require IPv6.</li></ul></ul><li><b><i>Network</i></b></li><ul><li><b>Check type</b>:</li><ul><li>TCP Port - Monitor a TCP port for a response</li><li>Ping - Monitor network connectivity</li><li>DNS - Monitor lookups on a DNS server</li><li>UDP - Monitor a UDP port for a response</li></ul><li>Required:</li><ul><li><b>Domain/IP</b>: - Either the IP address (example: 111.11.11.11) or the name of the site (example: www.mysite.com).</li><li><b>Port</b>: Select the TCP port you wish to check. If not one of the standard ones in the list, enter the TCP port number in the box.</li></ul><li>Optional:</li><ul><li><b>String to send</b>: The string to send, required by the TCP protocol. Case sensitive.</li><li><b>String to expect</b>: The string to expect back, required by the TCP protocol. Case sensitive.</li></ul></ul><li><b><i>Email</i></b>:</li><ul><li><b>Check type</b>:</li><ul><li>SMTP - Monitor an SMTP server for a response</li><li>POP3 - Monitor a POP3 server for a response</li><li>IMAP - Monitor an IMAP server for a response</li></ul><li>Required:</li><ul><li><b>Domain/IP</b>: Either the IP address (example: 111.11.11.11) or the name of the site (example: www.mysite.com).</li></ul><li>Optional:</li><ul><li><b>Port</b>: You only need to specify this when not using the standard port (25).</li><li><b>User name</b>: The username required to access SMTP server, if any. Case sensitive.</li><li><b>Password</b>: The password for the username above, if any. Case sensitive.</li><li><b>String to expect</b>: The string to expect back, required by the SMTP protocol. Case sensitive. Default is "220".</li><li><b>Use STARTTLS</b>: (bool) Encryption using SSL (Secure Sockets Layer)/TLS (Transport Layer Security).</li></ul></ul></ul><li><b>Test from</b>: Select from which region your check should be tested. By default we test alternatingly from Europe and North America.</li><ul><li>Default (North America and Europe)</li><li>North America</li><li>Europe</li><li>Asia Pacific</li><li>Latin America</li></ul><li><b>Tags</b>: Tags can be used to organize checks. You can add as many tags as you like. Return or space creates a new tag. For example, creating the tag Server 1 and adding it to all checks that run on Server 1 would allow you to search and view all checks for Server 1 in the Uptime list view.</li></ul><u>Alerting Settings (part of the check settings):</u><ul style="text-align: left;"><li><b>Check importance</b>: Allows users to control how they receive alerts for outages (by email, text message or push notification), based on the set importance level of the check. You can manage your alert settings in your User profile.</li><ul><li>High importance</li><li>Low importance</li></ul><li><b>Who to alert? </b>Select which user, contact or team that should be alerted if the check is considered down.</li><ul><li>All Users (team of 3)</li><li>Team A (team of 2)</li><li>Team B (team of 2)</li><li>Person 1</li><li>Person 2</li><li>...</li></ul><li><b>Consider down after</b>: By lowering this value you set a threshold for your response time. We will alert you when the selected value has been exceeded. At which timeout threshold the site or server should be considered as unresponsive/down, meaning that our servers will wait this amount of time before reporting an outage</li><ul><li>value can be in the range from 10ms to 30s</li></ul><li><b>When down, alert after</b>: Determines how soon an alert is sent once a check is considered down.</li><ul><li>value can be instantly to 60 mins</li></ul><li><b>Resend alert every</b>:</li><ul><li>value from the range never to 60 down cycles</li></ul><li><b>Customized message</b>: Any text here will be added to email and webhook alerts. Great for providing additional context in the case of an outage.</li><li><b>Alert when back up</b>: boolean - Decide if you want to be alerted when a check is confirmed to be back up again.</li><li><b>Connect Integrations</b>. Use webhooks to send alerts to third party systems.</li><ul><li>You haven’t set up any integrations with your Pingdom account yet. By using integrations like webhooks you can do more with your favorite apps.</li></ul></ul><br /><div class="separator" style="clear: both; text-align: center;"><br /></div>There are two types of web speed measurements:<div><ul style="text-align: left;"><li><b>Response Time</b></li><ul><li>Used in Uptime reports</li><li>For an <b>uptime check</b> (http check) the response time is calculated as the <u>time it takes to perform a HTTP GET to the specified URL</u>, so the response time is calculated in three parts:</li><ul><li>Time to first byte</li><li>Time to receive headers</li><li>Time to load HTML of the site</li></ul><li>Skipping dynamic content is basically a cURL request. If you want a response time that is just TTFB (time to first byte) you can use a Ping check as this is almost equivalent.</li><li>Uptime check <u>doesn't load any other elements on the page</u>, and will thus only give you the Response Time of your website or server.</li></ul><li><b>Page Load time (Load Time)</b></li><ul><li>Used in the RUM and Page Speed reports</li><li>Used to describe how long a specific page took to load in its entirety, this includes all images, scripts, CSS and third party resources (as well as the HTML of course) that might be found on a website.</li><li>These reports will combine the load time of each element on the page to give you the total page load time, and this is why the load time of a website often is a lot higher than the response time.</li></ul></ul><div><br /></div><h2 style="text-align: left;">How to recover the website which is experiencing an outage?</h2><div><br /></div><div><a href="https://www.pingdom.com/blog/what-to-do-when-your-site-is-down/">What to Do When Your Site is Down - Pingdom</a></div><div><br /></div><h2 style="text-align: left;">Resources:</h2></div><div><br /></div><div><a href="https://documentation.solarwinds.com/en/success_center/pingdom/content/topics/difference-between-response-time-and-page-load-time.htm">Difference between Response Time and Page Load Time</a></div><div><a href="https://documentation.solarwinds.com/en/success_center/pingdom/content/topics/response-time-and-calculations-in-the-uptime-report.htm">Response time and calculations in the uptime report</a></div><div><a href="https://documentation.solarwinds.com/en/success_center/pingdom/content/topics/page-speed-check.htm">Page Speed Check</a></div><div><a href="https://www.pingdom.com/blog/how-to-check-website-status/">How To Check Website Status - Pingdom</a></div><div><a href="https://documentation.solarwinds.com/en/success_center/pingdom/content/topics/alerting-setup.htm">Alerting Setup</a></div><div><br /></div><div><br /></div><div><br /></div>Bojan Komazechttp://www.blogger.com/profile/05437236807206825832noreply@blogger.com0tag:blogger.com,1999:blog-4912226416400969049.post-92056810414242616542023-10-05T16:23:00.006+01:002023-10-05T17:14:40.230+01:00How to run MySQL server and client using Docker on MacOS<div style="text-align: left;"><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfiGBUiR0I8qRcxF-gzkNIkZi1dDNCRfL7vrTXU8YdCvwv7vAOdqGNcE0F2CYMWH-sU4tHxuRpBvhVcZ55b5pfp2uEmwI2iB_JLSz5eTf9lfNBlz-03KYlJGec2kKOmdzdQrnXQwSvyoIS4Gspc-DwrVmVxH_rHb-PIwHwflIyMpkIsf3f-jFrFWebM34/s1000/blog-docker-macos-mysql.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="500" data-original-width="1000" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfiGBUiR0I8qRcxF-gzkNIkZi1dDNCRfL7vrTXU8YdCvwv7vAOdqGNcE0F2CYMWH-sU4tHxuRpBvhVcZ55b5pfp2uEmwI2iB_JLSz5eTf9lfNBlz-03KYlJGec2kKOmdzdQrnXQwSvyoIS4Gspc-DwrVmVxH_rHb-PIwHwflIyMpkIsf3f-jFrFWebM34/w640-h320/blog-docker-macos-mysql.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><span style="color: #999999; font-size: xx-small;">image source: https://factorialcomplexity.com/</span></td></tr></tbody></table><br /><div style="text-align: left;"><br /></div><div style="text-align: left;">To install Docker on MacOS follow these instructions: <a href="https://docs.docker.com/desktop/install/mac-install/">Install Docker Desktop on Mac | Docker Docs</a></div><div style="text-align: left;"><br /></div><div style="text-align: left;">To run MySQL server in Docker container which is not detached (does not run in background): </div><div style="text-align: left;"><br /></div><div style="text-align: left;"><span style="color: #38761d; font-family: courier;">% <b>docker run \</b></span></div><div style="text-align: left;"><span style="color: #38761d; font-family: courier;"><b>--name my-mysql-container \</b></span></div><div style="text-align: left;"><span style="color: #38761d; font-family: courier;"><b>-e MYSQL_ROOT_PASSWORD=ok \</b></span></div><div style="text-align: left;"><span style="color: #38761d; font-family: courier;"><b>-p3306:3306 \</b></span></div><div style="text-align: left;"><span style="color: #38761d; font-family: courier;"><b>mysql:8.0</b></span></div><div style="text-align: left;"><span style="color: #38761d; font-family: courier;"> </span></div><div style="text-align: left;"><span style="color: #38761d; font-family: courier; font-size: x-small;">2023-10-05 14:53:01+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.34-1.el8 started.<br />2023-10-05 14:53:01+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'<br />2023-10-05 14:53:01+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.34-1.el8 started.<br />2023-10-05 14:53:01+00:00 [Note] [Entrypoint]: Initializing database files<br />2023-10-05T14:53:01.934152Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.<br />2023-10-05T14:53:01.934254Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.34) initializing of server in progress as process 80<br />2023-10-05T14:53:01.939114Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.<br />2023-10-05T14:53:02.171938Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.<br />2023-10-05T14:53:02.830346Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.<br />2023-10-05 14:53:05+00:00 [Note] [Entrypoint]: Database files initialized<br />2023-10-05 14:53:05+00:00 [Note] [Entrypoint]: Starting temporary server<br />2023-10-05T14:53:05.321074Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.<br />2023-10-05T14:53:05.324515Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.34) starting as process 124<br />2023-10-05T14:53:05.335777Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.<br />2023-10-05T14:53:05.428502Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.<br />2023-10-05T14:53:05.544258Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.<br />2023-10-05T14:53:05.544283Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.<br />2023-10-05T14:53:05.545082Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.<br />2023-10-05T14:53:05.553518Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: /var/run/mysqld/mysqlx.sock<br />2023-10-05T14:53:05.553570Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.34' socket: '/var/run/mysqld/mysqld.sock' port: 0 MySQL Community Server - GPL.<br />2023-10-05 14:53:05+00:00 [Note] [Entrypoint]: Temporary server started.<br />'/var/lib/mysql/mysql.sock' -> '/var/run/mysqld/mysqld.sock'<br />Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.<br />Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it.<br />Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it.<br />Warning: Unable to load '/usr/share/zoneinfo/tzdata.zi' as time zone. Skipping it.<br />Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.<br />Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.<br />2023-10-05 14:53:06+00:00 [Note] [Entrypoint]: Stopping temporary server<br />2023-10-05T14:53:06.611355Z 10 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.34).<br />2023-10-05T14:53:08.163907Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.34) MySQL Community Server - GPL.<br />2023-10-05 14:53:08+00:00 [Note] [Entrypoint]: Temporary server stopped<br />2023-10-05 14:53:08+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up.<br />2023-10-05T14:53:08.821603Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.<br />2023-10-05T14:53:08.822305Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.34) starting as process 1<br />2023-10-05T14:53:08.825981Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.<br />2023-10-05T14:53:08.895159Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.<br />2023-10-05T14:53:09.030902Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.<br />2023-10-05T14:53:09.030930Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.<br />2023-10-05T14:53:09.031870Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.<br />2023-10-05T14:53:09.039049Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock<br />2023-10-05T14:53:09.039091Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.34' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.<br />2023-10-05T14:54:46.771871Z 0 [System] [MY-013172] [Server] Received SHUTDOWN from user <via user signal>. Shutting down mysqld (Version: 8.0.34).<br />2023-10-05T14:54:47.855145Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.34) MySQL Community Server - GPL.</span></div><div style="text-align: left;"><br /></div><div style="text-align: left;">If we want to stop this container, we need to open another terminal and execute:</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><div><span style="color: #38761d; font-family: courier;">% <b>docker stop my-mysql-container</b></span></div><div><span style="color: #38761d; font-family: courier;">my-mysql-container</span></div><div><br /></div><div>This does not remove the stopped/exited container which can be verified by listing all containers:</div><div><span style="font-size: medium;"><br /></span></div><div><b><span style="color: #38761d; font-family: courier;">% </span><span style="color: #38761d; font-family: courier;">docker container ls -all</span></b></div><div><br /></div><div><br /></div><div>If we don't want to re-use (restart) that container, we can remove it:</div><div><br /></div><div><div><span style="color: #38761d; font-family: courier;">% <b>docker rm my-mysql-container</b></span></div><div><span style="color: #38761d; font-family: courier;">my-mysql-container</span></div></div><div><br /></div><div><br /></div><div>We can make sure container is removed automatically by passing <b>--rm</b> to <b>docker run</b>.</div><div><br /></div><div>Once MySQL Docker container is running we can see some of its details if we list all containers:</div><div><br /></div><div><div><span style="color: #38761d; font-family: courier; font-size: medium;">% <b>docker container ls </b></span></div><div><span style="color: #38761d; font-family: courier; font-size: xx-small;">CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES</span></div><div><span style="color: #38761d; font-family: courier; font-size: xx-small;">9287fcb65268 mysql:8.0 "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:3306->3306/tcp, 33060/tcp my-mysql-container</span></div></div><div><br /></div><div><br /></div><div>We can see that it's bound to IP address 0.0.0.0 and port 3306.</div><div><br /></div><div>To connect to this DB instance we can use mysql client. </div><div><br /></div><div>We can use brew to install only mysql client (which also includes mysqldamp application):</div><div><br /></div><div><div><span style="color: #38761d; font-family: courier;">% brew install mysql-client</span></div><div><br /></div><div>Installation can be verified by checking apps' versions:</div><div><br /></div><div><span style="color: #38761d; font-family: courier;">% /opt/homebrew/opt/mysql-client/bin/mysql --version</span></div><div><span style="color: #38761d; font-family: courier;">/opt/homebrew/opt/mysql-client/bin/mysql Ver 8.1.0 for macos13.3 on arm64 (Homebrew)</span></div><div><span style="color: #38761d; font-family: courier;"> </span></div><div><span style="color: #38761d; font-family: courier;">% /opt/homebrew/opt/mysql-client/bin/mysqldump --version</span></div><div><span style="color: #38761d; font-family: courier;">mysqldump Ver 8.1.0 for macos13.3 on arm64 (Homebrew)</span></div></div><div><br /></div><div>We can now connect to DB:</div><div><br /></div><div><div><span style="color: #38761d; font-family: courier;">% <b>/opt/homebrew/opt/mysql-client/bin/mysql -uroot -p -h0.0.0.0 </b> </span></div><div><span style="color: #38761d; font-family: courier;">Enter password: <--enter 'ok'</span></div><div><span style="color: #38761d; font-family: courier;"><br /></span></div><div><span style="color: #38761d; font-family: courier;">Welcome to the MySQL monitor. Commands end with ; or \g.</span></div><div><span style="color: #38761d; font-family: courier;">Your MySQL connection id is 8</span></div><div><span style="color: #38761d; font-family: courier;">Server version: 8.0.34 MySQL Community Server - GPL</span></div><div><span style="color: #38761d; font-family: courier;"><br /></span></div><div><span style="color: #38761d; font-family: courier;">Copyright (c) 2000, 2023, Oracle and/or its affiliates.</span></div><div><span style="color: #38761d; font-family: courier;"><br /></span></div><div><span style="color: #38761d; font-family: courier;">Oracle is a registered trademark of Oracle Corporation and/or its</span></div><div><span style="color: #38761d; font-family: courier;">affiliates. Other names may be trademarks of their respective</span></div><div><span style="color: #38761d; font-family: courier;">owners.</span></div><div><span style="color: #38761d; font-family: courier;"><br /></span></div><div><span style="color: #38761d; font-family: courier;">Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.</span></div><div><span style="color: #38761d; font-family: courier;"><br /></span></div><div><span style="color: #38761d; font-family: courier;">mysql> </span></div><div><br /></div><div><br /></div></div><div>We didn't need to pass port number as we're using a default MySQL port (3306) but we had to pass a host (-h).</div><div><br /></div><div>To see which users are created for this brand new MySQL instance:</div><div><br /></div><div><div><span style="color: #38761d; font-family: courier;">mysql> select host, user, plugin from mysql.user;</span></div><div><span style="color: #38761d; font-family: courier;">+-----------+------------------+-----------------------+</span></div><div><span style="color: #38761d; font-family: courier;">| host | user | plugin |</span></div><div><span style="color: #38761d; font-family: courier;">+-----------+------------------+-----------------------+</span></div><div><span style="color: #38761d; font-family: courier;">| % | <b>root</b> | caching_sha2_password |</span></div><div><span style="color: #38761d; font-family: courier;">| localhost | mysql.infoschema | caching_sha2_password |</span></div><div><span style="color: #38761d; font-family: courier;">| localhost | mysql.session | caching_sha2_password |</span></div><div><span style="color: #38761d; font-family: courier;">| localhost | mysql.sys | caching_sha2_password |</span></div><div><span style="color: #38761d; font-family: courier;">| localhost | <b>root</b> | caching_sha2_password |</span></div><div><span style="color: #38761d; font-family: courier;">+-----------+------------------+-----------------------+</span></div><div><span style="color: #38761d; font-family: courier;">5 rows in set (0.02 sec)</span></div></div><div><br /></div><div><br /></div><div>MySQL here actually shows "accounts" which come in format: username@host. So we have here two root accounts, one for connection from localhost only and one for connections from anywhere.</div><div><br /></div><div> To list current databases:</div><div><br /></div><div><div><span style="color: #38761d; font-family: courier;">mysql> show databases;</span></div><div><span style="color: #38761d; font-family: courier;">+--------------------+</span></div><div><span style="color: #38761d; font-family: courier;">| Database |</span></div><div><span style="color: #38761d; font-family: courier;">+--------------------+</span></div><div><span style="color: #38761d; font-family: courier;">| information_schema |</span></div><div><span style="color: #38761d; font-family: courier;">| mysql |</span></div><div><span style="color: #38761d; font-family: courier;">| performance_schema |</span></div><div><span style="color: #38761d; font-family: courier;">| sys |</span></div><div><span style="color: #38761d; font-family: courier;">+--------------------+</span></div><div><span style="color: #38761d; font-family: courier;">4 rows in set (0.03 sec)</span></div><div><br /></div></div><div><br /></div><div><br /></div><div>MySQL Docker container automatically creates and mounts a volume:</div><div><br /></div><div><div><span style="color: #38761d; font-family: courier;">% <b>docker inspect my-mysql-container</b></span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">[</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Id": "a8a275aa4b15b49702a0fcf080950b0b92b0f7239742ecad0ff3a1fc84e87ba3",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Created": "2023-10-05T15:06:55.21292468Z",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Path": "docker-entrypoint.sh",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Args": [</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "mysqld"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> ],</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "State": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Status": "running",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Running": true,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Paused": false,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Restarting": false,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "OOMKilled": false,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Dead": false,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Pid": 1632,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "ExitCode": 0,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Error": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "StartedAt": "2023-10-05T15:06:55.430691972Z",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "FinishedAt": "0001-01-01T00:00:00Z"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Image": "sha256:659ee6cc1dd35b909daead51fbc9010e2252ce16bc260b56b6d709facb844a7b",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "ResolvConfPath": "/var/lib/docker/containers/a8a275aa4b15b49702a0fcf080950b0b92b0f7239742ecad0ff3a1fc84e87ba3/resolv.conf",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "HostnamePath": "/var/lib/docker/containers/a8a275aa4b15b49702a0fcf080950b0b92b0f7239742ecad0ff3a1fc84e87ba3/hostname",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "HostsPath": "/var/lib/docker/containers/a8a275aa4b15b49702a0fcf080950b0b92b0f7239742ecad0ff3a1fc84e87ba3/hosts",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "LogPath": "/var/lib/docker/containers/a8a275aa4b15b49702a0fcf080950b0b92b0f7239742ecad0ff3a1fc84e87ba3/a8a275aa4b15b49702a0fcf080950b0b92b0f7239742ecad0ff3a1fc84e87ba3-json.log",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Name": "/my-mysql-container",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "RestartCount": 0,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Driver": "overlay2",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Platform": "linux",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "MountLabel": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "ProcessLabel": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "AppArmorProfile": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "ExecIDs": null,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "HostConfig": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Binds": null,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "ContainerIDFile": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "LogConfig": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Type": "json-file",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Config": {}</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "NetworkMode": "default",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "PortBindings": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "3306/tcp": [</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "HostIp": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "HostPort": "3306"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> }</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> ]</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "RestartPolicy": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Name": "no",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "MaximumRetryCount": 0</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "AutoRemove": false,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "VolumeDriver": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "VolumesFrom": null,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "ConsoleSize": [</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> 83,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> 318</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> ],</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "CapAdd": null,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "CapDrop": null,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "CgroupnsMode": "private",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Dns": [],</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "DnsOptions": [],</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "DnsSearch": [],</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "ExtraHosts": null,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "GroupAdd": null,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "IpcMode": "private",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Cgroup": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Links": null,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "OomScoreAdj": 0,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "PidMode": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Privileged": false,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "PublishAllPorts": false,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "ReadonlyRootfs": false,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "SecurityOpt": null,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "UTSMode": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "UsernsMode": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "ShmSize": 67108864,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Runtime": "runc",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Isolation": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "CpuShares": 0,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Memory": 0,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "NanoCpus": 0,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "CgroupParent": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "BlkioWeight": 0,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "BlkioWeightDevice": [],</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "BlkioDeviceReadBps": [],</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "BlkioDeviceWriteBps": [],</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "BlkioDeviceReadIOps": [],</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "BlkioDeviceWriteIOps": [],</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "CpuPeriod": 0,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "CpuQuota": 0,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "CpuRealtimePeriod": 0,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "CpuRealtimeRuntime": 0,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "CpusetCpus": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "CpusetMems": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Devices": [],</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "DeviceCgroupRules": null,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "DeviceRequests": null,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "MemoryReservation": 0,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "MemorySwap": 0,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "MemorySwappiness": null,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "OomKillDisable": null,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "PidsLimit": null,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Ulimits": null,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "CpuCount": 0,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "CpuPercent": 0,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "IOMaximumIOps": 0,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "IOMaximumBandwidth": 0,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "MaskedPaths": [</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "/proc/asound",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "/proc/acpi",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "/proc/kcore",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "/proc/keys",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "/proc/latency_stats",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "/proc/timer_list",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "/proc/timer_stats",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "/proc/sched_debug",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "/proc/scsi",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "/sys/firmware"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> ],</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "ReadonlyPaths": [</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "/proc/bus",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "/proc/fs",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "/proc/irq",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "/proc/sys",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "/proc/sysrq-trigger"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> ]</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "GraphDriver": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Data": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "LowerDir": "/var/lib/docker/overlay2/45fab3456bae181cec9ccd9958f491dc51594ebee0d8f2c05ea913dfc216373a-init/diff:/var/lib/docker/overlay2/554caa8009fcffb10545ec19f3647ff8f6e4efb76bb6968f88ce4aa4e5a99d93/diff:/var/lib/docker/overlay2/b0504363136d9025c59462da707577865b082f00e32a89bbf904acd2e8fcb0dd/diff:/var/lib/docker/overlay2/1d752f3ab2539a06342fbc75736758e9bed9419abe8c12337b475513a550dbe2/diff:/var/lib/docker/overlay2/dafcf26ab1425cac1c2cbb027b6d98b1c0a3c2219ff017fd60eda1a3cbcc82a5/diff:/var/lib/docker/overlay2/942525d090959c9e107a63b340e3d9ef2cfc562e7db3f4a50baacbdb84e290aa/diff:/var/lib/docker/overlay2/fbbdc662d593c7e1a3129b3d07b579adeca19f6b4eb1a07644baeeb69d08d5d7/diff:/var/lib/docker/overlay2/1b05ad572a1376ace845fde6a4504d0c4fb3feb61c553ec8bec7683ae1462233/diff:/var/lib/docker/overlay2/1150f0ce41e94b651bcb633e3f9c65f3e729d10e1f496473ee3549de929b6c71/diff:/var/lib/docker/overlay2/0b83049e1887b1c36619fff3f47336edc894acb612eb9ab6a8af78f065ac839d/diff:/var/lib/docker/overlay2/211c588f45135714ed24353659529c1d1913e4e47f51654140dce11ad6cb9781/diff:/var/lib/docker/overlay2/119cde52e1eb9760d4ed3e94482b22aa5c02ce7d6082cf7b7cf872e6f243238a/diff",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "MergedDir": "/var/lib/docker/overlay2/45fab3456bae181cec9ccd9958f491dc51594ebee0d8f2c05ea913dfc216373a/merged",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "UpperDir": "/var/lib/docker/overlay2/45fab3456bae181cec9ccd9958f491dc51594ebee0d8f2c05ea913dfc216373a/diff",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "WorkDir": "/var/lib/docker/overlay2/45fab3456bae181cec9ccd9958f491dc51594ebee0d8f2c05ea913dfc216373a/work"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Name": "overlay2"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Mounts": [</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Type": <b>"<u>volume</u>"</b>,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Name": "dc3ba28061ef18cc37f4472804ac3d7a30b305fea0f364815e5efcd55ad71401",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Source": "<b>/var/lib/docker/volumes/dc3ba28061ef18cc37f4472804ac3d7a30b305fea0f364815e5efcd55ad71401/_data</b>",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Destination": "<b>/var/lib/mysql</b>",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Driver": "local",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Mode": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "RW": true,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Propagation": ""</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> }</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> ],</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Config": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Hostname": "a8a275aa4b15",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Domainname": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "User": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "AttachStdin": false,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "AttachStdout": true,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "AttachStderr": true,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "ExposedPorts": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "3306/tcp": {},</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "33060/tcp": {}</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Tty": false,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "OpenStdin": false,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "StdinOnce": false,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Env": [</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> <b>"MYSQL_ROOT_PASSWORD=ok"</b>,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "GOSU_VERSION=1.16",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "MYSQL_MAJOR=8.0",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "MYSQL_VERSION=8.0.34-1.el8",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "MYSQL_SHELL_VERSION=8.0.34-1.el8"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> ],</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Cmd": [</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "mysqld"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> ],</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Image": "mysql:8.0",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Volumes": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "/var/lib/mysql": {}</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "WorkingDir": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Entrypoint": [</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> <b>"docker-entrypoint.sh"</b></span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> ],</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "OnBuild": null,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Labels": {}</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "NetworkSettings": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Bridge": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "SandboxID": "d43214351095b716cc00d79d20f32389e95e3b62808d252c42036b567903b9c0",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "HairpinMode": false,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "LinkLocalIPv6Address": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "LinkLocalIPv6PrefixLen": 0,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Ports": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "3306/tcp": [</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> <b>"HostIp": "0.0.0.0"</b>,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> <b>"HostPort": "3306"</b></span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> }</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> ],</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "33060/tcp": null</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "SandboxKey": "/var/run/docker/netns/d43214351095",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "SecondaryIPAddresses": null,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "SecondaryIPv6Addresses": null,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "EndpointID": "cdc7d50bcb9a5c0be31aba3c3d2fd5726996bd5870801675250f48b02eaef278",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Gateway": "172.17.0.1",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "GlobalIPv6Address": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "GlobalIPv6PrefixLen": 0,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "IPAddress": "172.17.0.2",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "IPPrefixLen": 16,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "IPv6Gateway": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "MacAddress": "02:42:ac:11:00:02",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "<b>Networks</b>": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "<b>bridge</b>": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "IPAMConfig": null,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Links": null,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Aliases": null,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "NetworkID": "a2a205d498dcc308e419b7785da1e2ebce4da2f962df0b83f5c98f8aef9a5759",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "EndpointID": "cdc7d50bcb9a5c0be31aba3c3d2fd5726996bd5870801675250f48b02eaef278",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Gateway": "172.17.0.1",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "IPAddress": "<b>172.17.0.2</b>",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "IPPrefixLen": 16,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "IPv6Gateway": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "GlobalIPv6Address": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "GlobalIPv6PrefixLen": 0,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "MacAddress": "02:42:ac:11:00:02",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "DriverOpts": null</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> }</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> }</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> }</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> }</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">]</span></div></div><div><br /></div><div><br /></div><div>If we want to prevent manual typing of the password but also not specifying it in the terminal command (so it does not show in history) we can create a config file where mysql will be sourcing username and password for MySQL server.</div><div><br /></div><div><div><span style="color: #38761d; font-family: courier;"> % vi ~/.my.cnf </span></div><div><span style="color: #38761d; font-family: courier;">[mysqldump]</span></div><div><span style="color: #38761d; font-family: courier;">user=user1</span></div><div><span style="color: #38761d; font-family: courier;">password=pass1</span></div><div><span style="color: #38761d; font-family: courier;"><br /></span></div><div><span style="color: #38761d; font-family: courier;">[mysql]</span></div><div><span style="color: #38761d; font-family: courier;">user=user1</span></div><div><span style="color: #38761d; font-family: courier;">password=pass1</span></div></div><div><br /></div><div>We can now run mysql without specifying credentials in command line: </div><div><br /></div><div><span style="color: #38761d; font-family: courier;">% /opt/homebrew/opt/mysql-client/bin/mysql --defaults-extra-file=~/.my.cnf ...</span></div><div><br /></div><div><br /></div><div>Similarly, we can run mysqldump:</div><div><br /></div><div><span style="color: #38761d; font-family: courier;">% /opt/homebrew/opt/mysql-client/bin/mysqldump --host=... --port=3306 --all-databases --skip-triggers > db-dump.sql</span></div><div><br /></div><div>---</div><div><br /></div><div>...</div></div><div style="text-align: left;"><br /></div>Bojan Komazechttp://www.blogger.com/profile/05437236807206825832noreply@blogger.com0tag:blogger.com,1999:blog-4912226416400969049.post-32222457786827579132023-05-18T17:17:00.015+01:002023-07-07T12:28:43.591+01:00My PHP notes<p style="text-align: left;"> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjk5-LDqYdvtyv3mBM8TpKYnv8Pu6cID-KMoYhGrZimgFupK9TpXEpgUThCZ9GFeRTQBk56Hcg0kR3L3RqENGbATbun8NpDMA7Hhk4RYiC9zLGBS-OnAEMkpGrdydfTR-qYZP0qUb1EaOsPiQzaCTi8dG8mGUKi1FNjSKptZCq8jVGaZX7LB3tZTfmg/s1920/PHP-logo.svg.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1037" data-original-width="1920" height="346" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjk5-LDqYdvtyv3mBM8TpKYnv8Pu6cID-KMoYhGrZimgFupK9TpXEpgUThCZ9GFeRTQBk56Hcg0kR3L3RqENGbATbun8NpDMA7Hhk4RYiC9zLGBS-OnAEMkpGrdydfTR-qYZP0qUb1EaOsPiQzaCTi8dG8mGUKi1FNjSKptZCq8jVGaZX7LB3tZTfmg/w640-h346/PHP-logo.svg.png" width="640" /></a></div><br /><p style="text-align: left;"></p><p style="text-align: left;">I've never worked professionally with PHP but had to test some code so here are just some snippets I had to run in <a href="https://www.tehplayground.com/4u7Ru62iCeQlNZFf">tehplayground</a>...</p><p style="text-align: left;"><br /></p><h2 style="text-align: left;">Types</h2><h3 style="text-align: left;">Boolean</h3><p style="text-align: left;">Boolean false implicitly converts to an empty string. In order to get 'false' when boolean variable is false, we need to do the following conversion manually:<br /></p><p style="text-align: left;"><span style="color: #38761d; font-family: courier;">print($myarray_is_empty ? 'true' : 'false');</span><br /></p><p style="text-align: left;"><br /></p><h3 style="text-align: left;">Arrays</h3><p style="text-align: left;"><br /></p><p style="text-align: left;"> <span style="color: #38761d; font-family: courier;"><?php<br />// example code<br /><br />// $welcome = file_get_contents('/content/welcome');<br /><br />// empty array<br />$my_array = </span><span style="color: #2b00fe; font-family: courier;"><b>array()</b></span><span style="color: #38761d; font-family: courier;">;<br /><br />if ($my_array </span><span style="color: #2b00fe; font-family: courier;"><b>== NULL</b></span><span style="color: #38761d; font-family: courier;">) {<br /> print "\$my_array == NULL\n";<br />}<br /><br />if ($my_array </span><span style="color: #2b00fe; font-family: courier;"><b>=== NULL</b></span><span style="color: #38761d; font-family: courier;">) {<br /> print "\$my_array === NULL\n";<br />}<br /><br />if (</span><span style="color: #2b00fe; font-family: courier;"><b>is_null</b></span><span style="color: #38761d; font-family: courier;">($my_array)) {<br /> print "is_null(\$my_array) is true\n";<br />}<br /><br /></span><span style="color: #2b00fe; font-family: courier;"><b>print</b></span><span style="color: #38761d; font-family: courier;"> "my_array = {$my_array}\n"; // line 21<br /><br /><br />print "var_dump(\$my_array) = \n";<br /></span><span style="color: #2b00fe; font-family: courier;"><b>var_dump</b></span><span style="color: #38761d; font-family: courier;">($my_array);<br /><br />if (</span><span style="color: #2b00fe; font-family: courier;"><b>in_array</b></span><span style="color: #38761d; font-family: courier;">("test", $my_array)) {<br /> echo "test is in array";<br />}<br /><br /><br />if (!in_array("test", $my_array)) {<br /> </span><span style="color: #2b00fe; font-family: courier;"><b>echo</b></span><span style="color: #38761d; font-family: courier;"> "test is not in array";<br />}<br /><br />print "Unsetting \$my_array";<br /></span><span style="color: #2b00fe; font-family: courier;"><b>unset</b></span><span style="color: #38761d; font-family: courier;">($my_array);<br /><br /><br />if ($my_array == NULL) {<br /> print "\$my_array == NULL\n";<br />}<br /><br />if ($my_array === NULL) { // line 44<br /> print "\$my_array === NULL\n";<br />}<br /><br />if (in_array("test", $my_array)) { // line 48<br /> echo "test is in array";<br />}</span></p><p style="text-align: left;"><span style="color: #38761d; font-family: courier;">?> <br /></span></p><p style="text-align: left;"> </p><p style="text-align: left;">Output:</p><p style="text-align: left;"> </p><p style="text-align: left;"><i>$my_array == NULL<br /><br />Warning: Array to string conversion in Standard input code on line 21<br />my_array = Array<br />var_dump($my_array) = <br />array(0) {<br />}<br />test is not in arrayUnsetting $my_array<br />Warning: Undefined variable $my_array in Standard input code on line 40<br />$my_array == NULL<br /><br />Warning: Undefined variable $my_array in Standard input code on line 44<br />$my_array === NULL<br /><br />Warning: Undefined variable $my_array in Standard input code on line 48<br /><br />Fatal error: Uncaught TypeError: in_array(): Argument #2 ($haystack) must be of type array, null given in Standard input code:48<br />Stack trace:<br />#0 Standard input code(48): in_array('test', NULL)<br />#1 {main}<br /> thrown in Standard input code on line 48 </i></p><p style="text-align: left;"><i> </i></p><p><span style="font-family: courier;"></span></p><p>What happens if foreach is used on undefined variable ($myarray)<span style="font-family: courier;">:<br /><br /><span style="color: #38761d;">foreach($myarray as $element) {<br /> print $element;<br />}</span><br /><br /><br /></span><i>Output:</i></p><p style="text-align: left;"><i>Warning: Undefined variable $myarray in Standard input code on line 8<br /><br />Warning: foreach() argument must be of type array|object, null given in Standard input code on line 8</i></p><p style="text-align: left;"><i></i></p><p style="text-align: left;"><i></i></p><p style="text-align: left;"><i><br /></i></p><span style="color: #38761d; font-family: courier;">if ($myarray) { // 12<br /> <span> </span>print $myarray;<br />}</span><p style="text-align: left;"><i></i></p><p style="text-align: left;"><i>Output:</i></p><p style="text-align: left;"><i>Warning: Undefined variable $myarray in Standard input code on line 12<br /><br /><br /></i></p><p><span style="font-family: courier;"><span style="color: #38761d;">if ($myarray == null) { // 16</span></span></p><p><span style="font-family: courier;"><span style="color: #38761d;"><span> </span>echo '$myarray == null';<br />}<br /></span><br /></span><i> </i></p><p style="text-align: left;"><i>Output:</i></p><p style="text-align: left;"><i>Warning: Undefined variable $myarray in Standard input code on line 16<br /> <br /></i></p><p style="text-align: left;"><i> </i></p><p style="text-align: left;"><i> </i></p><p style="text-align: left;"><a href="https://www.w3schools.com/php/func_array_diff.asp">PHP array_diff() Function</a><i> <br /></i></p><br /><br /><span style="color: #38761d; font-family: courier; font-size: small;">if (</span><span style="color: #2b00fe; font-family: courier; font-size: small;"><b>empty</b></span><span style="color: #38761d; font-family: courier; font-size: small;">($not_declared_array)) {<br /> echo("not_declared_array is empty.\n");<br />} else {<br /> echo("not_declared_array is not empty.\n");<br />}<br /><br />$null_array = <b>null</b>;<br /><br />if (</span><span style="color: #38761d; font-family: courier; font-size: small;"></span><span style="color: #2b00fe; font-family: courier; font-size: small;"><b>empty</b></span><span style="color: #38761d; font-family: courier; font-size: small;"></span><span style="color: #38761d; font-family: courier; font-size: small;">($null_array)) {<br /> echo("null_array is empty.\n");<br />} else {<br /> echo('$null_array is not empty.\n');<br />}<br /><br />$array = <b>[]</b>;<br /><br />if (</span><span style="color: #38761d; font-family: courier; font-size: small;"></span><span style="color: #2b00fe; font-family: courier; font-size: small;"><b>empty</b></span><span style="color: #38761d; font-family: courier; font-size: small;"></span><span style="color: #38761d; font-family: courier; font-size: small;">($array)) {<br /> echo("array is empty.\n");<br />} else {<br /> echo('array is not empty.\n');<br />}</span><br /><br /> <br /><br />Output:<p style="text-align: left;"><i>not_declared_array is empty.<br />null_array is empty.<br />array is empty. </i></p><h2 style="text-align: left;"><br />RegEx </h2><p style="text-align: left;"><a href="https://www.php.net/manual/en/function.preg-match.php">PHP: preg_match - Manual</a> <br /></p><p style="text-align: left;"><a href="https://www.guru99.com/php-regular-expressions.html">PHP preg_match(): Regular Expressions (Regex)</a></p><p style="text-align: left;"> </p><div style="text-align: left;"><span style="color: #38761d; font-family: courier;">$input = '--parameter-1=3 --parameter-2=bing.com --parameter-3=0';<br />preg_match('~parameter-1=(.*?) ~', $input, $output);<br />echo var_dump($output[1]);<br /><br />preg_match('~parameter-2=(.*?) ~', $input, $output);<br />echo var_dump($output[1]);<br /><br />preg_match('~parameter-3=(.*?)$~', $input, $output);<br />echo var_dump($output[1]);</span></div><div style="text-align: left;"><i><br /></i></div>Output:<div style="text-align: left;"><i> </i></div><div style="text-align: left;"><i>string(1) "3"<br />string(8) "bing.com"<br />string(1) "0"</i></div><div style="text-align: left;"><i><br /></i></div><div style="text-align: left;">---<i><br /></i></div>Bojan Komazechttp://www.blogger.com/profile/05437236807206825832noreply@blogger.com0tag:blogger.com,1999:blog-4912226416400969049.post-19125009818423924162023-03-10T17:32:00.003+00:002023-03-10T17:32:48.597+00:00AWS EFS with Terraform<p style="text-align: left;"><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdD9AmbUMD-jNXXarZjYC8JEblOjB4hClroXdeoNvbuiTc3jtatXQ4mW6YK2gCDqiHJ3mHP_jidd9c2CrUJ_Sz_oi8AY_QZsA0346WgFCjltKMBKnZgb2TsztDVvw8k3bnM0SNzulbjgcx4ms4TxxRjszVx2WgZ2mfa5H-G1JQOu10ovh6NE0AKR7r/s684/aws-tf-vert.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="435" data-original-width="684" height="408" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdD9AmbUMD-jNXXarZjYC8JEblOjB4hClroXdeoNvbuiTc3jtatXQ4mW6YK2gCDqiHJ3mHP_jidd9c2CrUJ_Sz_oi8AY_QZsA0346WgFCjltKMBKnZgb2TsztDVvw8k3bnM0SNzulbjgcx4ms4TxxRjszVx2WgZ2mfa5H-G1JQOu10ovh6NE0AKR7r/w640-h408/aws-tf-vert.png" width="640" /></a></div><br /><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;">The minimal <a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/efs_file_system">aws_efs_file_system | Resources | hashicorp/aws | Terraform Registry</a> resource example is:<br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><span style="font-family: courier;"><span style="color: #38761d;">resource "aws_efs_file_system" "my-app-data-efs" {<br /> tags = {<br /> Name = "my-app-data-efs"<br /> }<br />}</span><br /></span></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;">In AWS Console, we can go to Amazon EFS >> File systems and verify that it's created. Its attributes are:<br /></div><div style="text-align: left;"><br /><i><b>Name</b>: my-app-data-efs</i></div><div style="text-align: left;"><i><b>File system ID</b>: fs-1d130ce4a92769f59</i></div><div style="text-align: left;"><i><b>Encrypted</b>: Unencrypted</i></div><div style="text-align: left;"><i><b>Total size:</b> 6.00 KiB</i></div><div style="text-align: left;"><i><b>Size in Standard / One Zone:</b> 6.00 KiB </i></div><div style="text-align: left;"><i><b>Size in Standard-IA / One Zone-IA:</b> 0 Bytes</i></div><div style="text-align: left;"><i><b>Provisioned Throughput (MiB/s): </b> - </i></div><div style="text-align: left;"><i><b>File system state:</b> Available</i></div><div style="text-align: left;"><i><b>Creation time:</b> Thu, 09 Mar 2023 10:41:55 GMT</i></div><div style="text-align: left;"><i><b>Availability Zone: </b>Standard</i></div><div style="text-align: left;"> </div><div style="text-align: left;"><i><b>Performance mode: </b>General Purpose</i></div><div style="text-align: left;"><i><b>Throughput mode:</b> Bursting<br /><b>Lifecycle management:</b></i></div><div style="margin-left: 40px; text-align: left;"><i><b>Transition into IA:</b> None</i></div><div style="margin-left: 40px; text-align: left;"><i><b>Transition out of IA:</b> None</i></div><div style="text-align: left;"><i><b>Availability zone:</b> Standard</i></div><div style="text-align: left;"><i><b>Automatic backups:</b> Disabled<br /><b>Encrypted: </b>No<br /><b>File system state:</b> Available<br /><b>DNS name:</b> No mount targets available<br /></i> <br /> </div><div style="text-align: left;"> </div><div style="text-align: left;">It will have no Access points and no Mount targets defined: <br /></div><div style="text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfsQWE5jLVhzWoRF-S7-hjgy2XLrjy7xEyAqSt7nGGCgCAocWdKhGisLX1m8B28c8XYrRkmXqOxHw9lzmTE3zaj1bKkk0MYAPewaa51CKya_QtDdvhSnDUch8otwWJAgntB613giycjH9Ll5TcP-GaySV0b060xvW0TSU1e1P4IDiOhbsnQmIReCBW/s1592/Screenshot%20from%202023-03-10%2014-48-15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="282" data-original-width="1592" height="114" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfsQWE5jLVhzWoRF-S7-hjgy2XLrjy7xEyAqSt7nGGCgCAocWdKhGisLX1m8B28c8XYrRkmXqOxHw9lzmTE3zaj1bKkk0MYAPewaa51CKya_QtDdvhSnDUch8otwWJAgntB613giycjH9Ll5TcP-GaySV0b060xvW0TSU1e1P4IDiOhbsnQmIReCBW/w640-h114/Screenshot%20from%202023-03-10%2014-48-15.png" width="640" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTj-lAxXIoZIBjd0fU0jeKaaSZwgyKAs20APBKsjhwfjS9vYbxlnPkB9yPjiTQ-amT_msQR-pfAzc_mZkDf0f1DE9qRciJ8Jm9HnVRXR2EKTSU8mgtrDPAfobZ7OWFWyFnccW2TkYBA0WH-BX3qTzlCKCN2F2hBUm1nRy34FQI7YnnrS0w8q9MBnH1/s1592/Screenshot%20from%202023-03-10%2014-48-20.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="282" data-original-width="1592" height="114" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTj-lAxXIoZIBjd0fU0jeKaaSZwgyKAs20APBKsjhwfjS9vYbxlnPkB9yPjiTQ-amT_msQR-pfAzc_mZkDf0f1DE9qRciJ8Jm9HnVRXR2EKTSU8mgtrDPAfobZ7OWFWyFnccW2TkYBA0WH-BX3qTzlCKCN2F2hBUm1nRy34FQI7YnnrS0w8q9MBnH1/w640-h114/Screenshot%20from%202023-03-10%2014-48-20.png" width="640" /></a></div><div style="text-align: left;"><br /></div><div style="text-align: left;"> </div><div style="text-align: left;">To provide mount target, we need to use <a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/efs_mount_target " rel="nofollow" target="_blank">aws_efs_mount_target | Resources | hashicorp/aws | Terraform Registry</a>. Required attributes are EFS (for which we want to create mount target) and subnet (in which we want this mount target to be):</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><span style="color: #38761d; font-family: courier;">resource "aws_efs_mount_target" "my-app-data-efs-mt" {<br /> file_system_id = aws_efs_file_system.my-app-data-efs.id<br /> subnet_id = "subnet-14321c874d6d35c6a" <br />}</span></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><span style="font-family: courier;">terraform plan</span> output:<br /></div><div style="text-align: left;"></div><div style="text-align: left;"></div><div style="text-align: left;"><br /><span style="color: #38761d; font-family: courier;">Terraform will perform the following actions:<br /><br /> # aws_efs_mount_target.my-app-data-efs-mt will be created<br /> + resource "aws_efs_mount_target" "my-app-data-efs-mt" {<br /> + availability_zone_id = (known after apply)<br /> + availability_zone_name = (known after apply)<br /> + dns_name = (known after apply)<br /> + file_system_arn = (known after apply)<br /> + file_system_id = "fs-1d130ce4a92769f59"<br /> + id = (known after apply)<br /> + ip_address = (known after apply)<br /> + mount_target_dns_name = (known after apply)<br /> + network_interface_id = (known after apply)<br /> + owner_id = (known after apply)<br /> + security_groups = (known after apply)<br /> + subnet_id = "subnet-14321c874d6d35c6a"<br /> }<br /><br />Plan: 1 to add, 0 to change, 0 to destroy.</span></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;">After applying this change, we can check again Network settings for EFS where we'll see that mount target is now available:</div><div style="text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDltue62PciODFPNil1Lh1IMzEbqTwIZS3kra0Y5j1Ub4uS_Rt-lsOaxbKqvwgumrUIsdipzA2dML0VQW-7ptTUAFnVRrCTwl6Ui9YeJS4qYEq6XCwbl1NU7fKoYDa8qpbMLxv55VgdqyMrES8XoBE3gSwozRKEeDXnHqqCq4qMz0CDcSNSxP6jw37/s1592/Screenshot%20from%202023-03-10%2017-18-45.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="282" data-original-width="1592" height="114" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDltue62PciODFPNil1Lh1IMzEbqTwIZS3kra0Y5j1Ub4uS_Rt-lsOaxbKqvwgumrUIsdipzA2dML0VQW-7ptTUAFnVRrCTwl6Ui9YeJS4qYEq6XCwbl1NU7fKoYDa8qpbMLxv55VgdqyMrES8XoBE3gSwozRKEeDXnHqqCq4qMz0CDcSNSxP6jw37/w640-h114/Screenshot%20from%202023-03-10%2017-18-45.png" width="640" /></a></div><div style="text-align: left;"> </div><div style="text-align: left;"> </div><div style="text-align: left;">The next step will be mounting EFS onto EC2 instance. <br /></div><div style="text-align: left;"> </div><div style="text-align: left;"><h2 style="text-align: left;">Resources:</h2></div><div style="text-align: left;"> </div><div style="text-align: left;"><a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/efs_file_system">aws_efs_file_system | Resources | hashicorp/aws | Terraform Registry</a> </div><div style="text-align: left;"><a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/efs_mount_target " rel="nofollow" target="_blank">aws_efs_mount_target | Resources | hashicorp/aws | Terraform Registry</a></div>Bojan Komazechttp://www.blogger.com/profile/05437236807206825832noreply@blogger.com0tag:blogger.com,1999:blog-4912226416400969049.post-16066285023116554732023-03-10T13:48:00.001+00:002023-03-10T13:48:10.421+00:00File System Performance Metrics<p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmvApPkKJNL64NVQ0norPGFcczeWvnjetp9nn9BYmwOmFg0BZHcs39aEaFEvYC0ZZTI9UHY9y0BZTJmZ2jY1afrvBSP6he3eOk1Bysvj4Mpbqwm3tMD0uutJmgWEyWb3m0J-02AyWuEeXo9aAfzfniRlI42JuQjyVH0nusUPjgYa1s6cvN-lnGe9uO/s624/image-11.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="302" data-original-width="624" height="310" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmvApPkKJNL64NVQ0norPGFcczeWvnjetp9nn9BYmwOmFg0BZHcs39aEaFEvYC0ZZTI9UHY9y0BZTJmZ2jY1afrvBSP6he3eOk1Bysvj4Mpbqwm3tMD0uutJmgWEyWb3m0J-02AyWuEeXo9aAfzfniRlI42JuQjyVH0nusUPjgYa1s6cvN-lnGe9uO/w640-h310/image-11.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">image source: https://www.dnsstuff.com/latency-throughput-bandwidth<br /></td></tr></tbody></table><br /> </p><div style="text-align: left;"> </div><div style="text-align: left;">File system performance is measured by:</div><ul style="text-align: left;"><li><b>Latency</b></li><ul><li>delay between request and response</li><li>a measure of the length of time it takes for a single I/O request to be completed from the application's point of view <br /></li><li>measured separately for read (usually in microseconds) and write (usually in milliseconds) operations</li><ul><li>If
the I/O is a data read, latency is the time it takes for the data to
come back. If the I/O is a write, latency is the time for the write
acknowledgement to return.</li></ul><li>affects application's acceleration<br /></li></ul><li><b>Throughput / Bandwidth<br /></b></li><ul><li>measures how many units of information a system can process in a period of time</li><li>describes the <u>amount of data</u> able to flow through a point in the data path <u>over a given time</u></li><li>throughput and latency are often competing goals - the lower the latency, the higher the throughput<br /></li><li>measured separately for file system read (usually in GiBps) and file system write (usually in MiBps) operations </li><li>typically the best storage metric when measuring data that needs to be streamed rapidly, such as images and video files. <br /></li></ul><li><b>Input/Output operations per second (IOPS)</b></li><ul><li>number of I/O operations per second</li><li>measured separately for read and write operations <br /></li><li>as the number of IOPS requested from the device increases the latency will increase</li><li>affects application's scalability <br /></li></ul></ul>Bojan Komazechttp://www.blogger.com/profile/05437236807206825832noreply@blogger.com0tag:blogger.com,1999:blog-4912226416400969049.post-24362558209468558932023-03-09T17:10:00.033+00:002023-12-04T15:10:29.010+00:00Amazon Elastic File System (EFS)<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSkKY9fx-IvNhYGlcDAsWGrAeg5B_l_WeLzUAgLzfkk8Cgdj1P1Qz8abMzsq4XCWSR2BA0522mCG9vgCCqtVa07AaNOxU6OAvRGen1nXQBwsbjvJzkw5eT1JgJAKKZSC-FPxGdf5UNcLsMC1YPni4MYUHmA5ADKYVgBleca5BA6MPiGMpYpVqduAXx/s810/Screenshot%20from%202023-03-09%2012-02-10.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="810" data-original-width="775" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSkKY9fx-IvNhYGlcDAsWGrAeg5B_l_WeLzUAgLzfkk8Cgdj1P1Qz8abMzsq4XCWSR2BA0522mCG9vgCCqtVa07AaNOxU6OAvRGen1nXQBwsbjvJzkw5eT1JgJAKKZSC-FPxGdf5UNcLsMC1YPni4MYUHmA5ADKYVgBleca5BA6MPiGMpYpVqduAXx/w613-h640/Screenshot%20from%202023-03-09%2012-02-10.png" width="613" /> </a></div><div class="separator" style="clear: both; text-align: center;"> </div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">From <a href="https://linuxize.com/post/how-to-mount-an-nfs-share-in-linux/">How to Mount an NFS Share in Linux | Linuxize</a>:</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><div class="separator" style="clear: both;"></div><blockquote><div class="separator" style="clear: both;"><i><b>Network File System (NFS)</b> is a <u>distributed file system</u> protocol that allows you to share <u>remote directories</u> over a network. With NFS, you can mount remote directories on your system and work with the remote files as if they were local files.</i></div><div class="separator" style="clear: both;"><i><br /></i></div><div class="separator" style="clear: both;"><i>On Linux and UNIX operating systems, you can use the mount command (see </i></div><a href="https://manpages.ubuntu.com/manpages/xenial/en/man8/mount.8.html">Ubuntu Manpage: mount - mount a filesystem</a><i>) to mount a shared NFS directory on a particular mount point in the local directory tree.</i></blockquote><div class="separator" style="clear: both;"></div><div class="separator" style="clear: both;"><br /></div><div class="separator" style="clear: both;"><a href="https://www.linode.com/docs/guides/mount-file-system-on-linux/#mount-a-remote-file-system">How to Mount a File System on Linux | Linode Docs</a></div><div class="separator" style="clear: both;"><br /></div></div><div class="separator" style="clear: both; text-align: left;"> <br /></div><div class="separator" style="clear: both; text-align: left;"><b>Amazon Elastic File System (EFS)</b> is:</div><ul style="text-align: left;"><li>one such shared, remote, network directory that can be mounted to Unix/Linux OS</li><li><b>cloud-native</b> data store</li><li><b>shared</b> file storage - can be accessed by multiple computers at the same time</li><ul><li>can be made available to <u>VPC</u></li><ul><li>EC2 instances can then securely mount EFS to store and access data</li><li>applications running on multiple EC2 instances can access the EFS at the same time<br /></li></ul><li>EFS
can also be mounted on <u>on-premises data center</u> servers when connected
to Amazon VPC with AWS Direct Connect or VPN making it easy to:</li><ul><li>migrate data to EFS</li><li>enable cloud bursting</li><li>back up on-premises data to EFS</li></ul></ul><li>supports <b>low latency</b> applications and also highly-parallelized scale out jobs requiring <b>high throughput</b> (read here what's the difference between latency and throughput: <a href="https://www.bojankomazec.com/2023/03/file-system-performance-metrics.html" rel="nofollow" target="_blank">File System Performance Metrics | My Public Notepad</a>)<br /></li><li><b>high throughput</b></li><ul><li>throughput for a file system scales automatically as capacity grows</li><li>for workloads with high throughput and low capacity requirements, throughput can be provisioned independent of capacity </li></ul><li>there are 2 storage classes: </li><ul><li><b>Standard</b></li><li><b>EFS IA</b> (<b>Infrequent Access</b>) - for less frequently accessed data we can configure EFS to store data in a cost-optimized IA storage class</li><ul><li><b>LifeCycle Management</b> automatically and transparently moves files access less frequently to EFS IA<br /></li></ul></ul><li>has 2 performance modes so we can tailor EFS to our application needs</li><ul><li>General Purpose</li><li>Max I/O<br /></li></ul></ul><div style="text-align: left;"> </div><h2 style="text-align: left;">Benefits of using EFS</h2><ul style="text-align: left;"><li>file storage system which is:<br /></li><ul><li><b>simple</b> - supports Network File System (NFS) versions 4.0 and 4.1 (NFSv4)
protocol. This means that computers can access files on EFS by using
standard file system tools and interfaces provided by OS. This is the reason why <span style="font-family: courier;">nfs</span> is specified as the filesystem type supported by kernel when using <a href="https://man7.org/linux/man-pages/man8/mount.8.html" rel="nofollow" target="_blank"><span style="font-family: courier;">mount</span> command</a> to mount EFS device on the EC2 instance (<span style="font-family: courier;">mount -t nfs ...</span>). <br /></li><li><b>serverless</b> - no need to provision infrastructure<br /></li><li><b>scalable performance</b> - lifecycle management<br /></li><li><b>elastic</b> - automatically grow or shrink as we add/remove files</li><ul><li>can grow to petabytes (PB)</li></ul></ul><li>fully managed - no need to manage it<br /></li><li>easy to set up via AWS Management Console, API or CLI</li><ul><li>"set and forget" </li></ul><li>cost-effective data store: you pay for the storage you use</li><li>access data securely, via existing AWS security infrastructure (IAM) <br /></li></ul><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6JGP4lQRWi8hasoT-8UhEjk_jAdu1PQM2geQLeG0zWUtFub92O-adXA9qQuVfcL-lR7_P0Ax9Hw4ZnH0Q3jPtvjaQ63eSX6P098y1LERCt0Kd-Oqkn5CRXeXTlaloJVV_uD5I03Gz7acP8ZALOGQagiON0H6IKQLpBXnW9HX-Wm6xVTdkzK_iVsYm/s1200/AWS_Simple_Icons_Storage_Amazon_EBS.svg.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1200" data-original-width="1200" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6JGP4lQRWi8hasoT-8UhEjk_jAdu1PQM2geQLeG0zWUtFub92O-adXA9qQuVfcL-lR7_P0Ax9Hw4ZnH0Q3jPtvjaQ63eSX6P098y1LERCt0Kd-Oqkn5CRXeXTlaloJVV_uD5I03Gz7acP8ZALOGQagiON0H6IKQLpBXnW9HX-Wm6xVTdkzK_iVsYm/s320/AWS_Simple_Icons_Storage_Amazon_EBS.svg.png" width="320" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><i>EFS symbol</i><br /></td></tr></tbody></table><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><h2>Drawbacks of EFS</h2><div style="text-align: left;"><ul style="text-align: left;"><li>supports Linux only (it doesn't support Windows)</li></ul><p> </p></div><h2>When to use EFS?</h2></div><div class="separator" style="clear: both; text-align: left;"><ul style="text-align: left;"><li><div class="separator" style="clear: both; text-align: left;">when thousands of EC2 instances from multiple availability zones or on-premises servers need concurrently to access data </div></li><ul><li>EFS provides concurrent access for tens of thousands of connections for EC2 instances, containers and lambda functions <br /></li></ul><li>designed for <b>high availability</b> and <b>durability</b>, for storing data redundantly across multiple (3) availability zones</li><li>ideal for machine learning, analytics, web serving, content management, media storage, DB backups<br /></li></ul></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><h2>How to create EFS?</h2></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">In AWS Console, go to EFS and click on <i>Create file system</i>.<br /></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw1rbiePob4jfpN1jMviQyaD-hZRu8k_wjCuPiHTtNLy9UFvBi7exy2r3vut041PFFhoa6x4bi7td0VAD4ttCm1R4kMTjw4_xb1m2kLvhyHX3KhaLXKT1ov4NygJPdcWkMSQYEqNXLFtEKwc5Aho7letNaBqNbXG21MesXMYSj9gGbQf-ni7EdAz3r/s1557/Screenshot%20from%202023-03-09%2015-19-32.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="984" data-original-width="1557" height="404" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjw1rbiePob4jfpN1jMviQyaD-hZRu8k_wjCuPiHTtNLy9UFvBi7exy2r3vut041PFFhoa6x4bi7td0VAD4ttCm1R4kMTjw4_xb1m2kLvhyHX3KhaLXKT1ov4NygJPdcWkMSQYEqNXLFtEKwc5Aho7letNaBqNbXG21MesXMYSj9gGbQf-ni7EdAz3r/w640-h404/Screenshot%20from%202023-03-09%2015-19-32.png" width="640" /></a></div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;"> We can then set:</div><div class="separator" style="clear: both; text-align: left;"><ul style="text-align: left;"><li><b>Name</b> of our file system</li><li><b>VPC</b> where we want EC2 instances to connect to our file system</li><li><b>Storage class</b> [<a href="https://docs.aws.amazon.com/efs/latest/ug/storage-classes.html">EFS storage classes - Amazon Elastic File System</a>]</li><ul><li><b>Standard</b> (AWS used to name this <i>Regional</i>) - Stores data redundantly across multiple AZs (recommended)</li><li><b>One Zone</b> - Stores data redundantly within a single AZ</li><ul><li>we need to select desired availability zone<br /></li></ul></ul></ul><p> </p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvQco6cLfk6t1RYsd5qwSo4vbwul2POr7iYTBBdcrcLzVRy-FShPl7579fGcr2KAio-m1W76GQZPBfIiO3Ty75ryOahS93_I8WHDo9850DVdua7NM2yw9VbW2eHQG6xdn3bcqRqlrNQT4NmhHcKwxHX2S6IgPtyI213K4WvdtoJqpPer2sri6UBtl2/s483/Screenshot%20from%202023-03-09%2016-18-08.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="412" data-original-width="483" height="546" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvQco6cLfk6t1RYsd5qwSo4vbwul2POr7iYTBBdcrcLzVRy-FShPl7579fGcr2KAio-m1W76GQZPBfIiO3Ty75ryOahS93_I8WHDo9850DVdua7NM2yw9VbW2eHQG6xdn3bcqRqlrNQT4NmhHcKwxHX2S6IgPtyI213K4WvdtoJqpPer2sri6UBtl2/w640-h546/Screenshot%20from%202023-03-09%2016-18-08.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;"><br /></td></tr></tbody></table> <p></p><p>We can customize <b>File system settings</b>:</p></div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;"> <div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsZ97rZUJ1WJxaQ4KDeRm8VJNbLS4ZoA_VlezfgUrvtTMQBEaB1_lTaJ3XS24JYrQaRIJVQi5fZa12BtwsbQnIgvhCD8YgjjFlrh-AO5DbNjxsPiZ_khVhNxCgHlvsfydRzzRWGoM22WKP7LqDKd2sV2g7wgsOhVYE-xB4jckraNM6sybKHElQHMfA/s1368/Screenshot%20from%202023-03-09%2016-24-05.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1026" data-original-width="1368" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsZ97rZUJ1WJxaQ4KDeRm8VJNbLS4ZoA_VlezfgUrvtTMQBEaB1_lTaJ3XS24JYrQaRIJVQi5fZa12BtwsbQnIgvhCD8YgjjFlrh-AO5DbNjxsPiZ_khVhNxCgHlvsfydRzzRWGoM22WKP7LqDKd2sV2g7wgsOhVYE-xB4jckraNM6sybKHElQHMfA/w640-h480/Screenshot%20from%202023-03-09%2016-24-05.png" width="640" /></a></div><br /><br /></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">Note that by default Lifecycle management sets that files that haven't been access for 30 days will automatically be transferred from Standard to Standard-Infrequent Access storage (which is cheaper and so this is cost-effective measure).<br /><br /></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">We can then customize <b>Network access</b>:</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5kaM9ohzl8e7v9ouOEMq8_m72vLZHari0nvt-M4a_Y0B_dNGedev2iI2oF38ikRIfu3fkPfajilDLx5ITP_H3BvEsxqTDBUtIAdjzGhwFKv8FnFbiDDAuMaHQsBNO93LFZgdjdVjQVqNl2PXHUSp8ZEkjb1_d-kSmPvuUj2uVVbv7RFBs9lL39Psl/s1765/Screenshot%20from%202023-03-09%2016-24-55.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="939" data-original-width="1765" height="340" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5kaM9ohzl8e7v9ouOEMq8_m72vLZHari0nvt-M4a_Y0B_dNGedev2iI2oF38ikRIfu3fkPfajilDLx5ITP_H3BvEsxqTDBUtIAdjzGhwFKv8FnFbiDDAuMaHQsBNO93LFZgdjdVjQVqNl2PXHUSp8ZEkjb1_d-kSmPvuUj2uVVbv7RFBs9lL39Psl/w640-h340/Screenshot%20from%202023-03-09%2016-24-55.png" width="640" /></a></div><p></p><div class="separator" style="clear: both; text-align: left;">Note
that EFS is an entity connected to a network. EFS has assigned IP
address in each availability zone. It is a <b>mount target</b> that provides an IP address for an NFSv4 endpoint at which we can mount an Amazon EFS file system.</div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;">So mount target provides a network interface (in the selected subnet in the AZ) for EFS mounted at it. </div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;">When mount target state is available, our EFS system is mounted onto mount target and can be referred to via its url (or IP address). </div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">This does not mean it can still be accessible from EC2 instances. We need to mount EFS onto EC2. For that we need to specify a <b>mount point</b> (the local directory on the client where the EFS file system is mounted & accessible). This is one of settings that can be set when launching EC2 from AWS Console (the right-hand value in <i>File system</i> setting). <br /></div><p>We can create a security group for EFS and use it everywhere - for each subnet/AZ. This security group can allow e.g. TCP traffic from anywhere. </p><p>Finally, we can customize <b>File system policy</b>:</p><p><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdPPfviIODasAtRRTR6vp037HqQM9kEPa1wsmogBE0kU5xx7OCxRN_EDDI3oi1RYvSB9mT4uKz4W5slsAXTO5warlcxgM_tGS4Iyr3-mUgkxRvUM5rT00gtds5GFEodkSbyTx88U0m_3EYEQRQijnypDvVm17HvftNy7kgZvMQz2IdBJIz92wjYNjD/s1776/Screenshot%20from%202023-03-09%2016-27-42.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="488" data-original-width="1776" height="176" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdPPfviIODasAtRRTR6vp037HqQM9kEPa1wsmogBE0kU5xx7OCxRN_EDDI3oi1RYvSB9mT4uKz4W5slsAXTO5warlcxgM_tGS4Iyr3-mUgkxRvUM5rT00gtds5GFEodkSbyTx88U0m_3EYEQRQijnypDvVm17HvftNy7kgZvMQz2IdBJIz92wjYNjD/w640-h176/Screenshot%20from%202023-03-09%2016-27-42.png" width="640" /></a></div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">Once EFS is created, it will take some more time for network interfaces to be created.</div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvYFwEag9DbyfGygzuxsx2CH6IsMYzIl7rRaLIEiOV5UVkEs00TTk_HzqxWg23FWEAQh5uj4l7qwZ7ya1FHax50Mj4fORRghgB8zW1EKXuLeNQZLo_qRMeIyeAOaJGNGdEQNAHOpUgnkbEStUp5rGSPmezia-k-CRi_0j0NEdA_JQ0t7xKzjG37HWl/s1223/Screenshot%20from%202023-03-09%2016-40-11.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="543" data-original-width="1223" height="284" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvYFwEag9DbyfGygzuxsx2CH6IsMYzIl7rRaLIEiOV5UVkEs00TTk_HzqxWg23FWEAQh5uj4l7qwZ7ya1FHax50Mj4fORRghgB8zW1EKXuLeNQZLo_qRMeIyeAOaJGNGdEQNAHOpUgnkbEStUp5rGSPmezia-k-CRi_0j0NEdA_JQ0t7xKzjG37HWl/w640-h284/Screenshot%20from%202023-03-09%2016-40-11.png" width="640" /></a></div><br /> </div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><h2 style="text-align: left;">How to mount EFS on EC2 instance?</h2></div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;">When creating EC2, we can select our EFS when setting File systems: <br /></div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhx5Q_HigD0kGRc0JNW6eOg_3tofvCqVQtRfSrC3Tif3ddzYmRSVskxOcn-9O48vt3WDWfC76p_iABA84ra9qF_AFigxYITfBFriSyXApqg7xbbJ7lsFCBZjTVyXnyvGzjREVmnoKOwFQ1aC1wNqJF818K884hNk3XYGSTK3B7B-LpbDfJzzgYvolNY/s1907/Screenshot%20from%202023-03-09%2016-43-44.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="814" data-original-width="1907" height="274" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhx5Q_HigD0kGRc0JNW6eOg_3tofvCqVQtRfSrC3Tif3ddzYmRSVskxOcn-9O48vt3WDWfC76p_iABA84ra9qF_AFigxYITfBFriSyXApqg7xbbJ7lsFCBZjTVyXnyvGzjREVmnoKOwFQ1aC1wNqJF818K884hNk3XYGSTK3B7B-LpbDfJzzgYvolNY/w640-h274/Screenshot%20from%202023-03-09%2016-43-44.png" width="640" /></a></div><br /> </div><div class="separator" style="clear: both; text-align: left;">We also need to add EFS security group to the list of security groups used by this EC2 instance.<br /></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">Once our EC2 instance is up and running, we can SSH to it and check mounted file systems with df tool:</div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;"><span style="color: #38761d; font-family: courier;">$ <b>df -T -h</b></span></div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;">-T - display file system types (Type column) <br /></div><div class="separator" style="clear: both; text-align: left;">-h - display information about disk drives in human-readable format (kilobytes, megabytes, gigabytes and so on)<br /></div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDNV8cHKuMP7H1IitLeUiGYPYoecFhRxviVa9bEAyrkmUemszkR6daCYxwuqlIQri8i9izPdZstq-2HkpXdRjeozsK9R1yuKdpgu2XI9E6bYl_GHZgv-31DHFtpSOW2b4RffsQxrUkb91BdNylx91tT66bPv09wUzg8kGw5h8jFBc3XVuIVtjba_OS/s953/Screenshot%20from%202023-03-09%2016-50-10.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="566" data-original-width="953" height="380" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDNV8cHKuMP7H1IitLeUiGYPYoecFhRxviVa9bEAyrkmUemszkR6daCYxwuqlIQri8i9izPdZstq-2HkpXdRjeozsK9R1yuKdpgu2XI9E6bYl_GHZgv-31DHFtpSOW2b4RffsQxrUkb91BdNylx91tT66bPv09wUzg8kGw5h8jFBc3XVuIVtjba_OS/w640-h380/Screenshot%20from%202023-03-09%2016-50-10.png" width="640" /></a></div><br /><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><h2 style="text-align: left;">Resources:</h2></div><div class="separator" style="clear: both; text-align: left;"><a href="https://aws.amazon.com/efs/" rel="nofollow" target="_blank">Amazon EFS</a></div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;"><a href="http://web.cs.ucla.edu/classes/winter13/cs111/scribe/10c/" rel="nofollow" target="_blank">Lecture 10 - File System Performance</a><br /><br /></div><div class="separator" style="clear: both; text-align: left;"><a href="https://docs.aws.amazon.com/efs/index.html" rel="nofollow" target="_blank">Amazon Elastic File System Documentation</a><br /> <br /></div><div class="separator" style="clear: both; text-align: left;"><a href="https://en.wikipedia.org/wiki/Amazon_Elastic_File_System" rel="nofollow" target="_blank">Amazon Elastic File System - Wikipedia</a></div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;"><a href="https://docs.aws.amazon.com/efs/latest/ug/performance.html" rel="nofollow" target="_blank">Amazon EFS performance - Amazon Elastic File System</a><br /></div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;"><a href="https://docs.aws.amazon.com/efs/latest/ug/accessing-fs.html" rel="nofollow" target="_blank">Creating and managing mount targets and security groups - Amazon Elastic File System<br /></a> </div><div class="separator" style="clear: both; text-align: left;"><a href="https://repost.aws/questions/QUt_v7IhMKQpOdai2fJ9UPAA/efs-mount-point-vs-access-point" rel="nofollow" target="_blank">EFS mount point vs access point | AWS re:Post</a> <br /></div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;"><a href="https://docs.aws.amazon.com/efs/latest/ug/mounting-fs-mount-helper-ec2-linux.html" rel="nofollow" target="_blank">Mounting on Amazon EC2 Linux instances using the EFS mount helper - Amazon Elastic File System</a></div><div class="separator" style="clear: both; text-align: left;"></div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;"><a href="https://www.youtube.com/watch?v=yKhE2hzlbqA" rel="nofollow" target="_blank">AWS EFS Tutorial | Amazon Elastic File System | AWS Storage Services | AWS Training | Edureka - YouTube</a><br /></div><div class="separator" style="clear: both; text-align: left;"><br /><a href="https://docs.aws.amazon.com/efs/latest/ug/how-it-works.html" rel="nofollow" target="_blank">Amazon EFS: How it works - Amazon Elastic File System</a></div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;"><a href="https://docs.aws.amazon.com/efs/latest/ug/efs-different-vpc.html" rel="nofollow" target="_blank">Walkthrough: Mount a File System from a Different VPC - Amazon Elastic File System</a> <br /></div>Bojan Komazechttp://www.blogger.com/profile/05437236807206825832noreply@blogger.com0tag:blogger.com,1999:blog-4912226416400969049.post-36279382981466121712023-03-08T13:17:00.003+00:002023-03-13T17:33:56.062+00:00AWS EC2 Auto Scaling with Terraform<p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjr-3pgfnfqrJizbdR7Uefx83UeGzMoC01Hp5jmWXmsSj_tmXYZ6D648TpMsKcb5yTMNaecFK0z_IKn4vt0HcCb5pPzA5x6BBofCI7WSuUWsHw1RekqwhAjuV0i3rbtKtHHinzm188Wsh197XtRxntBk7HLe-gZ2nuS01PJJ3XbFOXwcEv4M53zxBlO/s684/aws-tf-vert.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="435" data-original-width="684" height="408" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjr-3pgfnfqrJizbdR7Uefx83UeGzMoC01Hp5jmWXmsSj_tmXYZ6D648TpMsKcb5yTMNaecFK0z_IKn4vt0HcCb5pPzA5x6BBofCI7WSuUWsHw1RekqwhAjuV0i3rbtKtHHinzm188Wsh197XtRxntBk7HLe-gZ2nuS01PJJ3XbFOXwcEv4M53zxBlO/w640-h408/aws-tf-vert.png" width="640" /></a></div><br /><p></p><p><a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/autoscaling_group">aws_autoscaling_group | Resources | hashicorp/aws | Terraform Registry</a> <br /></p><p>The minimum implementation that will pass <span style="font-family: courier;">terraform plan</span> checks is: <br /></p><p><span style="color: #38761d; font-family: courier;">resource "aws_autoscaling_group" "my_app" {<br /> min_size = 1<br /> max_size = 1<br />}</span></p><p><span style="font-family: courier;">terraform plan</span> output:<br /></p><p><span style="color: #38761d; font-family: courier;">An execution plan has been generated and is shown below.<br />Resource actions are indicated with the following symbols:<br /> + create<br /><br />Terraform will perform the following actions:<br /><br /> # aws_autoscaling_group.my_app will be created<br /> + resource "aws_autoscaling_group" "my_app" {<br /> + arn = (known after apply)<br /> + availability_zones = (known after apply)<br /> + default_cooldown = (known after apply)<br /> + desired_capacity = (known after apply)<br /> + force_delete = false<br /> + force_delete_warm_pool = false<br /> + health_check_grace_period = 300<br /> + health_check_type = (known after apply)<br /> + id = (known after apply)<br /> + max_size = 1<br /> + metrics_granularity = "1Minute"<br /> + min_size = 1<br /> + name = (known after apply)<br /> + protect_from_scale_in = false<br /> + service_linked_role_arn = (known after apply)<br /> + vpc_zone_identifier = (known after apply)<br /> + wait_for_capacity_timeout = "10m"<br /> }</span></p><p> </p><p>If we try to run <span style="font-family: courier;">terraform apply</span>, we'll get the following error:</p><p><span style="color: red; font-family: courier;">Error: One of `launch_configuration`, `launch_template`, or `mixed_instances_policy` must be set for an Auto Scaling Group</span> </p><p> </p><h3 style="text-align: left;">Using Launch Configuration for defining EC2 <br /></h3><p>Let's use a launch configuration (despite AWS discouraging the use of launch configurations in favour of launch templates; example with launch template is further down in this article). <br /></p><p>We need to know the ID of the AMI we want to use. We'll choose the latest Amazon Linux 2 image, of t2.micro type which allows free tier.</p><p><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEil1mWN8ErwNEhEznyC2GDUbpypSDlqXizOem4O1GINh7jl-EUBcyW5h84Rf3rKNgv2ixSPbzWNizmrIjVZxUC-FvtPAYgZC4UnJfENM7WoJsAoq4lXWYVTYJZRYqb8A6PMZcbGhJnfya5o_nD885aMj6RSC5aeXJG9gTdubB0jXuchCmjoG5WwuRhR/s1781/Screenshot%20from%202023-03-08%2012-59-24.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1036" data-original-width="1781" height="372" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEil1mWN8ErwNEhEznyC2GDUbpypSDlqXizOem4O1GINh7jl-EUBcyW5h84Rf3rKNgv2ixSPbzWNizmrIjVZxUC-FvtPAYgZC4UnJfENM7WoJsAoq4lXWYVTYJZRYqb8A6PMZcbGhJnfya5o_nD885aMj6RSC5aeXJG9gTdubB0jXuchCmjoG5WwuRhR/w640-h372/Screenshot%20from%202023-03-08%2012-59-24.png" width="640" /></a></div><br /><p>If we select it, the next page will show its ID:</p><p><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtgUO285hJ6o5-l-_SWW_gMfck4zABX39m09MradV-DRtkecLAzkur6uuNbrB1t5Qnk_Th5Jmo-m5UN_pYqMEVru3i-tXi4pzFLjrawDvytCKjVytabCGog8mxDq49nAiF0mhRJrvwTrekGgOMqxGEHjEy5_zG1dqoYnPitizunidEsuI4apk65DkR/s1036/Screenshot%20from%202023-03-08%2013-04-00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1036" data-original-width="1008" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtgUO285hJ6o5-l-_SWW_gMfck4zABX39m09MradV-DRtkecLAzkur6uuNbrB1t5Qnk_Th5Jmo-m5UN_pYqMEVru3i-tXi4pzFLjrawDvytCKjVytabCGog8mxDq49nAiF0mhRJrvwTrekGgOMqxGEHjEy5_zG1dqoYnPitizunidEsuI4apk65DkR/w622-h640/Screenshot%20from%202023-03-08%2013-04-00.png" width="622" /></a></div><p><br /></p><p>Terraform resource we'll use is <a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/launch_configuration">aws_launch_configuration | Resources | hashicorp/aws | Terraform Registry</a>.</p><p><span style="color: #38761d; font-family: courier;"> </span></p><p><span style="color: #38761d; font-family: courier;"># EC2 >> Launch configurations<br />resource "<b>aws_launch_configuration</b>" "my-app" {<br /> name = "my-app"<br /> image_id = "ami-006dcf34c09e50022"<br /> instance_type = "t2.micro"<br />}</span><br /></p><p>We can now update our auto scaling group:</p><div style="text-align: left;"><span style="color: #38761d; font-family: courier;">resource "aws_autoscaling_group" "</span><span style="color: #38761d; font-family: courier;">my-app</span><span style="color: #38761d; font-family: courier;">" {</span></div><div style="text-align: left;"><span style="color: #38761d; font-family: courier;"> min_size = 1</span></div><div style="text-align: left;"><span style="color: #38761d; font-family: courier;"> max_size = 1</span></div><div style="text-align: left;"><span style="color: #38761d; font-family: courier;"> name = "</span><span style="color: #38761d; font-family: courier;">my-app</span><span style="color: #38761d; font-family: courier;">"</span></div><div style="text-align: left;"><span style="color: #38761d; font-family: courier;"> <b>launch_configuration</b> = aws_launch_configuration.</span><span style="color: #38761d; font-family: courier;">my-app</span><span style="color: #38761d; font-family: courier;">.name</span></div><div style="text-align: left;"><span style="color: #38761d; font-family: courier;">} </span></div><p><span style="font-family: courier;"> </span></p><p><span style="font-family: courier;">terraform apply</span> still complains:</p><p><span style="color: red; font-family: courier;">Error: Error creating Auto Scaling Group: ValidationError: At least one Availability Zone or VPC Subnet is required.<br /> status code: 400, request id: ad34ea76-a6d5-419a-bc48-0ffb15b4e76f </span></p><p> </p><p>Let's define the subnet which we want our instances to be launched into:<br /></p><p><span style="color: #38761d; font-family: courier;">resource "aws_autoscaling_group" "</span><span style="color: #38761d; font-family: courier;">my-app</span><span style="color: #38761d; font-family: courier;">" {<br /> min_size = 1<br /> max_size = 1<br /> name = "</span><span style="color: #38761d; font-family: courier;">my-app</span><span style="color: #38761d; font-family: courier;">"<br /> launch_configuration = aws_launch_configuration.</span><span style="color: #38761d; font-family: courier;">my-app</span><span style="color: #38761d; font-family: courier;">.name<br /> <b>vpc_zone_identifier</b> = [ "subnet-14321c874d6d35c6a" ]<br />}</span><span style="font-family: courier;"> <br /></span></p><p><span style="font-family: courier;">terraform apply</span> will now create the autoscaling group together with launch configuration. This can be verified by looking at <i>EC2</i> >> <i>Auto Scaling groups</i> and <i>EC2</i> >> <i>Launch configurations</i>. And most importantly, auto scaling group will launch the new EC2 instance, in subnet we denoted in the configuration. This instance can be found in <i>EC2</i> >> <i>Instances</i>.<br /></p><p> </p><h3 style="text-align: left;">Using Launch Template for defining EC2 <br /></h3><p>AWS discourages the use of launch
configurations in favour of launch templates. </p><p>Terraform resource is <a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/launch_template " rel="nofollow" target="_blank">aws_launch_template | Resources | hashicorp/aws | Terraform Registry</a>. Its description says:</p><p></p><blockquote><i>Provides an EC2 launch template resource. Can be used to create instances or <u>auto scaling groups</u>.</i></blockquote><p></p><p>Here are the key differences between launch templates (LT) and launch configuration (LC):</p><ul style="text-align: left;"><li>LT have more EC2 options than LC <br /></li><li>LT are getting latest features from Amazon EC2</li><li>LC are still supported but are not getting the latest EC2 features</li><li>LC is immutable (resource can't be edited; if we want to change it, we need to destroy it first and then re-create it)</li><li>LT can be edited and updated <br /></li><li>LT can have multiple versions which allows creation of parameter subsets (<i>With versioning, you can create a subset of the full set of parameters and then reuse it to create other templates or template versions.</i> - Partial configuration for reuse and inheritance)</li><li>LT allows using T2 unlimited burst credit option</li><li>LT allows provisioning using both On-demand and Spot Instances.</li><li>LT can be used to launch a standalone instance using AWS Console, SDK and CLI.<br /></li></ul><p><br /></p><p></p><p>...<br /><br /></p><p> </p><p>---<br /></p>Bojan Komazechttp://www.blogger.com/profile/05437236807206825832noreply@blogger.com0tag:blogger.com,1999:blog-4912226416400969049.post-30222532738922601692023-02-27T14:16:00.005+00:002023-02-27T15:04:57.502+00:00AWS NAT Gateway<p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZ8Rl_fkGL0W5hjxJU3oHKNFCYgyigD3JBoGQ-_9hSwqYpo7dOEUbdYBtvX7tkesCEotkcwmxlvpOtqhd-qJA_Di79eFh9e_W1aHMEZvOfXEOeQxaZYitmetz6rJBsFXiJ6laY7o0KmZAJa-Z75YMbCX2ol7KjCN9pSstWKWtYWQZCG0eNI4mQNgm_/s300/vpc-nat-gateway.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="300" data-original-width="300" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZ8Rl_fkGL0W5hjxJU3oHKNFCYgyigD3JBoGQ-_9hSwqYpo7dOEUbdYBtvX7tkesCEotkcwmxlvpOtqhd-qJA_Di79eFh9e_W1aHMEZvOfXEOeQxaZYitmetz6rJBsFXiJ6laY7o0KmZAJa-Z75YMbCX2ol7KjCN9pSstWKWtYWQZCG0eNI4mQNgm_/w640-h640/vpc-nat-gateway.jpg" width="640" /></a></div><br /><p></p><h1 style="text-align: left;">What is NAT? <br /></h1><p>From AWS documentation: <br /></p><p></p><blockquote><p><i>A Network Address Translation (NAT) gateway is a device that <u>forwards traffic from private subnets to other networks</u>.<br /><br />There are two types of NAT gateways:<br /></i></p><ul style="text-align: left;"><li><i><b>Public</b>: Instances in private subnets can connect to the internet but cannot receive unsolicited inbound connections from the internet.</i></li><li><i><b>Private</b>: Instances in private subnets can connect to other VPCs or your on-premises network.</i></li></ul><p style="text-align: left;"><i>Each private or public NAT gateway must have a <b>private IPv4 address</b> assigned to it. Each public NAT gateway must also have an <b>elastic IP (EIP)</b> address (which is <b>static public address</b> associated with your AWS account) associated with it. Choosing a private IPv4 address is optional. If you don't choose a private IPv4 address, one will be automatically assigned to your NAT gateway at random from the subnet that your NAT gateway is in. You can configure a custom private IPv4 address in Additional settings.<br /><br />After you create the NAT gateway, you must update the <b>route table</b> that’s associated with the <b>subnet</b> you chose for the NAT gateway. If you create a public NAT gateway, you must add a route to the route table that directs traffic destined for the internet to the NAT gateway. If you create a private NAT gateway, you must add a route to the route table that directs traffic destined for another VPC or your on-premises network to the NAT gateway.</i></p></blockquote><p style="text-align: left;"></p><p> </p><h1 style="text-align: left;">When to use NAT?<br /></h1><p><br /></p><p>From AWS documentation:<br /></p><p></p><blockquote><i>The instances in the public subnet can send outbound traffic directly to the internet, whereas the instances in the private subnet can't. Instead, the <u>instances in the private subnet can access the internet by using a network address translation (NAT) gateway that resides in the public subnet</u>. The database servers can connect to the internet for software updates using the NAT gateway, but the internet cannot establish connections to the database servers.</i></blockquote><p></p><p> </p><p>Note that NAT is required if instances in private subnet need to send a request (initiate a new connection) to the host in Internet. If request has reached private instance (via Application Load Balancer for example), then NAT is not required. See: <a href="https://serverfault.com/questions/986447/can-a-ec2-in-the-private-subnet-sends-traffic-to-the-internet-through-elb-withou">amazon web services - Can a EC2 in the private subnet sends traffic to the internet through ELB without using NAT gateway/instance? - Server Fault</a> </p><p> </p><h1 style="text-align: left;">How to create NAT? <br /></h1><p><br /></p><p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdlcw5PwgfjslQLHQItROnY5mLQWPLi2ShgPUNrQo2CiwZLMDbXpe8TgugY1T6lCbD6-gEHGe4M2Th1Cb6qPoRIPhHFT8DcwU6xzwINqouVEfSkkNPSAr-QoMwmG-2gsRUIEnIVL5LhfRlqxXNNaZoDpKSF1aSm6Q779rRJ55qfrxmXZg9Xn5qbC4b/s853/Screenshot%20from%202023-02-27%2012-32-21.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="853" data-original-width="667" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdlcw5PwgfjslQLHQItROnY5mLQWPLi2ShgPUNrQo2CiwZLMDbXpe8TgugY1T6lCbD6-gEHGe4M2Th1Cb6qPoRIPhHFT8DcwU6xzwINqouVEfSkkNPSAr-QoMwmG-2gsRUIEnIVL5LhfRlqxXNNaZoDpKSF1aSm6Q779rRJ55qfrxmXZg9Xn5qbC4b/s16000/Screenshot%20from%202023-02-27%2012-32-21.png" /></a></p><p></p><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: left;"><p> </p><blockquote><i>Private NAT gateway traffic can't reach the internet.</i></blockquote></div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;">From AWS documentation about <b>Additional settings</b>:</div><div class="separator" style="clear: both; text-align: left;"> <br /></div><div class="separator" style="clear: both; text-align: left;"><blockquote><i>When assigning private IPv4 addresses to a NAT gateway, choose how you want to assign them:<br /><br /></i><ul style="text-align: left;"><li><i>Auto-assign: AWS automatically chooses a primary private IPv4 address and you choose if you want AWS to assign up to 7 secondary private IPv4 addresses to assign to the NAT gateway. AWS automatically chooses and assigns them for you at random from the subnet that your NAT gateway is in.</i></li><li><i>Custom: Choose the primary private IPv4 address and up to 7 secondary private IPv4 addresses to assign to the NAT gateway.</i></li></ul></blockquote><blockquote><blockquote><i>You can assign up to 8 private IPv4 addresses to your private NAT gateway. The first IPv4 address that you assign will be the primary IPv4 address, and any additional addresses will be considered secondary IPv4 addresses. Choosing private IPv4 addresses is optional. If you don't choose a private IPv4 address, one will be automatically assigned to your NAT gateway. You can configure custom private IPv4 addresses in Additional settings. <br /></i></blockquote></blockquote><blockquote><div style="text-align: left;"><i>Secondary IPv4 addresses are optional and should be assigned or allocated when your workloads that use a NAT gateway exceed 55,000 concurrent connections to a single destination (the same destination IP, destination port, and protocol). Secondary IPv4 addresses increase the number of available ports, and therefore they increase the limit on the number of concurrent connections that your workloads can establish using a NAT gateway.<br /><br />You can use the NAT gateway CloudWatch metrics ErrorPortAllocation and PacketsDropCount to determine if your NAT gateway is generating port allocation errors or dropping packets. To resolve this issue, add secondary IPv4 addresses to your NAT gateway.You can assign up to 8 private IPv4 addresses to your private NAT
gateway. The first IPv4 address that you assign will be the primary IPv4
address, and any additional addresses will be considered secondary IPv4
addresses. Choosing private IPv4 addresses is optional. If you don't
choose a private IPv4 address, one will be automatically assigned to
your NAT gateway. You can configure custom private IPv4 addresses in
Additional settings.<br /></i><div><i>Secondary IPv4 addresses are optional and
should be assigned or allocated when your workloads that use a NAT
gateway exceed 55,000 concurrent connections to a single destination
(the same destination IP, destination port, and protocol). Secondary
IPv4 addresses increase the number of available ports, and therefore
they increase the limit on the number of concurrent connections that
your workloads can establish using a NAT gateway.<br /><br /></i></div></div><div></div></blockquote></div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;">Here are some typical architectures that include NAT:</div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;"><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI4WhuLRrPOkHeuXdVOR7qZbBF0YuiU8pZQ1B2MolWQlxjQTIUKxaZYOaP8JXUEmSa2Q8RcGRfMon8fFbcwLKKM-Xy7XFiNFirSB-t3RBiTxnkwq6IcP9jr013Gg-ztN9Io8hSrRSUruN_NtCNmiI5n_U9KYtXpoIEZUwUDEaybN_bC6Q40-8BBZ43/s581/public-nat-gateway-diagram.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="510" data-original-width="581" height="562" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI4WhuLRrPOkHeuXdVOR7qZbBF0YuiU8pZQ1B2MolWQlxjQTIUKxaZYOaP8JXUEmSa2Q8RcGRfMon8fFbcwLKKM-Xy7XFiNFirSB-t3RBiTxnkwq6IcP9jr013Gg-ztN9Io8hSrRSUruN_NtCNmiI5n_U9KYtXpoIEZUwUDEaybN_bC6Q40-8BBZ43/w640-h562/public-nat-gateway-diagram.png" title="Source: https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-scenarios.html" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Source: https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-scenarios.html<br /></td></tr></tbody></table><br /> </div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;"><h1 style="text-align: left;">How to associate instances in private subnets with NATs? </h1></div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;">The following diagrams show how <b>routing tables</b> are used to associate instances running in private subnets with NAT gateway created in public subnets thus allowing outbound traffic to Internet.<br /></div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;"><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiWfu82fnIhmCJ659i7QknU36Z-swp6pkdrVUXKG16k4vThxH7STI_FC8VBhhgBXxmqJtbzpXTe_pDKrrMfohsgC1lN5pFvwLEEcfrKNDQ_WuDyKpXE179Vw6cuajIrSIAh9CCOt7m6nu3zT3QkopR9miIMtBe4HtRV5b0zl1w7Us3R8LZdcoKkNvP/s2788/Ghost-3-x-NAT-Gateway.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1841" data-original-width="2788" height="422" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiWfu82fnIhmCJ659i7QknU36Z-swp6pkdrVUXKG16k4vThxH7STI_FC8VBhhgBXxmqJtbzpXTe_pDKrrMfohsgC1lN5pFvwLEEcfrKNDQ_WuDyKpXE179Vw6cuajIrSIAh9CCOt7m6nu3zT3QkopR9miIMtBe4HtRV5b0zl1w7Us3R8LZdcoKkNvP/w640-h422/Ghost-3-x-NAT-Gateway.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Source: https://www.packetswitch.co.uk/content/images/2020/06/Ghost-3-x-NAT-Gateway.png<br /></td></tr></tbody></table><br /> </div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;"><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiisEf3uSf1EKYuTV0_ruUQnZoNDFCT2cHV0ULIWJGZ1-yI6C-yS8HXRNOK8OhsnEisLYJDN6cG1b7kC7ZqCqTJXgQmmH57JGN148FXdjyXhdTxjGhvbKbXWz2O5S7Cvw3wlsbVUgj8sXaFAtduDDk3owvrOcY6SwQr8rsLe0KpBhivenYHIj26VIx4/s738/2ihm3.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="559" data-original-width="738" height="484" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiisEf3uSf1EKYuTV0_ruUQnZoNDFCT2cHV0ULIWJGZ1-yI6C-yS8HXRNOK8OhsnEisLYJDN6cG1b7kC7ZqCqTJXgQmmH57JGN148FXdjyXhdTxjGhvbKbXWz2O5S7Cvw3wlsbVUgj8sXaFAtduDDk3owvrOcY6SwQr8rsLe0KpBhivenYHIj26VIx4/w640-h484/2ihm3.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Source: https://serverfault.com/questions/854475/aws-nat-gateway-in-public-subnet-why</td></tr></tbody></table></div><div class="separator" style="clear: both; text-align: left;"><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td class="tr-caption" style="text-align: center;"><br /></td><td class="tr-caption" style="text-align: center;"><br /></td><td class="tr-caption" style="text-align: center;"><br /></td></tr></tbody></table></div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;"><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl_0iyyH-FkWUBfl4oExPOgS91sCAaBu01YvricwpNJcLvK1RaaZrHodkOOYssGW0zQPo1uJSwL7KISgynanUuZFVXWPxCfIBqYm_R5n526MZU6WH_VwyLz8cMkLZ6aT8rHGGgUI2d16AXpSKuHwIKMUJOeAj5iA1D2pkmSZYyBrPSMLbfTQ_IBLwE/s828/case-2_updated.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="581" data-original-width="828" height="450" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl_0iyyH-FkWUBfl4oExPOgS91sCAaBu01YvricwpNJcLvK1RaaZrHodkOOYssGW0zQPo1uJSwL7KISgynanUuZFVXWPxCfIBqYm_R5n526MZU6WH_VwyLz8cMkLZ6aT8rHGGgUI2d16AXpSKuHwIKMUJOeAj5iA1D2pkmSZYyBrPSMLbfTQ_IBLwE/w640-h450/case-2_updated.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Source: https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Scenario2.html<br /></td></tr></tbody></table><br /> </div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;"><h2 style="text-align: left;">References:</h2></div><div class="separator" style="clear: both; text-align: left;"> <br /></div><div class="separator" style="clear: both; text-align: left;"><a href="https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html" rel="nofollow" target="_blank">NAT gateways - Amazon Virtual Private Cloud</a></div><div class="separator" style="clear: both; text-align: left;"><a href="https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-scenarios.html" rel="nofollow" target="_blank">NAT gateway use cases - Amazon Virtual Private Cloud </a></div><div class="separator" style="clear: both; text-align: left;"><a href="https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Scenario2.html" rel="nofollow" target="_blank">VPC with public and private subnets (NAT) - Amazon Virtual Private Cloud</a></div><div class="separator" style="clear: both; text-align: left;"><a href="https://docs.aws.amazon.com/vpc/latest/userguide/route-table-options.html#route-tables-nat " rel="nofollow" target="_blank">Example routing options - Amazon Virtual Private Cloud</a><br /><br /> <br /><a href="https://serverfault.com/questions/854475/aws-nat-gateway-in-public-subnet-why" rel="nofollow" target="_blank">amazon web services - AWS: NAT Gateway in public subnet. Why? - Server Fault</a><br /></div><p></p>Bojan Komazechttp://www.blogger.com/profile/05437236807206825832noreply@blogger.com0tag:blogger.com,1999:blog-4912226416400969049.post-24479530288630173202023-02-16T17:38:00.003+00:002023-02-17T17:14:11.523+00:00DNS (Domain Name System)<p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhi4v4Hz7SDJFunh84iYlHmuzgu9D1mXV6ULhkZEZGlEmr0kuA4ugmW44MPAldZ5zygH3u-Sn6cIg3Ec_iN0VjDZqvYjUIDfnoFa5JK81vaTuYZdJpHyFOAmUI6iss9kV89YWaIte5HWyp6UzyDyOQzzB8FVTfNNkJU3_OZ93srPM7kWFWQWjGEtzPF/s512/dns.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="512" data-original-width="512" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhi4v4Hz7SDJFunh84iYlHmuzgu9D1mXV6ULhkZEZGlEmr0kuA4ugmW44MPAldZ5zygH3u-Sn6cIg3Ec_iN0VjDZqvYjUIDfnoFa5JK81vaTuYZdJpHyFOAmUI6iss9kV89YWaIte5HWyp6UzyDyOQzzB8FVTfNNkJU3_OZ93srPM7kWFWQWjGEtzPF/s320/dns.png" width="320" /> </a></div><div class="separator" style="clear: both; text-align: center;"> </div><div class="separator" style="clear: both; text-align: center;"> </div><div class="separator" style="clear: both; text-align: center;"> </div><div class="separator" style="clear: both; text-align: left;"><h2>DNS (Domain Name System) </h2></div><div class="separator" style="clear: both; text-align: left;"><ul style="text-align: left;"><li>a protocol, part of the <b>Internet Protocol (IP) Suite</b> <br /></li><li>hierarchical and distributed <u>naming system</u> for computers, services, and other resources in the Internet </li><li>naming <u>database</u> in which internet <b>domain names</b> are located and translated into <b>Internet Protocol (IP) addresses</b> </li><li>translates domain names to IP addresses so browsers can load Internet resources</li><li>helps Internet users and network devices discover websites using human-readable host names, instead of numeric IP addresses; For humans, domain names are a lot easier to remember than a sequence of numbers.<br /></li><li>DNS configuration settings of some website are what allows visitors to still access that website even after it gets moved to a new hosting provider (its IP address will change but domain name will not)<br /></li></ul></div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;">For a hosted web site we need to specify (usually 2) DNS servers. These could be provided by hosting provider but we can specify custom ones e.g. Cloudflare DNS servers. These DNS servers will be nodes in DNS distributed database system which will be providing DNS records about our domains for whoever queries about them. Let's see which DNS records we can set.<br /></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><h2 style="text-align: left;">Common DNS Records</h2></div><p></p><ul style="text-align: left;"><li><b>A (A record, Address record, IPv4 address record)</b></li><ul><li>maps from an IPv4 address to a domain name</li><li>used to point the domain name at one or multiple IP addresses <br /></li><li>also referred to as a host or hostname</li></ul><li><b>AAAA (IPv6 address record)</b> maps domain name to IPv6 address<b><br /></b></li><li><b>CNAME (Canonical Name record)<br /></b></li><ul><li>used to create an alias from one hostname to another</li><li>maps one domain name (an <i>alias</i>) to another (the <i>canonical name</i>)<br /></li><li>Example: example.com has an A record which points to the IP address. If we say "<span style="font-family: courier;">www.example.com</span> is a CNAME to <span style="font-family: courier;">example.com</span>" and "<span style="font-family: courier;">ftp.example.com</span> is a CNAME to <span style="font-family: courier;">example.com</span>" that means that someone accessing <span style="font-family: courier;">www.example.com</span> or <span style="font-family: courier;">ftp.example.com</span> will be pointed to the same IP address that <span style="font-family: courier;">example.com</span> points to. This is useful so that when your IP address changes, you only have to update <span style="font-family: courier;">example.com</span>’s entry (DNS A record for <span style="font-family: courier;">example.com</span>), and <span style="font-family: courier;">www.example.com</span> and <span style="font-family: courier;">ftp.example.com</span> automatically point to the right place.</li><li>If you already have an A record, you will not use a CNAME</li><li>CNAME record tells anyone visiting a subdomain to also use the same DNS records as another domain or subdomain. </li><li>This sort of thing is convenient when running multiple services from a single IP address (e.g. FTP server and web server share the same IP address but different port)<br /></li><li>CNAME records only work for subdomains and must always point to another domain or subdomain and never directly to an IP address.</li><li>When a DNS resolver encounters a CNAME record while looking for a regular resource record, it will restart the query using the canonical name instead of the original name.<br /></li></ul><li><b>MX (Mail eXchanger)</b></li><ul><li>allows you to control the delivery of mail for a given domain or subdomain. In our context, MX records can be set on a host-by-host basis to point to other hosts on the Internet (usually with permanent connections) that are set up to accept and/or route mail for your hostname(s). Setting a backup MX makes the entry you specify a secondary mail exchanger. This means that delivery will be attempted to your host first, and then to the backup host you specify if that fails.</li></ul><li><b>TXT (TXT records) </b></li><ul><li>used to store information. Common uses include SPF, DKIM, etc.</li></ul></ul><p></p><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;">It can take up to 72 hours for setting new DNS records to take effect - while change is replicated across all DNS servers on the internet. (see <a href="https://ns1.com/resources/dns-propagation#:~:text=DNS%20propagation%20is%20the%20time,typically%20takes%20a%20few%20hours.">DNS Propagation</a>)<br /></div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;">The network of DNS servers is hierarchical. Types of DNS servers are:</div><div class="separator" style="clear: both; text-align: left;"><ul style="text-align: left;"><li><b>Recursive resolvers</b> (<b>DNS recursors</b>)</li><ul><li>clients first send to them DNS queries</li><li>they are assigned by ISP but can be set manually:</li><ul><li>Cloudflare 1.1.1.1</li><li>Google (8.8.8.8 and 8.8.4.4)<br /></li></ul><li>they respond either with cached data or send the request to root, TDL and finally to Authoritative nameserver from which they receive IP address</li><li>every recursive resolver knows about 13 (types of) DNS root nameservers <br /></li></ul><li><b>Root nameservers</b></li><ul><li>when receive query about some domain name e.g. example.com they return the address of the TLD nameserver which contains information about the domain extension e.g. .com </li><li>there are over 600 root nameservers which sync among themselves (anycast routing) and all contain the same data <br /></li></ul><li><b>TLD (Top-Level Domain) nameservers</b></li><ul><li>they are domain extension-specific - each of them contains the list of authoritative servers for only a single domain e.g. .com or .ai. </li><li>they return the address of authoritative servers</li><li>Larger TLDs and registrars (like GoDaddy, Namcheap etc...) use an API call to notify the TLD operator of any new registrations and changes<br /></li></ul><li><b>Authoritative nameserver</b></li><ul><li>resolver’s last step in the journey for an IP address</li><li>they are domain-specific - each of them contains the list of IP addresses for a particular doman e.g. ftp.example.com or www.example.com</li><li>they return the IP address for a given hostname or, if domain has a CNAME (alias domain name), resolver needs to repeat the whole process in order to get the IP address for that alias host name.</li><li>when you register your web site, name servers you set for it are authoritative nameservers<br /> </li></ul></ul></div><div class="separator" style="clear: both; text-align: left;"> </div><div class="separator" style="clear: both; text-align: left;"><a href="https://www.cloudflare.com/en-gb/learning/dns/dns-server-types/">DNS server types | Cloudflare</a> <br /></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">To manage DNS records of domain e.g. example.com means setting DNS records for its root and subdomains. For each record we set:</div><div class="separator" style="clear: both; text-align: left;"><ul style="text-align: left;"><li>Type: A, CNAME, MX, ...</li><li>Name: e.g. ftp (for ftp.example.com)</li><li>Content: this is the value which depends on the type e.g. IPv4 address if A record, alias if CNAME etc....</li><li>Proxy status: DNS only (proxy disabled) or Proxied (proxy enabled)<br /></li><li>TTL (Time to Live) - in minutes<br /></li></ul></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;"><h2>Resources:</h2></div><div class="separator" style="clear: both; text-align: left;"><a href="https://en.wikipedia.org/wiki/Domain_Name_System" rel="nofollow" target="_blank">Domain Name System - Wikipedia</a></div><div class="separator" style="clear: both; text-align: left;"><a href="https://en.wikipedia.org/wiki/CNAME_record">CNAME record - Wikipedia</a> </div><div class="separator" style="clear: both; text-align: left;"><a href="https://www.cloudflare.com/en-gb/learning/dns/dns-server-types/">DNS server types | Cloudflare</a> <br /></div><div class="separator" style="clear: both; text-align: left;"><a href="https://www.cloudflare.com/en-gb/learning/dns/glossary/dns-root-server/">DNS root server | Cloudflare</a> <br /></div><div class="separator" style="clear: both; text-align: left;"><a href="https://www.cloudflare.com/en-gb/learning/cdn/glossary/anycast-network/">What is Anycast? | How does Anycast work? | Cloudflare</a> <br /></div><div class="separator" style="clear: both; text-align: left;"><a href="https://serverfault.com/questions/1011611/how-are-dns-name-servers-for-a-tld-updated-when-a-new-domain-is-registered">How are DNS name-servers for a TLD updated when a new domain is registered? - Server Fault</a><br /><a href="https://www.catchpoint.com/blog/domain-name-to-ip-address">DNS Lookup: How a Domain Name is Translated to an IP Address</a></div><div class="separator" style="clear: both; text-align: left;"><a href="https://ns1.com/resources/dns-propagation#:~:text=DNS%20propagation%20is%20the%20time,typically%20takes%20a%20few%20hours.">DNS Propagation</a> <br /></div><br /><p></p>Bojan Komazechttp://www.blogger.com/profile/05437236807206825832noreply@blogger.com0tag:blogger.com,1999:blog-4912226416400969049.post-67519045380577483142023-02-07T14:24:00.002+00:002023-02-07T14:57:40.525+00:00AWS Security Groups<div style="text-align: left;">AWS Security Groups control the <u>inbound</u> and <u>outbound traffic</u> for various AWS resources: </div><div style="text-align: left;"><ul style="text-align: left;"><li>EC2 instance</li><ul><li>running applications e.g. web server</li><li>running as DNS server<br /></li></ul><li>RDS - Database server </li><li>EFS file system</li><li>Elastic Load Balancer</li><li>VPC peering rules<br /></li></ul></div><p> </p><p>Security groups are <u>VPC-specific</u> (and therefore <u>region-specific</u>). They can only be used within the VPC they are created. The exception is where there is a peering connection to another VPC, in which case they can be referred to in the peered VPC. </p><p><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-9eSZts65LEScke4B6exAHuZ0r2gQ2S--xw1IqJcj39nEKVPJsC7RoHrTLzuphho00ZEHKl-4L77wzqYMQlf_b73CgaHfVT0ncWdrO5tjPDYqPNfqLtVvnqIAtt4AbZXzfublPwJUY_J0auGzoMoA-NSwaiaPx-e9-mlaV8YmaCN8LnED3Ur3CMdA/s200/Mikatasa%20Icon%20-%2001.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="200" data-original-width="200" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-9eSZts65LEScke4B6exAHuZ0r2gQ2S--xw1IqJcj39nEKVPJsC7RoHrTLzuphho00ZEHKl-4L77wzqYMQlf_b73CgaHfVT0ncWdrO5tjPDYqPNfqLtVvnqIAtt4AbZXzfublPwJUY_J0auGzoMoA-NSwaiaPx-e9-mlaV8YmaCN8LnED3Ur3CMdA/w400-h400/Mikatasa%20Icon%20-%2001.png" width="400" /></a></div><p>For <b>Security Group</b> we can set:</p><ul><li><b>Name</b></li><li><b>Description</b></li><li><b>VPC</b>. VPC is <u>region-specific</u> so is security group.<br /></li><li><b>Inbound rules</b></li><li><b>Outbound rules</b> <br /></li></ul><div style="text-align: left;"><br /></div><div style="text-align: left;">For <b>Security Group Rule</b> (Inbound or Outbound) we can set:</div><ul style="text-align: left;"><li><b>Type</b>. The protocol to open to network traffic. You can choose a common protocol, such as SSH (for a Linux instance), RDP (for a Windows instance), and HTTP and HTTPS to allow Internet traffic to reach your instance. You can also manually enter a custom port or port ranges.<br /></li><li><b>Protocol</b>. The type of protocol, for example TCP or UDP. Provides an additional selection for ICMP.<br /></li><li><b>Port range</b>. For custom rules and protocols, you can manually enter a port number or a port range.<br /></li><li><b>Source</b>. Determines the traffic that can reach your instance. Specify a single IP address, or an IP address range in CIDR notation (for example, 203.0.113.5/32). If connecting from behind a firewall, you'll need the IP address range used by the client computers. You can specify the name or ID of another security group in the same region. To specify a security group in another AWS account (EC2-Classic only), prefix it with the account ID and a forward slash, for example: 111122223333/OtherSecurityGroup.<br /></li><li><b>Description</b>. A description for a security group rule.<br />A description can be up to 255 characters in length.<br />Allowed characters are a-z, A-Z, 0-9, spaces, and ._-:/()#,@[]+=;{}!$*.<br /></li></ul><p><br /></p><p><b>Example</b>: we have a Node.js application that is receiving traffic on port 8080, only from a Load Balancer that is on the same VPC. This means we need to create an Inbound rule:</p><ul><li>Type: Custom TCP</li><li>Protocol: TCP</li><li>Port range: 8080</li><li>Source: Custom; CIDR block: 172.0.0.0/16 (in our example we're using a <i><u>default</u></i> VPC so we'll put here its private IP address block thus allowing only access from the private network)</li></ul><p> </p><h2 style="text-align: left;">Terraform <b>Security Group</b> resource</h2><p><a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group" rel="nofollow" target="_blank"><b>aws_security_group</b> | Resources | hashicorp/aws | Terraform Registry</a><br /><br /> </p><h2 style="text-align: left;">Terraform <b>Security Group Rule</b> resource</h2><p>It represents a single ingress or egress group rule, which can be added to external Security Groups: </p><p><a href="https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group_rule"><span style="color: #2b00fe;"><b>aws_security_group_rule</b></span> | Resources | hashicorp/aws | Terraform Registry</a> </p><p>Required arguments: </p><ul style="text-align: left;"><li><b>from_port</b>: start port</li><li><b>to_port</b>: end port<br /></li><li><b>protocol</b></li><ul><li>icmp</li><li>icmpv6</li><li>tcp</li><li>udp</li><li>all<br /></li></ul><li><span style="color: #2b00fe;"><b>security_group_id</b></span>: Security group to apply this rule to.</li><li><b>type</b></li><ul><li>ingress (inbound)</li><li>egress (outbound) <br /></li></ul></ul><div style="text-align: left;">Optional arguments:</div><div style="text-align: left;"><ul style="text-align: left;"><li><b>self</b>. Whether the security group itself will be added as a source to this ingress rule.<br /></li><li><b>source_security_group_id</b>. Security group id to allow access to/from, depending on the type.</li><li>...<br /></li></ul></div><p><br /></p><p>Because security group rule gets attached to the security group, we need to instruct Terraform to provision security group rule after the security group. We do this by using depends_on meta argument:</p><p><span style="color: #38761d;"><span style="font-family: courier;">resource "aws_security_group_rule" "my_ec2_ssh" {<br /> type = "ingress"<br /> from_port = 22<br /> to_port = 22<br /> protocol = "tcp"<br /> cidr_blocks = var.ssh_ip_range<br /> security_group_id = aws_security_group.<b>my_ec2_sg</b>.id<br /> <b>depends_on</b> = [aws_security_group.<b>my_ec2_sg</b>]<br />}</span></span><br /></p><p><br /></p><h2 style="text-align: left;">Resources:</h2><p><a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules-reference.html" rel="nofollow" target="_blank">Security group rules for different use cases - Amazon Elastic Compute Cloud</a><br /><br /></p>Bojan Komazechttp://www.blogger.com/profile/05437236807206825832noreply@blogger.com0tag:blogger.com,1999:blog-4912226416400969049.post-14148848129154562382023-02-06T16:31:00.006+00:002023-03-08T15:27:27.367+00:00AWS EC2: Auto Scaling<div style="text-align: left;"></div><div style="text-align: left;"></div><div style="text-align: left;"></div><div style="text-align: left;"><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4jg7Fl4CVuhvVoCevT2VGoW3aci1xfAJHBavoJl8Vp0X_ILYjmTGiWvKO9DYN2vNE2fxyqiyFIIxzY7FS2JsIhi5uqQq0rZ0BVBHgY3bWSRmbYsa5Xr5pluY_f3En3ffRb9kuv-p2fRohrZIwZY0k_IewioZvzRWHL51Xi6ktgYAJIqTwF8fONn7i/s225/index.jpeg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="225" data-original-width="225" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4jg7Fl4CVuhvVoCevT2VGoW3aci1xfAJHBavoJl8Vp0X_ILYjmTGiWvKO9DYN2vNE2fxyqiyFIIxzY7FS2JsIhi5uqQq0rZ0BVBHgY3bWSRmbYsa5Xr5pluY_f3En3ffRb9kuv-p2fRohrZIwZY0k_IewioZvzRWHL51Xi6ktgYAJIqTwF8fONn7i/w400-h400/index.jpeg" width="400" /></a></div><br /><br /></div><div style="text-align: left;">If our application is getting more traffic, we need to scale it: we need to create more virtual machines to run it so can handle the load, we need a load balancer to distribute the network traffic to these instances. Instead of doing this manually (creating new instances and e.g. using NGINX as load balancer) we can use AWS Auto-scaling Group and AWS Application Load Balancer.</div><div style="text-align: left;"><ul style="text-align: left;"><li>Automatically maintains application performance based on the user requirement at the lowest possible price</li><li>Service which helps user to monitor applications and automatically adjusts capacity to maintain steady, predictable performance at the lowest possible cost</li><li>Benefits:</li><ul><li>better fault tolerance</li><li>better cost management</li><li>reliability of your service</li><li>scalability</li><li>flexibility - changes can be made on the fly</li></ul><li>Snapshot vs AMI</li><ul><li>Snapshot</li><ul><li>used as a backup of a single EBS volume attached to the EC2 instance</li><li>opt for it when the instance contains multiple static EBS volumes</li><li>pay only for the storage of the modified data</li><li>a non-bootable image on EBS volume</li></ul><li>AMI</li><ul><li>used as a backup of an EC2 instance</li><li>widely used to replace a failed EC2 instance</li><li>pay only for the storage that you use</li><li>bootable image on EC2 instance</li><li>creating an AMI image will also create EBS snapshots</li></ul></ul></ul></div><p><br /></p><p>How does AWS auto scaling work?</p><p></p><ul style="text-align: left;"><li>Configure single unified scaling policy per application source</li><li>explore the application</li><li>choose the service you want to scale </li><li>select what to optimize e.g. cost or performance</li><li>keep track of scaling</li></ul><div><br /></div><div>Different scaling plans</div><div><br /></div><div><ul style="text-align: left;"><li>scaling plan helps user to configure a set of instructions for scaling based on software requirement</li></ul></div><div><br /></div><div><h2 style="text-align: left;">Launch Template</h2></div><div><br /></div><div>Let's first explore a tool that can save time when scaling (creating multiple EC2 instances) manually.<br /></div><br /><p>How to set up a <b>Launch Template</b>?</p><p><i>EC2</i> >> <i>Instances</i> >> <i>Launch Template</i>: <br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTrSVMbCqKiZHjX4qSJ_4ULpVCR2WIQrurJzELiUdBwwCPMNSwD7l9HAteXiOfggiDvqwTtQUs75YN_l4T2xO-4W9RnwJ47xvU359A04wXZF3O_s6f5PLBOJSTSSwH5qVVqhJ7NdqUfFHOOy00HlOIMKQ3SOdcB2xm1VvSnrtSTDKshlkw6oxvl0OB/s1602/Screenshot%202023-02-05%20at%2023.31.19.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1184" data-original-width="1602" height="474" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTrSVMbCqKiZHjX4qSJ_4ULpVCR2WIQrurJzELiUdBwwCPMNSwD7l9HAteXiOfggiDvqwTtQUs75YN_l4T2xO-4W9RnwJ47xvU359A04wXZF3O_s6f5PLBOJSTSSwH5qVVqhJ7NdqUfFHOOy00HlOIMKQ3SOdcB2xm1VvSnrtSTDKshlkw6oxvl0OB/w640-h474/Screenshot%202023-02-05%20at%2023.31.19.png" width="640" /></a></div><p><br /></p><p>We can set:</p><ul style="text-align: left;"><li><b>Name</b></li><li><b>Version description</b></li><li><b>AMI</b>. We can create AMI for each version of our application an name them e.g. <i>amy-my-app-v1</i>, <i>ami-my-app-v2</i> etc...In the same way we can create new version of launch template and bind desired AMI (application) version to it.<b><br /></b></li><li><b>Instance type</b> e.g. t2.micro </li><li><b>Key pair</b> (for secure connection to the instance)</li><li><b>Network settings</b></li><ul><li>Launch into:</li><ul><li> <b>VPC</b></li><li><b>Shared network</b></li></ul><li><b>Security group</b> <br /></li></ul><li><b>Storage</b> (volumes e.g. Volume 1(AMI Root, 8GB, EBS, General Purpose SSD))</li><li><b>Resource tags</b></li><li><b>Network interfaces</b></li><li><b>User data</b> <br /></li></ul><p>User data example for setting an environment variable in our application's env config file:</p><div style="text-align: left;"><span style="color: #38761d;"><span style="font-family: courier;">#!/bin/bash -ex</span></span></div><div style="text-align: left;"><span style="color: #38761d;"><span style="font-family: courier;">sudo -u ec2-user bash -c "echo \"</span></span></div><div style="text-align: left;"><span style="color: #38761d;"><span style="font-family: courier;">MY_ENV_VAR="My env var value, set from the template" </span></span></div><div style="text-align: left;"><span style="color: #38761d;"><span style="font-family: courier;">\" > /home/ec2-user/my-app.env<br /></span></span></div><div style="text-align: left;"><span style="color: #38761d;"><span style="font-family: courier;">systemctl restart --now --no-block version-my-app.service </span></span><br /></div><p> </p><p>Shebang arguments explained:<br /></p><p><i></i></p><blockquote><i>-e Exit immediately if a command exits with a non-zero status.<br />-x Print commands and their arguments as they are executed.</i></blockquote><p></p><p> </p><p>Launch templates are versioned but we can't manually set the version number. AWS does it automatically by incrementing numbers from version 1.<br /></p><p></p><p>Launch templates can be used outside Auto-scaling or Load Balancing: whenever we want to launch the instance, we don't need to manually fill details about the new instance, we can just use Launch instance from template.</p><p>In our scenario though, we want auto-scaling group to use launch template in order to launch EC2 instances. </p><p> </p><h2 style="text-align: left;">Auto scaling group <br /></h2><p> </p><p>Auto scaling group manages how many EC2 instances will be running in parallel. <br /></p><p>How to set up an <b>Auto scaling group</b>? <br /></p><p></p><p><i>EC2</i> >> <i>Auto scaling groups</i> >> <i>Create Auto scaling group</i></p><p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHzsSf5Ppn1qe4Tfor_6DQZnftw9RSXNVxsh0S1Ma07HK2GoIAJzX-Nn-J7hXMI2TjPxC4G-rYeKwvSrNNGZDWjs7uzFAbYfS9CrCZaZWW09n4AvfQj2ycqcOZEF7Kukbe2mGQtIYw4jNbVctwI100iwVOTeR6-SD4jGRWLO9TF_8z-z1bVJLH9ZM7/s1133/Screenshot%20from%202023-02-06%2012-22-48.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="676" data-original-width="1133" height="382" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHzsSf5Ppn1qe4Tfor_6DQZnftw9RSXNVxsh0S1Ma07HK2GoIAJzX-Nn-J7hXMI2TjPxC4G-rYeKwvSrNNGZDWjs7uzFAbYfS9CrCZaZWW09n4AvfQj2ycqcOZEF7Kukbe2mGQtIYw4jNbVctwI100iwVOTeR6-SD4jGRWLO9TF_8z-z1bVJLH9ZM7/w640-h382/Screenshot%20from%202023-02-06%2012-22-48.png" width="640" /></a></div><br /><ul style="text-align: left;"><li>Choose <b>launch template or configuration</b></li><ul><li><b>Auto scaling group name</b></li><li><b>Launch template</b>. We can select it and also select:<br /></li><ul><li>Launch template version (we can use this to select the version of our application that we want to be running on these new instances)<br /></li></ul></ul><li>Choose <b>instance launch options</b><br /></li><ul><li><b>Network</b></li><ul><li><b>VPC</b> </li><li><b>Availability Zones and subnets</b> (in the form <i>az_name|subnet_name</i>); We want to list here all of them so we have a large pool of AZs in case something happens to EC2 instances running in some of them. </li></ul><li><b>Instance type requirements</b> - we can override launch template here<br /></li></ul><li>Configure <b>advanced options</b></li><ul><li><b>Load balancing</b> (optional)</li><ul><li><b>No Load Balancer</b> - traffic to auto scaling group will not be fronted by a load balancer<br /></li><li><b>Attach to an existing load balancer</b></li><ul><li>We'll specify here target groups actually (not load balancer directly)<b><br /></b></li></ul><li><b>Attach to a new load balancer</b> - quickly create a basic load balancer<br /></li></ul><li><b>Health checks</b> (optional)</li><ul><li><b>Health Check type</b></li><ul><li>EC2 - always enabled</li><li>ELB - if load balancing is enabled</li></ul><li><b>Health check grace period</b> - amount of time until EC2 auto scaling performs the first health check on new instances after they are put into service e.g. 300 seconds<br /></li></ul><li><b>Additional settings</b> (optional)</li><ul><li><b>Monitoring</b> - enable group metrics collection withing CloudWatch<br /></li></ul></ul><li>Configure <b>group size and scaling policies</b></li><ul><li><b>Group size</b><br /></li><ul><li><b>Desired capacity</b>. How many EC2 instances do we want running simultaneously? Must be between minimum and maximum. E.g. 2<br /></li><li><b>Minimum capacity</b> e.g. 2<br /></li><li><b>Maximum capacity</b> e.g. 8<br /></li></ul><li><b>Scaling policies</b> - choose whether to use a scaling policy to dynamically resize auto scaling group to meet changes in demand<br /></li><ul><li><b>Target tracking scaling policy</b> - choose a desired outcome and leave it to the scaling policy to add and remove capacity as needed to achieve that outcome</li><ul><li><b>Name</b> - we can chose an arbitrary name</li><li><b>Metric type</b> e.g. Average CPU utilization (average over all EC2 instances running)<br /></li><li><b>Target value</b> e.g. 50 (%)<br /></li><li>Instances need ____ seconds warm up before including in metric</li><li>Disable scale in to create only a scale-out policy<br /></li></ul><li><b>None</b></li></ul><li><b>Instance scale-in protection</b> (optional); if enabled, newly created instances will be protected from scale-in by default<br /></li></ul><li>Add <b>notifications</b> - send notifications to SNS topics whenever Amazon EC2 auto-scaling launches or terminates the EC2 instances in your auto scaling group<br /></li><li>Add <b>tags</b></li><li>Review</li></ul><p>As soon as auto scaling group is created it becomes active. If we set to have 2 as a desired number of instances, auto scaling group will immediately create them. If we try to delete them (e.g. manually stop them), they will get to Terminated state and auto scaling group will immediately re-launch 2 new instances. If we want permanently to stop these instances we need first to delete auto scaling group and then delete those EC2 instances. </p><p>As seen above, Load balancing is optional so auto scaling (using auto scaling groups) can all happen with NO Load Balancer involved. But typically, we want to have load balancer so the load is equally distributed across all running EC2 instances. We can set up NGINX server as load balancer or use AWS (Application) Load Balancer in which case, in Load balancing options above, we'll choose to attach auto scaling group to an existing or newly created Load Balancer. It's worth mentioning that auto-scaling group is associated to load balancer indirectly, via target groups. <br /></p><p> </p><h3 style="text-align: left;">Resources:<br /></h3><p><a href="https://aws.amazon.com/autoscaling/">App Scaling - AWS Application Auto Scaling - AWS</a></p><p><a href="https://stackoverflow.com/questions/36270873/aws-ec2-auto-scaling-groups-i-get-min-and-max-but-whats-desired-instances-lim">amazon web services - AWS EC2 Auto Scaling Groups: I get Min and Max, but what's Desired instances limit for? - Stack Overflow</a></p><p><a href="https://docs.aws.amazon.com/autoscaling/ec2/userguide/asg-capacity-limits.html">Set capacity limits on your Auto Scaling group - Amazon EC2 Auto Scaling</a> </p><p> <a href="https://serverfault.com/questions/1022282/when-stopping-ec2-instance-it-starts-again-automatically-listed-separately-pre/1022406#1022406">amazon web services - When stopping EC2 instance, it starts again automatically listed separately, previous one changes to terminated - Server Fault</a> </p>Bojan Komazechttp://www.blogger.com/profile/05437236807206825832noreply@blogger.com0tag:blogger.com,1999:blog-4912226416400969049.post-73130423947207894982023-02-02T16:06:00.016+00:002023-02-06T13:24:53.175+00:00AWS EC2: Elastic Load Balancing<div style="text-align: left;"><div class="separator" style="clear: both; text-align: center;"><span style="font-size: small;"><span style="font-family: inherit;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZVbBGghymf-VyI4COay8goNzJqfftKr97o2-leOO586WUibMfMjJCJ5mUe0M7jc0xxYvSygfZmyTtHwPV1e8TF-NzQ0j5cO9EAFaZI9kUyCyQFiJoek_rRSO2tEdlPsNgAWmKOwOTg0S_12ULb6nwsvoImxYIiZdI9nHCiAYg1XG6tFS5Fpe4fvsT/s350/AWS-ELB-LOGO.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="228" data-original-width="350" height="208" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZVbBGghymf-VyI4COay8goNzJqfftKr97o2-leOO586WUibMfMjJCJ5mUe0M7jc0xxYvSygfZmyTtHwPV1e8TF-NzQ0j5cO9EAFaZI9kUyCyQFiJoek_rRSO2tEdlPsNgAWmKOwOTg0S_12ULb6nwsvoImxYIiZdI9nHCiAYg1XG6tFS5Fpe4fvsT/s320/AWS-ELB-LOGO.png" width="320" /></a></span></span></div><span style="font-size: small;"><span style="font-family: inherit;"><br /></span></span></div><div style="text-align: left;"><span style="font-size: small;"><span style="font-family: inherit;"><span>AWS Elastic Load Balancing:</span></span></span></div><div style="text-align: left;"><ul style="text-align: left;"><li><span style="font-size: small;"><span style="font-family: inherit;"><span>has the task of distributing traffic throughout the cluster of servers to ensure higher responsiveness and availability of applications, websites, or databases</span></span></span></li><li><span style="font-size: small;"><span style="font-family: inherit;"><span>automatically distributes the incoming <b>traffic</b> across multiple <b>targets</b>, such as:</span></span></span></li><ul><li><span style="font-size: small;"><span style="font-family: inherit;"><span>EC2 instances</span></span></span></li><li><span style="font-size: small;"><span style="font-family: inherit;"><span>containers</span></span></span></li><li><span style="font-size: small;"><span style="font-family: inherit;"><span>IP addresses </span></span></span></li></ul></ul><span style="font-size: small;"><span style="font-family: inherit;"><span> ...in one or more <b>Availability Zones</b>.</span></span></span><ul style="text-align: left;"><li><span style="font-size: small;"><span style="font-family: inherit;"><span><span style="-webkit-text-stroke-width: 0px; background-color: white; color: #16191f; display: inline; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">monitors the <b>health</b> of its registered targets, and routes traffic only to the healthy targets</span></span></span></span></li><li><span style="font-family: inherit;"><span style="-webkit-text-stroke-width: 0px; background-color: white; color: #16191f; display: inline; float: none; font-size: small; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">targets can be added and removed from load balancer as the needs change, without disrupting the overall flow of requests to the <b>application</b></span><span style="font-size: small;"><span><span><span style="-webkit-text-stroke-width: 0px; background-color: white; color: #16191f; display: inline; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"><b> </b></span></span></span></span></span></li><li><span style="font-size: small;"><span style="font-family: inherit;"><span><span style="-webkit-text-stroke-width: 0px; background-color: white; color: #16191f; display: inline; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"><b>scales</b> your load balancer as your incoming traffic changes over time</span></span></span></span></li><li><span style="font-size: small;"><span style="font-family: inherit;"><span><span style="-webkit-text-stroke-width: 0px; background-color: white; color: #16191f; display: inline; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">supports the following load balancers: </span><span style="-webkit-text-stroke-width: 0px; background-color: white; color: #16191f; display: inline; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"> </span></span></span></span></li><ul><li><span style="font-size: small;"><span style="font-family: inherit;"><span><span style="-webkit-text-stroke-width: 0px; background-color: white; color: #16191f; display: inline; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">Application Load Balancers</span></span></span></span></li><li><span style="font-size: small;"><span style="font-family: inherit;"><span><span style="-webkit-text-stroke-width: 0px; background-color: white; color: #16191f; display: inline; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">Network Load Balancers</span></span></span></span></li><li><span style="font-size: small;"><span style="font-family: inherit;"><span><span style="-webkit-text-stroke-width: 0px; background-color: white; color: #16191f; display: inline; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">Gateway Load Balancers</span></span></span></span></li><li><span style="font-size: small;"><span style="font-family: inherit;"><span><span style="-webkit-text-stroke-width: 0px; background-color: white; color: #16191f; display: inline; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">Classic Load Balancers</span></span><span style="-webkit-text-stroke-width: 0px; background-color: white; color: #16191f; display: inline; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"> </span></span></span></li></ul></ul> <span style="font-size: small;"><span style="font-family: inherit;"> </span></span></div><div style="text-align: left;"><span style="font-size: small;"><span style="font-family: inherit;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfYm19Os_LRSmVfwdW_BO5xNCTxuzQHaJpreZw_5udPGDIDydHIcA4Aw_Z-BL2hjW7VhfQMlRV-eESuHQMlj8OWDxKTFMq_--8AwvWfuBGzAwH5KV5K07579R7_pvPqSo3gmYpY-JNPCqHdS7yHm4Q1hTbG8VVA1TsQ7tdHE0_1VZn5j1kEyXsExaA/s1022/Screenshot%20from%202023-02-06%2013-23-26.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="979" data-original-width="1022" height="614" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhfYm19Os_LRSmVfwdW_BO5xNCTxuzQHaJpreZw_5udPGDIDydHIcA4Aw_Z-BL2hjW7VhfQMlRV-eESuHQMlj8OWDxKTFMq_--8AwvWfuBGzAwH5KV5K07579R7_pvPqSo3gmYpY-JNPCqHdS7yHm4Q1hTbG8VVA1TsQ7tdHE0_1VZn5j1kEyXsExaA/w640-h614/Screenshot%20from%202023-02-06%2013-23-26.png" width="640" /></a></div><br /> </span></span></div><div style="text-align: left;"><span style="font-size: small;"><span style="font-family: inherit;"> </span></span></div><div style="text-align: left;"><span style="font-size: small;"><span style="font-family: inherit;"> </span></span></div><div style="text-align: left;"><span style="font-size: small;"><span style="font-family: inherit;">Load balancer:</span></span></div><ul><li><span style="font-size: small;"><span style="font-family: inherit;">serves as the single point of contact for <b>clients</b></span></span></li><li><span style="font-size: small;"><span style="font-family: inherit;">distributes incoming application traffic across multiple <b>targets</b> which increases the <b>availability</b> of your <b>application</b></span></span></li><li><span style="font-size: small;"><span style="font-family: inherit;">has </span></span><span style="font-size: small;"><span style="font-family: inherit;">one or more <b>listeners</b> added to it</span></span></li></ul><div style="text-align: left;"><span style="font-size: small;"><span style="font-family: inherit;"><br />Listener:</span></span></div><ul style="text-align: left;"><li><span style="font-size: small;"><span style="font-family: inherit;">checks for <b>connection requests</b> from clients, using the protocol and port that you configure</span></span></li><li><span style="font-size: small;"><span style="font-family: inherit;">has <b>rules</b> defined for it</span></span></li><ul style="text-align: left;"><li><span style="font-size: small;"><span style="font-family: inherit;">a <b>default rule</b> must be defined for each listener, </span></span><b><span style="font-size: small;"><span style="font-family: inherit;">additional rules</span></span></b><span style="font-size: small;"><span style="font-family: inherit;"> can be defined optionally</span></span><span style="font-size: small;"><span style="font-family: inherit;"> </span></span></li><li><span style="font-size: small;"><span style="font-family: inherit;">Rules determine how the load balancer <b>routes</b> requests to its registered targets</span></span></li><li><span style="font-size: small;"><span style="font-family: inherit;">Each rule consists of:</span></span></li><ul><li><b><span style="font-size: small;"><span style="font-family: inherit;">priority</span></span></b></li><li><span style="font-size: small;"><span style="font-family: inherit;">one or more <b>actions</b></span></span></li><li><span style="font-size: small;"><span style="font-family: inherit;">one or more <b>conditions</b>; when conditions for a rule are met, then its actions are performed</span></span></li><li><span style="font-size: small;"><span style="font-family: inherit;"> specified <b>target groups</b></span></span></li></ul><li><span style="font-size: small;"><span style="font-family: inherit;">When load balancer receives a request, it evaluates the listener rules in priority order to determine which rule to apply, and then selects a target from the target group for the rule action. <br /><b> </b> </span></span></li></ul></ul><p><span style="font-size: small;"><span style="font-family: inherit;">Target groups: <br /></span></span></p><ul style="text-align: left;"><li><span style="font-family: inherit;"><span style="font-size: small;"><span>Each target group routes requests to one or more registered <b>targets</b>, such as EC2 instances, using the protocol and port number that you specify. </span></span><span style="font-size: small;"><span> </span></span></span></li><ul><li><span style="font-family: inherit;"><span style="font-size: small;"><span>target can be registered with multiple target groups</span></span></span></li><li><span style="font-family: inherit;"><span style="font-size: small;"><span>Routing is performed independently for each target group, even when a target is registered with multiple target groups</span></span><span style="font-size: small;"><span> <br /></span></span></span></li></ul><li><span style="font-family: inherit;"><span style="font-size: small;"><span><b>health checks</b> are configured per target group </span></span></span></li><ul><li><span style="font-size: small;"><span style="font-family: inherit;"><span><span style="-webkit-text-stroke-width: 0px; background-color: white; color: #16191f; display: inline; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">used to monitor the health of the registered targets</span></span></span></span></li><li><span style="font-family: inherit;"><span style="font-size: small;"><span>they are performed on all targets registered to a target group</span></span></span></li><li><span style="font-family: inherit;"><span style="-webkit-text-stroke-width: 0px; background-color: white; color: #16191f; display: inline; float: none; font-size: small; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-decoration-color: initial; text-decoration-style: initial; text-decoration-thickness: initial; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">they can be configured so that the load balancer can send requests only to the healthy targets</span><span style="font-size: small;"><span><br /></span></span></span></li></ul><li><span style="font-family: inherit;"><span style="font-size: small;"><span><b>routing algorithm</b> is configured at the target group level</span></span></span></li><ul><li><span style="font-family: inherit;"><span style="font-size: small;"><span>default: <b>round robin</b></span></span></span></li><li><span style="font-size: small;"><span style="font-family: inherit;"><span style="font-family: inherit;"><b>least outstanding requests</b> routing algorithm can alternatively be specified</span><br /></span></span></li></ul></ul><div style="text-align: left;"><span style="font-size: small;"><span style="font-family: inherit;"><br /></span></span> </div><div style="text-align: left;"><h1 style="text-align: left;"><span style="font-size: small;"><span style="font-family: inherit;">References:</span></span></h1></div><div style="text-align: left;"><a href="https://docs.aws.amazon.com/elasticloadbalancing/latest/application/introduction.html">What is an Application Load Balancer? - Elastic Load Balancing</a> </div><div style="text-align: left;"><a href="https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/how-elastic-load-balancing-works.html">How Elastic Load Balancing works - Elastic Load Balancing</a> </div><div style="text-align: left;"><a href="https://avinetworks.com/glossary/round-robin-load-balancing/">What is Round Robin Load Balancing? Definition & FAQs | Avi Networks</a></div><div style="text-align: left;"><a href="https://www.whizlabs.com/blog/how-elastic-load-balancing-works/" rel="nofollow" target="_blank">How does AWS Elastic Load Balancer Work? - Whizlabs Blog</a><br /><a href="https://docs.aws.amazon.com/prescriptive-guidance/latest/load-balancer-stickiness/subnets-routing.html" rel="nofollow" target="_blank">Load balancer subnets and routing - AWS Prescriptive Guidance</a><br /><br /></div>Bojan Komazechttp://www.blogger.com/profile/05437236807206825832noreply@blogger.com0tag:blogger.com,1999:blog-4912226416400969049.post-3430376436161071922022-12-20T12:18:00.002+00:002022-12-20T12:18:44.794+00:00Installing Node via Node Version Manager on Ubuntu<div style="text-align: left;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFSeQ9pFcm3ntr2AqDCBsvfaDXUu7ZRQAQzsAZQfE59jqrcUmacWDflZ5S2ofo6qcKCgJQioCFPvFS6n7kljkA9S-8eeKTF7VijAyCgs0yQ-Nr8AnoLDet9-It2DZ8jR7P9qypC4cq0TNXvw3fJJ6Uki8FtTyJUxPRBU-ednU6wvqC5NFqFPKECzr6/s2560/2560px-Node.js_logo.svg.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1566" data-original-width="2560" height="392" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFSeQ9pFcm3ntr2AqDCBsvfaDXUu7ZRQAQzsAZQfE59jqrcUmacWDflZ5S2ofo6qcKCgJQioCFPvFS6n7kljkA9S-8eeKTF7VijAyCgs0yQ-Nr8AnoLDet9-It2DZ8jR7P9qypC4cq0TNXvw3fJJ6Uki8FtTyJUxPRBU-ednU6wvqC5NFqFPKECzr6/w640-h392/2560px-Node.js_logo.svg.png" width="640" /></a></div><br /> </div><div style="text-align: left;"> </div><div style="text-align: left;">Node Version Manager allows you to install different versions of Node.js.</div><div style="text-align: left;"> </div><div style="text-align: left;">Installation instructions are here: <br /></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><a href="https://github.com/nvm-sh/nvm">GitHub - nvm-sh/nvm: Node Version Manager - POSIX-compliant bash script to manage multiple active node.js versions</a></div><div style="text-align: left;"> </div><div style="text-align: left;"> We basically need to download and run a bash script:<br /></div><p><span style="color: #38761d;"><span style="font-family: courier;">$ <b>curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash</b><br /><span style="font-size: x-small;"> % Total % Received % Xferd Average Speed Time Time Time Current<br /> Dload Upload Total Spent Left Speed<br />100 15916 100 15916 0 0 23135 0 --:--:-- --:--:-- --:--:-- 23133<br />=> Downloading nvm from git to '/home/bojan.komazec/.nvm'<br />=> Cloning into '/home/bojan.komazec/.nvm'...<br />remote: Enumerating objects: 356, done.<br />remote: Counting objects: 100% (356/356), done.<br />remote: Compressing objects: 100% (303/303), done.<br />remote: Total 356 (delta 39), reused 164 (delta 27), pack-reused 0<br />Receiving objects: 100% (356/356), 222.15 KiB | 417.00 KiB/s, done.<br />Resolving deltas: 100% (39/39), done.<br />* (HEAD detached at FETCH_HEAD)<br /> master<br />=> Compressing and cleaning up git repository<br /><br />=> Appending nvm source string to /home/bojan.komazec/.bashrc<br />=> Appending bash_completion source string to /home/bojan.komazec/.bashrc<br />=> Close and reopen your terminal to start using nvm or run the following to use it now:<br /><br />export NVM_DIR="$HOME/.nvm"<br />[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm<br />[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion</span></span></span><br /> </p><p>After this, re-open the terminal and type:</p><p><span style="color: #38761d;"><span style="font-size: x-small;"><span style="font-family: courier;"><span style="font-size: small;">$ <b>nvm</b></span><br /><br />Node Version Manager (v0.39.2)<br /><br />Note: <version> refers to any version-like string nvm understands. This includes:<br /> - full or partial version numbers, starting with an optional "v" (0.10, v0.1.2, v1)<br /> - default (built-in) aliases: node, stable, unstable, iojs, system<br /> - custom aliases you define with `nvm alias foo`<br /><br /> Any options that produce colorized output should respect the `--no-colors` option.<br /><br />Usage:<br /> nvm --help Show this message<br /> --no-colors Suppress colored output<br /> nvm --version Print out the installed version of nvm<br /> nvm install [<version>] Download and install a <version>. Uses .nvmrc if available and version is omitted.<br /> The following optional arguments, if provided, must appear directly after `nvm install`:<br /> -s Skip binary download, install from source only.<br /> -b Skip source download, install from binary only.<br /> --reinstall-packages-from=<version> When installing, reinstall packages installed in <node|iojs|node version number><br /> --lts When installing, only select from LTS (long-term support) versions<br /> --lts=<LTS name> When installing, only select from versions for a specific LTS line<br /> --skip-default-packages When installing, skip the default-packages file if it exists<br /> --latest-npm After installing, attempt to upgrade to the latest working npm on the given node version<br /> --no-progress Disable the progress bar on any downloads<br /> --alias=<name> After installing, set the alias specified to the version specified. (same as: nvm alias <name> <version>)<br /> --default After installing, set default alias to the version specified. (same as: nvm alias default <version>)<br /> nvm uninstall <version> Uninstall a version<br /> nvm uninstall --lts Uninstall using automatic LTS (long-term support) alias `lts/*`, if available.<br /> nvm uninstall --lts=<LTS name> Uninstall using automatic alias for provided LTS line, if available.<br /> nvm use [<version>] Modify PATH to use <version>. Uses .nvmrc if available and version is omitted.<br /> The following optional arguments, if provided, must appear directly after `nvm use`:<br /> --silent Silences stdout/stderr output<br /> --lts Uses automatic LTS (long-term support) alias `lts/*`, if available.<br /> --lts=<LTS name> Uses automatic alias for provided LTS line, if available.<br /> nvm exec [<version>] [<command>] Run <command> on <version>. Uses .nvmrc if available and version is omitted.<br /> The following optional arguments, if provided, must appear directly after `nvm exec`:<br /> --silent Silences stdout/stderr output<br /> --lts Uses automatic LTS (long-term support) alias `lts/*`, if available.<br /> --lts=<LTS name> Uses automatic alias for provided LTS line, if available.<br /> nvm run [<version>] [<args>] Run `node` on <version> with <args> as arguments. Uses .nvmrc if available and version is omitted.<br /> The following optional arguments, if provided, must appear directly after `nvm run`:<br /> --silent Silences stdout/stderr output<br /> --lts Uses automatic LTS (long-term support) alias `lts/*`, if available.<br /> --lts=<LTS name> Uses automatic alias for provided LTS line, if available.<br /> nvm current Display currently activated version of Node<br /> nvm ls [<version>] List installed versions, matching a given <version> if provided<br /> --no-colors Suppress colored output<br /> --no-alias Suppress `nvm alias` output<br /> nvm ls-remote [<version>] List remote versions available for install, matching a given <version> if provided<br /> --lts When listing, only show LTS (long-term support) versions<br /> --lts=<LTS name> When listing, only show versions for a specific LTS line<br /> --no-colors Suppress colored output<br /> nvm version <version> Resolve the given description to a single local version<br /> nvm version-remote <version> Resolve the given description to a single remote version<br /> --lts When listing, only select from LTS (long-term support) versions<br /> --lts=<LTS name> When listing, only select from versions for a specific LTS line<br /> nvm deactivate Undo effects of `nvm` on current shell<br /> --silent Silences stdout/stderr output<br /> nvm alias [<pattern>] Show all aliases beginning with <pattern><br /> --no-colors Suppress colored output<br /> nvm alias <name> <version> Set an alias named <name> pointing to <version><br /> nvm unalias <name> Deletes the alias named <name><br /> nvm install-latest-npm Attempt to upgrade to the latest working `npm` on the current node version<br /> nvm reinstall-packages <version> Reinstall global `npm` packages contained in <version> to current version<br /> nvm unload Unload `nvm` from shell<br /> nvm which [current | <version>] Display path to installed node version. Uses .nvmrc if available and version is omitted.<br /> --silent Silences stdout/stderr output when a version is omitted<br /> nvm cache dir Display path to the cache directory for nvm<br /> nvm cache clear Empty cache directory for nvm<br /> nvm set-colors [<color codes>] Set five text colors using format "yMeBg". Available when supported.<br /> Initial colors are:<br /> b y g r e<br /> Color codes:<br /> r/R = red / bold red<br /> g/G = green / bold green<br /> b/B = blue / bold blue<br /> c/C = cyan / bold cyan<br /> m/M = magenta / bold magenta<br /> y/Y = yellow / bold yellow<br /> k/K = black / bold black<br /> e/W = light grey / white<br /><br />Example:<br /> nvm install 8.0.0 Install a specific version number<br /> nvm use 8.0 Use the latest available 8.0.x release<br /> nvm run 6.10.3 app.js Run app.js using node 6.10.3<br /> nvm exec 4.8.3 node app.js Run `node app.js` with the PATH pointing to node 4.8.3<br /> nvm alias default 8.1.0 Set default node version on a shell<br /> nvm alias default node Always default to the latest available node version on a shell<br /><br /> nvm install node Install the latest available version<br /> nvm use node Use the latest version<br /> nvm install --lts Install the latest LTS version<br /> nvm use --lts Use the latest LTS version<br /><br /> nvm set-colors cgYmW Set text colors to cyan, green, bold yellow, magenta, and white<br /><br />Note:<br /> to remove, delete, or uninstall nvm - just remove the `$NVM_DIR` folder (usually `~/.nvm`)<br /></span></span></span><br /></p><p>Let's now check what's the latest version of Node.js:</p><p><br /></p><p><img alt="" src="data:image/png;base64,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" /></p><p><br /></p><p><span style="color: #38761d;"><span style="font-family: courier;">$ <b>nvm install 19.3.0</b><br />Downloading and installing node v19.3.0...<br />Downloading https://nodejs.org/dist/v19.3.0/node-v19.3.0-linux-x64.tar.xz...<br />############################################################################################################################################################## 100.0%<br />Computing checksum with sha256sum<br />Checksums matched!<br />Now using node v19.3.0 (npm v9.2.0)<br />Creating default alias: default -> 19.3.0 (-> v19.3.0)</span></span></p><p>Let's verify the installation: <br /></p><p><span style="color: #38761d;"><span style="font-family: courier;">$ <b>node -v</b><br />v19.3.0</span></span><br /></p><p>--- <br /></p>Bojan Komazechttp://www.blogger.com/profile/05437236807206825832noreply@blogger.com0tag:blogger.com,1999:blog-4912226416400969049.post-17444051828879562542022-12-18T15:46:00.007+00:002022-12-18T16:42:17.037+00:00Exploring Docker commands: docker image<div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxfn77Z1Zeq9JZZufpBEWNQMYSA_BfLpAKZiHdV47uzG43SAh_cr-pbE-TdnHGSRdfUXhdwsJCf7k42DNrhXzshQF5ptpF1hk9pZgaKSxGkmeRYj4rVXQPLZHsk_svTuLdcc-em7ecOhiHaepfsBS0gWHOp4yaCq6Sd6Fom72L8kxzzySCf-ox6-xW/s3840/Docker-Symbol.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2160" data-original-width="3840" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxfn77Z1Zeq9JZZufpBEWNQMYSA_BfLpAKZiHdV47uzG43SAh_cr-pbE-TdnHGSRdfUXhdwsJCf7k42DNrhXzshQF5ptpF1hk9pZgaKSxGkmeRYj4rVXQPLZHsk_svTuLdcc-em7ecOhiHaepfsBS0gWHOp4yaCq6Sd6Fom72L8kxzzySCf-ox6-xW/w640-h360/Docker-Symbol.png" width="640" /></a></div><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"><br /></span></div><div><span style="color: #38761d; font-family: "courier new", courier, monospace;"><br /></span></div><div><span style="color: #38761d; font-family: "courier new", courier, monospace;">image</span><span style="font-family: inherit;"> is a management command. To get a list of all its commands we can run </span></div><div><span style="font-family: inherit;"><br /></span></div><span style="color: #38761d; font-family: "courier new", courier, monospace;"><div><span style="color: #38761d; font-family: "courier new", courier, monospace;">$ <b>docker image</b> </span></div><div><br /></div></span>or <span style="color: #38761d; font-family: "courier new", courier, monospace;"><div><br /></div><div>$ <b>docker image --help</b></div><br /></span><span style="font-size: x-small;"><span style="color: #38761d; font-family: "courier new", courier, monospace;">Usage: docker image COMMAND</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"><br /></span><span style="color: #38761d; font-family: "courier new", courier, monospace;">Manage images</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"><br /></span><span style="color: #38761d; font-family: "courier new", courier, monospace;">Commands:</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"> build Build an image from a Dockerfile</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"> <b>history</b> Show the history of an image</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"> import Import the contents from a tarball to create a filesystem image</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"> <b>inspect</b> Display detailed information on one or more images</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"> load Load an image from a tar archive or STDIN</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"> <b>ls</b> List images</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"> prune Remove unused images</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"> pull Pull an image or a repository from a registry</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"> push Push an image or a repository to a registry</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"> rm Remove one or more images</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"> save Save one or more images to a tar archive (streamed to STDOUT by default)</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"> tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"><br /></span><span style="color: #38761d; font-family: "courier new", courier, monospace;">Run 'docker image COMMAND --help' for more information on a command.</span></span><br /><br />---<div><br /></div><h3 style="text-align: left;">docker image history</h3><div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">% <b>docker image history --help</b></span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><br /></span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">Usage: docker image history [OPTIONS] IMAGE</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><br /></span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">Show the history of an image</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><br /></span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">Options:</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> --format string Pretty-print images using a Go template</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> -H, --human Print sizes and dates in human readable format (default true)</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> --no-trunc Don't truncate output</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> -q, --quiet Only show image IDs</span></div></div><div><br /></div><div>Shows the history of the image. This is actually a list of image's layers, and the commands used to create them.</div><div><br /></div><div><span style="color: #38761d; font-family: courier;">$ docker image history <image_name>:<image_tag></span></div><div><br /></div><div>If image_tag is omitted, <span style="font-family: courier;">latest</span> is used by default.</div><div><br /></div><div>Another format:</div><div><br /></div><div><div><span style="color: #38761d; font-family: courier;">$ docker image history <image_id></span></div><div><br /></div></div><div><br /></div><div>This command is basically reconstructing image's Dockerfile and therefore can be used to find what is this Docker image going to run, what is its base image, what commands make the image large etc...</div><div><br /></div><div><a href="https://pythonspeed.com/articles/docker-history/">A tableau of crimes and misfortunes: the ever-useful `docker history`</a></div><div><br /></div><div>Example:</div><div><br /></div><div><div><div><span style="color: #38761d; font-family: courier;">% <b>docker history mysql</b></span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">IMAGE CREATED CREATED BY SIZE COMMENT</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">7484689f290f 11 days ago /bin/sh -c #(nop) CMD ["mysqld"] 0B </span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><missing> 11 days ago /bin/sh -c #(nop) EXPOSE 3306 33060 0B </span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><missing> 11 days ago /bin/sh -c #(nop) ENTRYPOINT ["docker-entry… 0B </span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><missing> 11 days ago /bin/sh -c ln -s usr/local/bin/docker-entryp… 34B </span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><missing> 11 days ago /bin/sh -c #(nop) COPY file:e9c22353a1133b89… 14.2kB </span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><missing> 11 days ago /bin/sh -c #(nop) VOLUME [/var/lib/mysql] 0B </span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><missing> 11 days ago /bin/sh -c set -eux; microdnf install -y "m… 237MB </span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><missing> 11 days ago /bin/sh -c #(nop) ENV MYSQL_SHELL_VERSION=8… 0B </span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><missing> 11 days ago /bin/sh -c set -eu; . /etc/os-release; { … 215B </span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><missing> 11 days ago /bin/sh -c set -eux; microdnf install -y "m… 178MB </span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><missing> 11 days ago /bin/sh -c set -eu; . /etc/os-release; { … 225B </span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><missing> 11 days ago /bin/sh -c #(nop) ENV MYSQL_VERSION=8.0.31-… 0B </span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><missing> 11 days ago /bin/sh -c #(nop) ENV MYSQL_MAJOR=8.0 0B </span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><missing> 11 days ago /bin/sh -c set -eux; key='859BE8D7C586F5384… 3.17kB </span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><missing> 11 days ago /bin/sh -c set -eux; microdnf install -y … 13.6MB </span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><missing> 11 days ago /bin/sh -c set -eux; arch="$(uname -m)"; c… 2.29MB </span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><missing> 11 days ago /bin/sh -c #(nop) ENV GOSU_VERSION=1.14 0B </span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><missing> 11 days ago /bin/sh -c set -eux; groupadd --system --gi… 2.77kB </span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><missing> 11 days ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B </span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><missing> 11 days ago /bin/sh -c #(nop) ADD file:04d9ae26c2acac414… 106MB </span></div></div><div style="text-align: left;"><br /></div><div style="text-align: left;">To suppress truncating of the commands, we can use --no-trunc:</div><div style="text-align: left;"><br /></div><div style="text-align: left;"><span style="color: #38761d; font-family: courier;">% <b>docker history --no-trunc</b> mysql</span></div><div style="text-align: left;"><br /></div><div style="text-align: left;"><div><span style="color: #38761d; font-family: courier;">% docker history --no-trunc mysql | grep ENTRYPOINT</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><missing> 11 days ago /bin/sh -c #(nop) ENTRYPOINT ["docker-entrypoint.sh"] </span> </div></div><h3>docker image inspect</h3><div><div><span style="color: #38761d; font-family: courier;">% <b>docker image inspect --help</b></span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><br /></span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">Usage: docker image inspect [OPTIONS] IMAGE [IMAGE...]</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><br /></span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">Display detailed information on one or more images</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"><br /></span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">Options:</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> -f, --format string Format the output using the given Go template</span></div></div><div><br /></div><div>We can use this command to see:</div><div><ul style="text-align: left;"><li>which ports will be exposed in container</li><li>which environment variables will be set in container</li><li>volumes</li><li>command/entrypoint - what will get executed when we run the container</li><li>OS and architecture</li></ul></div><div><br /></div><div>Example:</div><div><br /></div><div><div><span style="color: #38761d; font-family: courier;">% <b>docker image inspect mysql</b></span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">[</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Id": "sha256:7484689f290f1defe06b65befc54cb6ad91a667cf0af59a265ffe76c46bd0478",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "RepoTags": [</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "mysql:latest"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> ],</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "RepoDigests": [</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "mysql@sha256:3d7ae561cf6095f6aca8eb7830e1d14734227b1fb4748092f2be2cfbccf7d614"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> ],</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Parent": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Comment": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Created": "2022-12-07T02:23:31.34588089Z",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Container": "39e37396c270e5234472eb14feb4abbdc8212ac30b984481f79756836a2926eb",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "ContainerConfig": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Hostname": "39e37396c270",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Domainname": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "User": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "AttachStdin": false,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "AttachStdout": false,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "AttachStderr": false,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "ExposedPorts": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "3306/tcp": {},</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "33060/tcp": {}</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Tty": false,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "OpenStdin": false,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "StdinOnce": false,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Env": [</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "GOSU_VERSION=1.14",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "MYSQL_MAJOR=8.0",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "MYSQL_VERSION=8.0.31-1.el8",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "MYSQL_SHELL_VERSION=8.0.31-1.el8"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> ],</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Cmd": [</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "/bin/sh",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "-c",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "#(nop) ",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "CMD [\"mysqld\"]"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> ],</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Image": "sha256:38354afaf9d5d657e0608e62e7ad59f6b8746d3d6c1776c956f250034041626a",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Volumes": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "/var/lib/mysql": {}</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "WorkingDir": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Entrypoint": [</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "docker-entrypoint.sh"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> ],</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "OnBuild": null,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Labels": {}</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "DockerVersion": "20.10.12",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Author": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Config": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Hostname": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Domainname": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "User": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "AttachStdin": false,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "AttachStdout": false,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "AttachStderr": false,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "ExposedPorts": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "3306/tcp": {},</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "33060/tcp": {}</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Tty": false,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "OpenStdin": false,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "StdinOnce": false,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Env": [</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "GOSU_VERSION=1.14",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "MYSQL_MAJOR=8.0",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "MYSQL_VERSION=8.0.31-1.el8",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "MYSQL_SHELL_VERSION=8.0.31-1.el8"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> ],</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Cmd": [</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "mysqld"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> ],</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Image": "sha256:38354afaf9d5d657e0608e62e7ad59f6b8746d3d6c1776c956f250034041626a",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Volumes": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "/var/lib/mysql": {}</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "WorkingDir": "",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Entrypoint": [</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "docker-entrypoint.sh"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> ],</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "OnBuild": null,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Labels": null</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Architecture": "amd64",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Os": "linux",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Size": 538012982,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "VirtualSize": 538012982,</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "GraphDriver": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Data": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "LowerDir": "/var/lib/docker/overlay2/166118dbdfd603f6c6a005d36be4ba4d51ef997a6b50d70224208a266f70090e/diff:/var/lib/docker/overlay2/5c6d7d8a1b25af02b5c2bbbe65aceb827e65607d025118f6727c52bd8f7bbc3c/diff:/var/lib/docker/overlay2/8c86f30101e519ae95fff720288754c0685cb000b488243bbca96ad12359001c/diff:/var/lib/docker/overlay2/2b6a8383ab2345fd999f30b75b20ea3e54c96fb13b6c03b0499dfd9fac723bfb/diff:/var/lib/docker/overlay2/493bbbc0b022918b2d463513851deb0357ce094b598a2bb6dc76d4e34be33c19/diff:/var/lib/docker/overlay2/867b29054d700c0d71574adb91e1c28c145082cad242b9ab627c88fec963a8e3/diff:/var/lib/docker/overlay2/04bfc900db8627bc6b346259a0273019508bb7369d573b85a835e42dd3483aa2/diff:/var/lib/docker/overlay2/76f0b8fcc14c3e25dc9470c61f7c2f91324246082c41f408dd39af9725a8a42d/diff:/var/lib/docker/overlay2/33ea513815166ece2e9548d960e5aae3c0ca7acd1ba58cc4143142ff24d6cb72/diff:/var/lib/docker/overlay2/1b45b35a8d681bd00e5c3c59e6353a01267ffc658fa9b173d8a68e957416de10/diff",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "MergedDir": "/var/lib/docker/overlay2/2cf0a924d050e57b34a1a8c5548a48cfb7c2303c156c7c917df0a53e386a2305/merged",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "UpperDir": "/var/lib/docker/overlay2/2cf0a924d050e57b34a1a8c5548a48cfb7c2303c156c7c917df0a53e386a2305/diff",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "WorkDir": "/var/lib/docker/overlay2/2cf0a924d050e57b34a1a8c5548a48cfb7c2303c156c7c917df0a53e386a2305/work"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Name": "overlay2"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "RootFS": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Type": "layers",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Layers": [</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "sha256:d3cc7b6aa7bc15725c1a856ce06fe436da3fbccf0c9c06b04e45f79b3439c154",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "sha256:a7f421510691bf6a7b344d1efb738b3d343e252e7dde114a0dd86d432ef6000c",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "sha256:6ac2db160c6cf3dcf1aff0ced069aa98da28c50cff5cd3c8881c04f42e3ef1fe",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "sha256:7fe65049a2a940ab927d3f5b2cf0687ecffbdf9d7e9df1daaeddb83bc601f3cb",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "sha256:da1824686db37bbf1ffbffea53295aa853731531a14e70bca24eeb6d91fd6327",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "sha256:d410d4efd0e75456011f265fa113b206dd4da9dccf5151bca714ef6c69a3b8cd",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "sha256:60c4dab21dc337e912d518acc56e5b776e3de4f1d277d074831bb678089b87a6",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "sha256:d00057f8969283fed84044f6103036e18a9d776579d705a85472535ba321df25",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "sha256:2f42ce9d7b80a286af13410c0b64e94c90eca3e7597f7fd82a783aa1f68c2373",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "sha256:8408fed6a9d685236cb024ceea39692743b6c52ea6c4c068b22a6475f742e24a",</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "sha256:336175ddf157a8f50c0aae8c0726b1462fd41f30f0b7f84caf6bf5cd02f8de77"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> ]</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> },</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "Metadata": {</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> "LastTagTime": "0001-01-01T00:00:00Z"</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> }</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;"> }</span></div><div><span style="color: #38761d; font-family: courier; font-size: x-small;">]</span></div></div><div><br /></div><h3>docker image ls</h3><div><br /></div><span style="color: #38761d; font-family: "courier new", courier, monospace;">$ <b>docker image ls --help</b></span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"><br /></span><span style="color: #38761d; font-family: "courier new", courier, monospace;">Usage: docker image ls [OPTIONS] [REPOSITORY[:TAG]]</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"><br /></span><span style="color: #38761d; font-family: "courier new", courier, monospace;">List images</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"><br /></span><span style="color: #38761d; font-family: "courier new", courier, monospace;">Aliases:</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"> ls, images, list</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"><br /></span><span style="color: #38761d; font-family: "courier new", courier, monospace;">Options:</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"> -a, --all Show all images (default hides intermediate images)</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"> --digests Show digests</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"> -f, --filter filter Filter output based on conditions provided</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"> --format string Pretty-print images using a Go template</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"> --no-trunc Don't truncate output</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"> -q, --quiet Only show numeric IDs</span><br /><br /><br /><div>To list all images:</div><div><br /></div><div><span style="color: #38761d; font-family: courier;">$ <b>docker image ls</b></span></div><div><br /></div>or </div><div><br /></div><div><span style="color: #38761d; font-family: courier;">$ <b>docker images</b></span></div><div><br /></div><div><br /></div><div>Example:</div><div><span style="color: #38761d; font-family: courier;"><br /></span></div><div><p class="p1" style="font-size: 11px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;"><span style="color: #38761d; font-family: courier;">% <b>docker images</b></span></span></p><p class="p1" style="font-size: 11px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;"><span style="color: #38761d; font-family: courier;">REPOSITORY <span class="Apple-converted-space"> </span>TAG <span class="Apple-converted-space"> </span>IMAGE ID <span class="Apple-converted-space"> </span>CREATED<span class="Apple-converted-space"> </span>SIZE</span></span></p><p class="p1" style="font-size: 11px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;"><span style="color: #38761d; font-family: courier;">mysql<span class="Apple-converted-space"> </span>latest<span class="Apple-converted-space"> </span>7484689f290f <span class="Apple-converted-space"> </span>11 days ago<span class="Apple-converted-space"> </span>538MB</span></span></p><p class="p1" style="font-size: 11px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;"><span style="color: #38761d; font-family: courier;">in28min/hello-world-python <span class="Apple-converted-space"> </span>0.0.1.RELEASE <span class="Apple-converted-space"> </span>6d1dfe87a934 <span class="Apple-converted-space"> </span>6 months ago <span class="Apple-converted-space"> </span>91MB</span></span></p><p class="p1" style="font-size: 11px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;"><span style="color: #38761d; font-family: courier;"><br /></span></span></p><p class="p1" style="font-size: 11px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;"><span style="color: #38761d; font-family: courier;">% <b>docker image ls</b></span></span></p><p class="p1" style="font-size: 11px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;"><span style="color: #38761d; font-family: courier;">REPOSITORY <span class="Apple-converted-space"> </span>TAG <span class="Apple-converted-space"> </span>IMAGE ID <span class="Apple-converted-space"> </span>CREATED<span class="Apple-converted-space"> </span>SIZE</span></span></p><p class="p1" style="font-size: 11px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;"><span style="color: #38761d; font-family: courier;">mysql<span class="Apple-converted-space"> </span>latest<span class="Apple-converted-space"> </span>7484689f290f <span class="Apple-converted-space"> </span>11 days ago<span class="Apple-converted-space"> </span>538MB</span></span></p><p class="p1" style="font-size: 11px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;"><span style="color: #38761d; font-family: courier;">in28min/hello-world-python <span class="Apple-converted-space"> </span>0.0.1.RELEASE <span class="Apple-converted-space"> </span>6d1dfe87a934 <span class="Apple-converted-space"> </span>6 months ago <span class="Apple-converted-space"> </span>91MB</span></span></p><br /></div><div><br /></div><div>To list IDs of all images:<br /><br /><span style="color: #38761d; font-family: courier;">$ docker image ls -aq<br /></span><br /><br /><h3>docker image rm (docker image remove)</h3><div>Removes an image from the local machine.</div><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;">$ <b>docker image rm --help</b></span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"><br /></span><span style="color: #38761d; font-family: "courier new", courier, monospace;">Usage: docker image rm [OPTIONS] IMAGE [IMAGE...]</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"><br /></span><span style="color: #38761d; font-family: "courier new", courier, monospace;">Remove one or more images</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"><br /></span><span style="color: #38761d; font-family: "courier new", courier, monospace;">Aliases:</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"> rm, rmi, <b>remove</b></span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"><br /></span><span style="color: #38761d; font-family: "courier new", courier, monospace;">Options:</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"> -f, --force Force removal of the image</span><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;"> --no-prune Do not delete untagged parents</span><br /><br /><br />To remove some image:<br /><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;">$ <b>docker image rm <image_id></b></span></div><div><span style="color: #38761d; font-family: courier new, courier, monospace;"><b><br /></b></span></div>or<div><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;">$ <b>docker image rm <image_name>:<image_label></b></span><span style="color: #38761d; font-family: courier new, courier, monospace;"><b><br /></b></span><br /></div><div><br /></div><div>To delete all images:<br /><br /><span style="color: #38761d; font-family: "courier new", courier, monospace;">$ docker image rm $(docker image ls -aq)<br /></span><br /></div><div><br /></div><div>Image can't be removed if it's referenced by some container. We first need to remove the container:</div><div><br /></div><div><span style="color: #38761d; font-family: courier;">$ docker container rm <container_id></span></div><div><br /></div><div>---</div>Bojan Komazechttp://www.blogger.com/profile/05437236807206825832noreply@blogger.com0tag:blogger.com,1999:blog-4912226416400969049.post-49359832796369766382022-12-07T11:56:00.006+00:002022-12-07T11:56:55.495+00:00How to install Go on Ubuntu 20.04<div style="text-align: left;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmRLKxGSxqIF5xY7An6DQgdMJcZhu-dA8HGpMQSR89iGQS5IcCvHU3Yk-ceXa-VZJQlzLIfHXSh1DRMMXAuotNk3ckxCffidzgz8FO8_aGFFC1D7sx6duQaDBfXQr_OiHzf3RYqmC9XUe-cfnpiys2SJYt3E5EVv3brcAwm7vEvlQVHmjZ8GHZuLuN/s607/go.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="318" data-original-width="607" height="336" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmRLKxGSxqIF5xY7An6DQgdMJcZhu-dA8HGpMQSR89iGQS5IcCvHU3Yk-ceXa-VZJQlzLIfHXSh1DRMMXAuotNk3ckxCffidzgz8FO8_aGFFC1D7sx6duQaDBfXQr_OiHzf3RYqmC9XUe-cfnpiys2SJYt3E5EVv3brcAwm7vEvlQVHmjZ8GHZuLuN/w640-h336/go.png" width="640" /></a></div><br /> </div><div style="text-align: left;"> </div><div style="text-align: left;"><a href="https://go.dev/doc/install">Download and install - The Go Programming Language</a> </div><div style="text-align: left;"> </div><div style="text-align: left;">Download Go for Linux, at the time of writing it was go1.19.3.linux-amd64.tar.gz (142 MB) package:<br /></div><div style="text-align: left;"> </div><div style="text-align: left;"><span style="color: #38761d;"><span style="font-family: courier;">$ ls go1.19.3.linux-amd64.tar.gz <br />go1.19.3.linux-amd64.tar.gz </span></span></div><div style="text-align: left;"> </div><div style="text-align: left;">Remove previous Go installation: <br /></div><div style="text-align: left;"> </div><div style="text-align: left;"><span style="color: #38761d;"><span style="font-family: courier;">$ sudo rm -rf /usr/local/go </span></span></div><div style="text-align: left;"> </div><div style="text-align: left;">Unpack the archive:</div><div style="text-align: left;"> <br /></div><div style="text-align: left;"><span style="color: #38761d;"><span style="font-family: courier;">$ sudo tar -C /usr/local -xzf go1.19.3.linux-amd64.tar.gz</span></span></div><div style="text-align: left;"> </div><div style="text-align: left;">Add Go binaries path to PATH environment variable: <br /></div><div style="text-align: left;"></div><div style="text-align: left;"></div><div style="text-align: left;"></div><div style="text-align: left;"></div><div style="text-align: left;"></div><div style="text-align: left;"></div><div style="text-align: left;"><br /><span style="color: #38761d;"><span style="font-family: courier;">$ vi $HOME/.profile<br />$ cat $HOME/.profile<br /># ~/.profile: executed by the command interpreter for login shells.<br /># This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login<br /># exists.<br /># see /usr/share/doc/bash/examples/startup-files for examples.<br /># the files are located in the bash-doc package.<br /><br /># the default umask is set in /etc/profile; for setting the umask<br /># for ssh logins, install and configure the libpam-umask package.<br />#umask 022<br /><br /># if running bash<br />if [ -n "$BASH_VERSION" ]; then<br /> # include .bashrc if it exists<br /> if [ -f "$HOME/.bashrc" ]; then<br /> . "$HOME/.bashrc"<br /> fi<br />fi<br /><br /># set PATH so it includes user's private bin if it exists<br />if [ -d "$HOME/bin" ] ; then<br /> PATH="$HOME/bin:$PATH"<br />fi<br /><br /># set PATH so it includes user's private bin if it exists<br />if [ -d "$HOME/.local/bin" ] ; then<br /> PATH="$HOME/.local/bin:$PATH"<br />fi<br /><br /># B.Komazec added as part of Go installation (for a single user only)<br /># set PATH so it includes Go bin if it exists<br />if [ -d "/usr/local/go/bin" ] ; then<br /> PATH="$PATH:/usr/local/go/bin"<br />fi</span></span></div><div style="text-align: left;"> </div><div style="text-align: left;">Reload the current user's profile config:<br /></div><div style="text-align: left;"> </div><div style="text-align: left;"><span style="color: #38761d;"><span style="font-family: courier;">$ source $HOME/.profile </span></span></div><div style="text-align: left;"> </div><div style="text-align: left;">Verify installation: <br /></div><div style="text-align: left;"> </div><div style="text-align: left;"><span style="color: #38761d;"><span style="font-family: courier;">$ go version<br />go version go1.19.3 linux/amd64</span></span><br /><br /><br /></div>Bojan Komazechttp://www.blogger.com/profile/05437236807206825832noreply@blogger.com0tag:blogger.com,1999:blog-4912226416400969049.post-54000595054582910272022-11-04T11:48:00.003+00:002022-11-04T11:48:28.673+00:00Linux User Management<p><span style="font-family: inherit;"></span></p><div class="separator" style="clear: both; text-align: center;"><span style="font-family: inherit;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4Xgq0j6CdLrzPOVK1FoXZOK3rC2xC-WDalGXRNtll4L0TjwZAvQkmgdZZqfFRTV5BPyVbz5kCYdH5470emR7tlHCUFAvVAVouU04JRWS7WFfEnPU1_ur_rLj2FDELjHGBgYzXUmZelT1Q1wm8TeWn5DB3ojwLPCx0P7yz1wHY-2BjGN-47i8nb6r3/s500/Symbol-Linux-500x276.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="276" data-original-width="500" height="354" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4Xgq0j6CdLrzPOVK1FoXZOK3rC2xC-WDalGXRNtll4L0TjwZAvQkmgdZZqfFRTV5BPyVbz5kCYdH5470emR7tlHCUFAvVAVouU04JRWS7WFfEnPU1_ur_rLj2FDELjHGBgYzXUmZelT1Q1wm8TeWn5DB3ojwLPCx0P7yz1wHY-2BjGN-47i8nb6r3/w640-h354/Symbol-Linux-500x276.jpg" width="640" /></a></span></div><span style="font-family: inherit;"><br /> </span><p></p><p><span style="font-family: inherit;"> </span></p><p><span style="font-family: inherit;">To </span>request security privileges of superuser (root):<br />
<br />
<span style="font-family: "courier new", courier, monospace;">$ <span style="color: blue;"><b>sudo</b></span> </span><br />
<br />
</p><div style="-webkit-text-stroke-width: 0px; color: black; font-family: "times new roman"; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<div style="margin: 0px;">
<a href="http://en.wikipedia.org/wiki/Sudo" rel="nofollow" target="_blank">sudo</a></div>
</div>
<br />
<span style="font-family: "courier new", courier, monospace;">/usr/local/etc/sudoers</span><br />
<br />
To log in and run the current shell as root use:<br />
<br />
<span style="font-family: "courier new", courier, monospace;">user@computer:~$ <b><span style="color: blue;">sudo -i</span></b></span><br />
<span style="font-family: "courier new", courier, monospace;">root@computer:~# <span style="color: blue;">whoami</span></span><br />
<span style="font-family: "courier new", courier, monospace;">root</span><br />
<span style="font-family: "courier new", courier, monospace;">root@computer:~</span><span style="font-family: "courier new", courier, monospace;"># <span style="color: blue;">exit</span></span><br />
<br />
<span style="font-family: "courier new", courier, monospace;">logout</span><br />
<div>
<span style="font-family: "courier new", courier, monospace;">user@computer</span><span style="font-family: "courier new", courier, monospace;">:~$</span></div>
<div>
<br />
To find info about user use <span style="font-family: "courier new", courier, monospace;"><b>id</b></span>:<br />
<br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;">$ <b>id</b> --help</span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;">Usage: id [OPTION]... [USER]</span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;">Print user and group information for the specified USER,</span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;">or (when USER omitted) for the current user.</span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;"><br /></span>
<span style="color: #38761d; font-family: "courier new", courier, monospace;"> -a ignore, for compatibility with other versions</span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;"> -Z, --context print only the security context of the process</span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;"> -g, --group print only the effective group ID</span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;"> -G, --groups print all group IDs</span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;"> -n, --name print a name instead of a number, for -ugG</span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;"> -r, --real print the real ID instead of the effective ID, with -ugG</span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;"> -u, --user print only the effective user ID</span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;"> -z, --zero delimit entries with NUL characters, not whitespace;</span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;"> not permitted in default format</span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;"> --help display this help and exit</span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;"> --version output version information and exitftime</span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;"><br /></span>
<span style="color: #38761d; font-family: "courier new", courier, monospace;">Without any OPTION, print some useful set of identified information.</span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;"><br /></span>
<span style="color: #38761d; font-family: "courier new", courier, monospace;">GNU coreutils online help: <http://www.gnu.org/software/coreutils/></span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;">Full documentation at: <http://www.gnu.org/software/coreutils/id></span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;">or available locally via: info '(coreutils) id invocation'</span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;"><br /></span>
<span style="font-family: "courier new", courier, monospace;"><span style="color: #38761d;">$ </span><b><span style="color: blue;">id</span></b></span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;"><br /></span>
<span style="color: #38761d; font-family: "courier new", courier, monospace;">uid=1000(</span><span style="color: #38761d; font-family: "courier new", courier, monospace;">test_user</span><span style="color: #38761d; font-family: "courier new", courier, monospace;">) gid=1000(</span><span style="color: #38761d; font-family: "courier new", courier, monospace;">test_user</span><span style="color: #38761d; font-family: "courier new", courier, monospace;">) groups=1000(</span><span style="color: #38761d; font-family: "courier new", courier, monospace;">test_user</span><span style="color: #38761d; font-family: "courier new", courier, monospace;">),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lpadmin),126(sambashare),999(docker)</span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;"><br /></span>
<span style="color: #38761d; font-family: "courier new", courier, monospace;">$ <b>id -u</b></span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;">1000</span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;"><br /></span>
<span style="color: #38761d; font-family: "courier new", courier, monospace;">$ <b>id -g</b></span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;">1000</span><br />
<div>
<span style="color: #38761d; font-family: "courier new", courier, monospace;"><br /></span></div>
<span style="color: #38761d; font-family: "courier new", courier, monospace;">$ <b>id -un</b></span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;">test_user</span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;"><br /></span>
<span style="color: #38761d; font-family: "courier new", courier, monospace;">$ <b>id -gn</b></span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;">test_user</span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;"><br /></span>
<span style="color: #38761d; font-family: "courier new", courier, monospace;">$ <b>id -G</b></span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;">1000 3 23 26 29 45 115 125 999</span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;"><br /></span>
<span style="color: #38761d; font-family: "courier new", courier, monospace;">$ <b>id -Gn</b></span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;">test_user adm cdrom sudo dip plugdev lpadmin sambashare docker</span><br />
<br /><br /></div><div><div><span style="color: #38761d; font-family: courier;">$ <b>echo user:group \(id\) = $(id -u):$(id -g)</b></span></div><div><span style="color: #38761d; font-family: courier;">user:group (id) = 1000:1000</span></div><div><span style="color: #38761d; font-family: courier;"><br /></span></div><div><span style="color: #38761d; font-family: courier;">$ <b>echo user:group \(name\) = $(id -un):$(id -gn)</b></span></div><div><span style="color: #38761d; font-family: courier;">user:group (name) = bojan:bojan</span></div></div><div><br /></div><div><br /></div><div>
To get the current user:<br />
<br />
<span style="font-family: "courier new", courier, monospace;"><span style="color: #38761d;">$ </span><b><span style="color: blue;">whoami</span></b></span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;">test_user</span><br />
<br />To list all users:</div><div> </div><div><span style="color: #38761d;"><span style="font-family: courier;">$ <b>cat /etc/passwd</b></span></span> <br /></div><div> </div><div>To list all groups:<br />
<br />
<span style="font-family: "courier new", courier, monospace;"><span style="color: #38761d;">$ </span><b><span style="color: blue;">groups</span></b></span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;">test_user</span><span style="color: #38761d; font-family: "courier new", courier, monospace;"> adm cdrom sudo dip plugdev lpadmin sambashare docker</span><br />
<br />
To find out to which groups belong given user:<br />
<br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;">$ </span><span style="color: blue;"><b><span style="font-family: "courier new", courier, monospace;">groups </span><span style="font-family: "courier new", courier, monospace;">test_user</span></b></span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;">test_user</span><span style="color: #38761d; font-family: "courier new", courier, monospace;"> : </span><span style="color: #38761d; font-family: "courier new", courier, monospace;">test_user</span><span style="color: #38761d; font-family: "courier new", courier, monospace;"> adm cdrom sudo dip plugdev lpadmin sambashare docker</span><br /></div><div><br /></div>
<h4>
<span style="font-family: "courier new", courier, monospace;">.profile</span> file </h4>
<br />
There is one global profile file (executed when anyone logs in):<br />
<br />
<span style="font-family: "courier new", courier, monospace;">/etc/profile</span><br />
<br />
There are three user-specific bash profile files (executed when current/specific user logs in):<br />
<br />
<span style="font-family: "courier new", courier, monospace;">~/.profile</span><br />
<span style="font-family: "courier new", courier, monospace;">~/.bash_profile</span><br />
<span style="font-family: "courier new", courier, monospace;">~/.bashrc</span><br />
<br />
If <span style="font-family: "courier new", courier, monospace;">~/.profile</span> doesn't exist, just create it.<br />
<br />
This is the comment at the beginning of <span style="font-family: "courier new", courier, monospace;">~/.profile</span><span style="font-family: inherit;">:</span><br />
<br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;"># ~/.profile: executed by the command interpreter for login shells.</span><br />
<span style="color: #38761d;"><span style="font-family: "courier new", courier, monospace;"># This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login </span><span style="font-family: "courier new", courier, monospace;">exists.</span></span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;"># see /usr/share/doc/bash/examples/startup-files for examples.</span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;"># the files are located in the bash-doc package.</span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;"># the default umask is set in /etc/profile; for setting the umask</span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;"># for ssh logins, install and configure the libpam-umask package.</span><br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;">#umask 022</span><br />
<br />
<br />
<h3 style="text-align: left;">
How to logout current user from the Terminal?</h3>
<br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;">$ gnome-session-quit</span><br />
<br />
or<br />
<br />
<span style="color: #38761d; font-family: "courier new", courier, monospace;">$ gnome-session-quit --no-prompt</span><br />
<br />
to suppress showing Logout confirmation dialog.<p> --- <br /></p>Bojan Komazechttp://www.blogger.com/profile/05437236807206825832noreply@blogger.com0