├── README.md ├── .DS_Store ├── docs ├── .DS_Store ├── cloud │ ├── .DS_Store │ ├── aws │ │ ├── .DS_Store │ │ ├── assets │ │ │ ├── task-web.png │ │ │ ├── 3tier-result.png │ │ │ ├── access-emr-ssh.png │ │ │ ├── asg-network-vpc.png │ │ │ ├── ecs-fargate-td.png │ │ │ ├── emr-spark-setup.png │ │ │ ├── asg-activity-log.png │ │ │ ├── ecs-fargate-check.png │ │ │ ├── ecs-service-spec.png │ │ │ ├── emr-spark-zepplin.png │ │ │ ├── vpc-architecture.png │ │ │ ├── 3tier-architecture.png │ │ │ ├── access-emr-zepplin.png │ │ │ ├── asg-launch-template.png │ │ │ ├── asg-load-monitoring.png │ │ │ ├── aws-eks-flask-db-app.png │ │ │ ├── create-zepplin-note.png │ │ │ ├── ecs-container-spec.png │ │ │ ├── ecs-fargate-service.png │ │ │ ├── emr-security-group.png │ │ │ ├── emr-spot-instances.png │ │ │ ├── import-data-zepplin.png │ │ │ ├── xshell-private-key.png │ │ │ ├── access-emr-ssh-console.png │ │ │ ├── add-xshell-private-key.png │ │ │ ├── ecs-fargate-task-check.png │ │ │ ├── ecs-fargate-td-config.png │ │ │ ├── emr-spark-architecture.png │ │ │ ├── emr-spark-description.png │ │ │ ├── zepplin-register-data.png │ │ │ ├── asg-activity-log-success.png │ │ │ ├── asg-activity-log-waiting.png │ │ │ ├── asg-launch-template-image.png │ │ │ ├── asg-lb-endpoint-response.png │ │ │ ├── asg-network-loadbalancer.png │ │ │ ├── eb-flask-todo-demo-output.png │ │ │ ├── ecs-fargate-architecture.png │ │ │ ├── ecs-fargate-service-check.png │ │ │ ├── ecs-fargate-td-container.png │ │ │ ├── lightsail-todo-service-ui.png │ │ │ ├── spark-query-total-delays.png │ │ │ ├── spark-query-total-flights.png │ │ │ ├── access-ec2-instance-xshell.png │ │ │ ├── access-emr-zepplin-console.png │ │ │ ├── asg-launch-template-created.png │ │ │ ├── eb-flask-todo-architecture.jpg │ │ │ ├── eb-flask-todo-demo-webpage.png │ │ │ ├── lightsail-container-service.png │ │ │ ├── asg-group-size-scaling-policy.png │ │ │ ├── asg-launch-template-networking.png │ │ │ ├── asg-launch-template-userdata.png │ │ │ ├── lightsail-container-deployment.png │ │ │ ├── spark-query-total-departures.png │ │ │ ├── asg-tutorial-architecture-diagram.png │ │ │ ├── eb-flask-todo-demo-webpage-updated.png │ │ │ ├── testsession.jsp │ │ │ ├── eks-cluster-config.yml │ │ │ └── testdb.jsp │ │ ├── cloud9-python-docker.md │ │ ├── ec2-setup.md │ │ ├── aws-ecs-container.md │ │ ├── aws-lightsail-container.md │ │ ├── aws-elasticbeanstalk.md │ │ ├── aws-autoscaling-group.md │ │ ├── aws-emr-spark-bigdata.md │ │ ├── amazon-eks-setup.md │ │ └── apache-tomcat-redis.md │ ├── gcp │ │ ├── assets │ │ │ ├── gcp-vpc-firewall.png │ │ │ └── gce-connect-via-ssh.png │ │ └── gcp-ce-setup.md │ └── openstack │ │ ├── assets │ │ ├── manage-instance.png │ │ ├── openstack-on-ec2.png │ │ ├── inc-python-line198.png │ │ └── openstack-horizon-dashboard.png │ │ └── install-openstack.md ├── assets │ ├── channel_add_small.png │ └── cloudacode-intro.png ├── kubernetes │ ├── assets │ │ ├── task-web.png │ │ ├── argo-web-console.png │ │ ├── argo-architecture.png │ │ ├── grafana-dashboard.png │ │ ├── grafana-datasource.png │ │ ├── minikube-todo-app.jpg │ │ ├── grafana-k8s-dashboard.png │ │ ├── argo-prometheus-synced.png │ │ ├── grafana-helm-servicetype.png │ │ └── kubernetes-cluster-prometheus_rev1.json │ ├── argocd-deployment.md │ └── minikube-todo-app.md ├── devops │ └── cicd │ │ ├── assets │ │ ├── codebuild-env.png │ │ ├── code-connection.png │ │ ├── codepipline-result.png │ │ ├── github-action-pr.png │ │ ├── code-connection-list.png │ │ ├── ci-system-architecture.png │ │ ├── secretmanager-keyvalue.png │ │ ├── codbuildpolicy-secretarn.png │ │ ├── codepipline-architecture.jpg │ │ ├── secretsmanager-dockerhub-arn.png │ │ ├── build_process_by_github_webhook.png │ │ ├── continuous-delivery-codepipeline.png │ │ └── github-action-dockerhub-architecture.png │ │ ├── github-action-dockerhub.md │ │ ├── aws-codepipeline-delivery-eb.md │ │ ├── aws-codepipeline-delivery-ecs.md │ │ └── github-aws-codebuild-dockerhub.md ├── python │ ├── assets │ │ └── docker-flask-mariadb.jpeg │ └── flask │ │ └── simple-flask-app-mariadb.md └── index.md ├── .gitignore ├── .github └── workflows │ └── ci.yml ├── overrides └── main.html └── mkdocs.yml /README.md: -------------------------------------------------------------------------------- 1 | # tutorials 2 | -------------------------------------------------------------------------------- /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/.DS_Store -------------------------------------------------------------------------------- /docs/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/.DS_Store -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio code directorie(s) 2 | .vscode/ 3 | 4 | .DS_Store 5 | .log -------------------------------------------------------------------------------- /docs/cloud/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/.DS_Store -------------------------------------------------------------------------------- /docs/cloud/aws/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/.DS_Store -------------------------------------------------------------------------------- /docs/assets/channel_add_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/assets/channel_add_small.png -------------------------------------------------------------------------------- /docs/assets/cloudacode-intro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/assets/cloudacode-intro.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/task-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/task-web.png -------------------------------------------------------------------------------- /docs/kubernetes/assets/task-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/kubernetes/assets/task-web.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/3tier-result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/3tier-result.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/access-emr-ssh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/access-emr-ssh.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/asg-network-vpc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/asg-network-vpc.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/ecs-fargate-td.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/ecs-fargate-td.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/emr-spark-setup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/emr-spark-setup.png -------------------------------------------------------------------------------- /docs/devops/cicd/assets/codebuild-env.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/devops/cicd/assets/codebuild-env.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/asg-activity-log.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/asg-activity-log.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/ecs-fargate-check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/ecs-fargate-check.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/ecs-service-spec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/ecs-service-spec.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/emr-spark-zepplin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/emr-spark-zepplin.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/vpc-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/vpc-architecture.png -------------------------------------------------------------------------------- /docs/cloud/gcp/assets/gcp-vpc-firewall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/gcp/assets/gcp-vpc-firewall.png -------------------------------------------------------------------------------- /docs/devops/cicd/assets/code-connection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/devops/cicd/assets/code-connection.png -------------------------------------------------------------------------------- /docs/kubernetes/assets/argo-web-console.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/kubernetes/assets/argo-web-console.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/3tier-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/3tier-architecture.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/access-emr-zepplin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/access-emr-zepplin.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/asg-launch-template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/asg-launch-template.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/asg-load-monitoring.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/asg-load-monitoring.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/aws-eks-flask-db-app.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/aws-eks-flask-db-app.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/create-zepplin-note.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/create-zepplin-note.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/ecs-container-spec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/ecs-container-spec.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/ecs-fargate-service.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/ecs-fargate-service.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/emr-security-group.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/emr-security-group.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/emr-spot-instances.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/emr-spot-instances.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/import-data-zepplin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/import-data-zepplin.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/xshell-private-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/xshell-private-key.png -------------------------------------------------------------------------------- /docs/cloud/gcp/assets/gce-connect-via-ssh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/gcp/assets/gce-connect-via-ssh.png -------------------------------------------------------------------------------- /docs/devops/cicd/assets/codepipline-result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/devops/cicd/assets/codepipline-result.png -------------------------------------------------------------------------------- /docs/devops/cicd/assets/github-action-pr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/devops/cicd/assets/github-action-pr.png -------------------------------------------------------------------------------- /docs/kubernetes/assets/argo-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/kubernetes/assets/argo-architecture.png -------------------------------------------------------------------------------- /docs/kubernetes/assets/grafana-dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/kubernetes/assets/grafana-dashboard.png -------------------------------------------------------------------------------- /docs/kubernetes/assets/grafana-datasource.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/kubernetes/assets/grafana-datasource.png -------------------------------------------------------------------------------- /docs/kubernetes/assets/minikube-todo-app.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/kubernetes/assets/minikube-todo-app.jpg -------------------------------------------------------------------------------- /docs/python/assets/docker-flask-mariadb.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/python/assets/docker-flask-mariadb.jpeg -------------------------------------------------------------------------------- /docs/cloud/aws/assets/access-emr-ssh-console.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/access-emr-ssh-console.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/add-xshell-private-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/add-xshell-private-key.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/ecs-fargate-task-check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/ecs-fargate-task-check.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/ecs-fargate-td-config.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/ecs-fargate-td-config.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/emr-spark-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/emr-spark-architecture.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/emr-spark-description.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/emr-spark-description.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/zepplin-register-data.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/zepplin-register-data.png -------------------------------------------------------------------------------- /docs/cloud/openstack/assets/manage-instance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/openstack/assets/manage-instance.png -------------------------------------------------------------------------------- /docs/cloud/openstack/assets/openstack-on-ec2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/openstack/assets/openstack-on-ec2.png -------------------------------------------------------------------------------- /docs/devops/cicd/assets/code-connection-list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/devops/cicd/assets/code-connection-list.png -------------------------------------------------------------------------------- /docs/kubernetes/assets/grafana-k8s-dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/kubernetes/assets/grafana-k8s-dashboard.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/asg-activity-log-success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/asg-activity-log-success.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/asg-activity-log-waiting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/asg-activity-log-waiting.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/asg-launch-template-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/asg-launch-template-image.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/asg-lb-endpoint-response.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/asg-lb-endpoint-response.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/asg-network-loadbalancer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/asg-network-loadbalancer.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/eb-flask-todo-demo-output.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/eb-flask-todo-demo-output.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/ecs-fargate-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/ecs-fargate-architecture.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/ecs-fargate-service-check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/ecs-fargate-service-check.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/ecs-fargate-td-container.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/ecs-fargate-td-container.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/lightsail-todo-service-ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/lightsail-todo-service-ui.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/spark-query-total-delays.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/spark-query-total-delays.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/spark-query-total-flights.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/spark-query-total-flights.png -------------------------------------------------------------------------------- /docs/cloud/openstack/assets/inc-python-line198.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/openstack/assets/inc-python-line198.png -------------------------------------------------------------------------------- /docs/devops/cicd/assets/ci-system-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/devops/cicd/assets/ci-system-architecture.png -------------------------------------------------------------------------------- /docs/devops/cicd/assets/secretmanager-keyvalue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/devops/cicd/assets/secretmanager-keyvalue.png -------------------------------------------------------------------------------- /docs/kubernetes/assets/argo-prometheus-synced.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/kubernetes/assets/argo-prometheus-synced.png -------------------------------------------------------------------------------- /docs/kubernetes/assets/grafana-helm-servicetype.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/kubernetes/assets/grafana-helm-servicetype.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/access-ec2-instance-xshell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/access-ec2-instance-xshell.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/access-emr-zepplin-console.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/access-emr-zepplin-console.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/asg-launch-template-created.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/asg-launch-template-created.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/eb-flask-todo-architecture.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/eb-flask-todo-architecture.jpg -------------------------------------------------------------------------------- /docs/cloud/aws/assets/eb-flask-todo-demo-webpage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/eb-flask-todo-demo-webpage.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/lightsail-container-service.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/lightsail-container-service.png -------------------------------------------------------------------------------- /docs/devops/cicd/assets/codbuildpolicy-secretarn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/devops/cicd/assets/codbuildpolicy-secretarn.png -------------------------------------------------------------------------------- /docs/devops/cicd/assets/codepipline-architecture.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/devops/cicd/assets/codepipline-architecture.jpg -------------------------------------------------------------------------------- /docs/cloud/aws/assets/asg-group-size-scaling-policy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/asg-group-size-scaling-policy.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/asg-launch-template-networking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/asg-launch-template-networking.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/asg-launch-template-userdata.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/asg-launch-template-userdata.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/lightsail-container-deployment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/lightsail-container-deployment.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/spark-query-total-departures.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/spark-query-total-departures.png -------------------------------------------------------------------------------- /docs/devops/cicd/assets/secretsmanager-dockerhub-arn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/devops/cicd/assets/secretsmanager-dockerhub-arn.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/asg-tutorial-architecture-diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/asg-tutorial-architecture-diagram.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/eb-flask-todo-demo-webpage-updated.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/aws/assets/eb-flask-todo-demo-webpage-updated.png -------------------------------------------------------------------------------- /docs/cloud/openstack/assets/openstack-horizon-dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/cloud/openstack/assets/openstack-horizon-dashboard.png -------------------------------------------------------------------------------- /docs/devops/cicd/assets/build_process_by_github_webhook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/devops/cicd/assets/build_process_by_github_webhook.png -------------------------------------------------------------------------------- /docs/devops/cicd/assets/continuous-delivery-codepipeline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/devops/cicd/assets/continuous-delivery-codepipeline.png -------------------------------------------------------------------------------- /docs/devops/cicd/assets/github-action-dockerhub-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cloudacode/tutorials/HEAD/docs/devops/cicd/assets/github-action-dockerhub-architecture.png -------------------------------------------------------------------------------- /docs/cloud/aws/assets/testsession.jsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
Session ID<%=session.getId()%>
Server IP<%=request.getLocalAddr()%>
13 |
Server Name: <%=request.getLocalName()%>
14 | 15 | 16 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: cloudacode-tutorials-ci 2 | on: 3 | push: 4 | branches: 5 | - master 6 | - main 7 | jobs: 8 | deploy: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v2 12 | - uses: actions/setup-python@v2 13 | with: 14 | python-version: 3.x 15 | - run: pip install mkdocs-material 16 | - run: mkdocs gh-deploy --force 17 | -------------------------------------------------------------------------------- /docs/cloud/aws/assets/eks-cluster-config.yml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: eksctl.io/v1alpha5 3 | kind: ClusterConfig 4 | 5 | metadata: 6 | name: cloud-eks-cluster 7 | region: ap-northeast-2 8 | 9 | availabilityZones: ["ap-northeast-2a", "ap-northeast-2c"] 10 | 11 | iam: 12 | withOIDC: true 13 | 14 | managedNodeGroups: 15 | - name: cloud-eks-workers 16 | desiredCapacity: 1 17 | iam: 18 | withAddonPolicies: 19 | albIngress: true 20 | instanceTypes: ["c4.large","c5.large"] 21 | spot: true 22 | # instanceType: t3.small 23 | # ssh: 24 | # publicKeyName: "" 25 | # https://ap-northeast-2.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-2#KeyPairs: 26 | 27 | cloudWatch: 28 | clusterLogging: 29 | enableTypes: ["audit", "authenticator", "controllerManager"] 30 | -------------------------------------------------------------------------------- /docs/cloud/aws/cloud9-python-docker.md: -------------------------------------------------------------------------------- 1 | # Develop Python and Docker on Cloud9 2 | 3 | **Cloud9을 통해서 Python 과 Docker 개발 환경 구성** 4 | 5 | 이번 실습은 AWS의 Cloud9를 통해 Python과 Docker를 개발하는 환경을 만드는 것을 목표로 합니다. 또한 Cloud9로 접근을 위한 Security Group 설정과 Disk volume 추가하는 방법도 포함되어 있습니다. 6 | 7 | **Time to Complete: 0.5 hours** 8 | 9 | **Tutorial Prereqs:** 10 | 11 | * **An AWS Account and Administrator-level or PowerUser-level access to it** 12 | 13 | ## 1. What is the Cloud9 14 | A cloud IDE for writing, running, and debugging code. 15 | [AWS Official Document](https://aws.amazon.com/cloud9/) 16 | 17 | ## 2. How to use Cloud9 18 | 19 | 20 | 21 | 🎉 Congratulations, you have completed Cloud9 tutorial -------------------------------------------------------------------------------- /overrides/main.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block extrahead %} 4 | {% set title = config.site_name %} 5 | {% set description = config.site_description %} 6 | {% set image = "https://raw.githubusercontent.com/cloudacode/tutorials/main/docs/assets/cloudacode-intro.png" %} 7 | {% if page and page.meta and page.meta.title %} 8 | {% set title = page.meta.title ~ " - " ~ title %} 9 | {% set description = page.meta.description %} 10 | {% set image = page.meta.image %} 11 | {% elif page and page.title and not page.is_homepage %} 12 | {% set title = page.title ~ " - " ~ title %} 13 | {% endif %} 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | {% endblock %} -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | # Welcome to Cloudacode 2 | 3 | ## Cloudacode Project 🚀 4 | 5 | Get started with step-by-step tutorials for `cloud, devops, kubernetes, and cncf technology`. 6 | 7 | ## Project layout 📚 8 | 9 | cloud/ 10 | ... # Cloud 101 11 | devops(CICD)/ 12 | ... # Continuous Integration / Deployment 13 | devops(Terraform)/ 14 | ... # Terraform 15 | kubernetes/ 16 | ... # Kubernetes 17 | cncf/ 18 | ... # Cncf project 19 | etc/ 20 | ... # Etc 21 | 22 | ## Me 🧑‍🚀 23 | 24 | A seasoned cloud and site reliability engineer with 12 years of experience in the web-scale tech industry. 25 | 26 | Areas of professional expertise: 27 | 28 | * On and off-prem cloud environment engineering 29 | * Deliver scalable and reliable infra with K8S 30 | * Improve operation efficiency and modernize legacy environment 31 | * Problem Solving / Strategic Thinking 32 | * Cross-functional communications 33 | * Project planning and management 34 | 35 | For full profile visit [kyungcheol's Linkedin](https://www.linkedin.com/in/kyungcheol/). -------------------------------------------------------------------------------- /docs/cloud/aws/assets/testdb.jsp: -------------------------------------------------------------------------------- 1 | <%@page import="java.sql.DriverManager"%> 2 | <%@page import="java.sql.ResultSet"%> 3 | <%@page import="java.sql.Statement"%> 4 | <%@page import="java.sql.Connection"%> 5 | <% 6 | String id = request.getParameter("userid"); String driver = 7 | "com.mysql.jdbc.Driver"; String connectionUrl = 8 | "jdbc:mysql://database-1.cxm6fgejlg3y.ap-northeast-2.rds.amazonaws.com:3306/"; 9 | String database = "javatest"; String userid = "admin"; String password = 10 | "qazWSX123"; try { Class.forName(driver); } catch (ClassNotFoundException e) { 11 | e.printStackTrace(); } Connection connection = null; Statement statement = null; 12 | ResultSet resultSet = null; %> 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | <% try{ connection = DriverManager.getConnection(connectionUrl+database, 26 | userid, password); statement=connection.createStatement(); String sql 27 | ="select id, foo, bar from testdata"; resultSet = 28 | statement.executeQuery(sql); while(resultSet.next()){ %> 29 | 30 | 31 | 32 | 33 | <% } connection.close(); } catch (Exception e) { e.printStackTrace(); } %> 34 |
session id<%=session.getId()%>
foobar
<%=resultSet.getString("foo") %><%=resultSet.getString("bar") %>
35 | 36 | 37 | -------------------------------------------------------------------------------- /mkdocs.yml: -------------------------------------------------------------------------------- 1 | # Project information 2 | site_name: CLOUDACODE 3 | site_url: https://cloudacode.com/tutorials/ 4 | site_author: KC Chang 5 | site_description: >- 6 | Introduces the process of building various applications in the cloud environment 7 | and improving development procedures with DevOps culture. 8 | 9 | # Repository 10 | repo_name: cloudacode/tutorials 11 | repo_url: https://github.com/cloudacode/tutorials 12 | edit_uri: "" 13 | 14 | # Google Analytics 15 | extra: 16 | analytics: 17 | provider: google 18 | property: G-L86XX3YR79 19 | 20 | # Configuration 21 | theme: 22 | name: material 23 | custom_dir: overrides 24 | palette: 25 | - scheme: default 26 | toggle: 27 | icon: material/weather-sunny 28 | name: Switch to dark mode 29 | - scheme: slate 30 | toggle: 31 | icon: material/weather-night 32 | name: Switch to light mode 33 | 34 | markdown_extensions: 35 | - admonition 36 | - pymdownx.highlight 37 | - meta 38 | 39 | # Page tree 40 | nav: 41 | - Home: index.md 42 | - Tutorial: 43 | - Cloud: 44 | - AWS: 45 | - cloud/aws/ec2-setup.md 46 | - cloud/aws/aws-autoscaling-group.md 47 | - cloud/aws/aws-elasticbeanstalk.md 48 | - cloud/aws/apache-tomcat-redis.md 49 | - cloud/aws/cloud9-python-docker.md 50 | - cloud/aws/aws-lightsail-container.md 51 | - cloud/aws/aws-ecs-container.md 52 | - cloud/aws/amazon-eks-setup.md 53 | - cloud/aws/aws-emr-spark-bigdata.md 54 | - GCP: 55 | - cloud/gcp/gcp-ce-setup.md 56 | - Openstack: 57 | - cloud/openstack/install-openstack.md 58 | - Python: 59 | - python/flask/simple-flask-app-mariadb.md 60 | - Kubernetes: 61 | - kubernetes/minikube-todo-app.md 62 | - kubernetes/argocd-deployment.md 63 | - DevOps: 64 | - CICD: 65 | - devops/cicd/github-aws-codebuild-dockerhub.md 66 | - devops/cicd/github-action-dockerhub.md 67 | - devops/cicd/aws-codepipeline-delivery-eb.md 68 | - devops/cicd/aws-codepipeline-delivery-ecs.md 69 | # - DevOps(Terraform): 70 | # - Kubernetes: 71 | # - Monitoring: 72 | # - CNCF: 73 | # - ETC: 74 | - Blog ⧉: https://medium.com/@cloudacode 75 | - Youtube ⧉: https://www.youtube.com/channel/UCw46J_QQ3-HrjPsSsuOSDdQ 76 | -------------------------------------------------------------------------------- /docs/cloud/gcp/gcp-ce-setup.md: -------------------------------------------------------------------------------- 1 | # Launch a GCE, Deploy Flask app 2 | 3 | **GCP 환경 구성 및 Compute Engine 구축** 4 | 5 | 이번 실습은 GCP를 통해 서비스 구성 시 가장 기본이 되는 Compute Engine 구성 실습을 통해서 GCP의 기본 서비스들을 이해 하고 GCP 콘솔 활용 방법을 익히기 위함입니다. Compute Engine 컴퓨팅 리소스 활용 및 서비스 배포를 위한 기본 작업들을 이해 할 수 있습니다. 6 | 7 | **Time to Complete: 1-2 hours** 8 | 9 | **Tutorial Prereqs:** 10 | 11 | * **GCP Account and Administrator-level or PowerUser-level access to it** 12 | 13 | ## System Architecture 14 | 15 | ## 1. Launch GCE instance 16 | 17 | https://console.cloud.google.com/compute 18 | 19 | ### Create VM instances 20 | 21 | - Name: `gcp-test` 22 | - Region: `asia-northeast3(Seoul)` Zone: `asia-northeast3-a` 23 | - Machine configuration: 인스턴스의 크기(타입) 24 | - Confidential VM service: 데이터 암호화 옵션(`변경 없음`) 25 | - Container: GKE 혹은 GCE에 컨테이너를 활용 옵션(`변경 없음`) 26 | - Boot Disk: OS 이미지(`Debian`) 27 | - Identity and API access 28 | - Service account: 인스턴스, 인스턴스에서 실행되는 앱이 다른 GCP 서비스와 상호작용 할때 필요한 서비스 계정(`변경 없음`) 29 | - Access scopes: 접근 범위(`Allow default access`) 30 | - Firewall: 방화벽 31 | - Allow HTTP traffic (`변경 없음`) 32 | 33 | ### Create a firewall 34 | 35 | Flask 서비스 포트(5000)을 custom하게 firewall에 추가가 필요 36 | 37 | 38 | ![gcp-vpc-firewall](assets/gcp-vpc-firewall.png)로 접속 하여 **Create Firewall Rule** 선택 후 아래와 같이 입력 39 | 40 | - Name: default-flask-app 41 | - Network: default 42 | - Prioity: 1000 43 | - Direction of traffic: ingress 44 | - Action on match: Allow 45 | - Targets: All instances in the network 46 | - Source filter: IP ranges 47 | - Source IP Ranges: `0.0.0.0/0` 48 | - Protocol and ports: 49 | - Specified protocols and ports: `tcp` `5000` 50 | 51 | !!! Note 52 | 만약 node.js 혹은 django 로 실습을 수행할 시에 해당 포트에 맞게 Custom TCP port 설정 변경 53 | 54 | ## 2. Access a GCE instance 55 | 56 | VM Instance 콘솔 화면 Connect 항목에 `SSH` 클릭 후 `View gcloud command` 를 통해 인스턴스 접근 57 | ![gce-connect-via-ssh](assets/gce-connect-via-ssh.png) 58 | 59 | gcloud command line 창에서 오른쪽 아래 `RUN IN CLOUD SHELL` 클릭 60 | 61 | Cloud Shell이 열리고 인스턴스 접근에 대한 커멘드 라인이 자동으로 입력되어 있으므로 추가 변경 없이 진행 하면 정상적으로 인스턴스에 접근이 됨 62 | * SSH Key 생성이 이루어지고 추가 입력값 없이 빈칸으로 진행 63 | 64 | 65 | ## 3. Run Python Flask on GCE server 66 | 67 | GCE 리눅스 서버에 접속 후 python3-pip 패키지 설치 68 | ```bash 69 | sudo apt update 70 | sudo apt install python3-pip 71 | ``` 72 | 73 | 접근한 Linux에서 Flask 설치 74 | ```bash 75 | pip3 install Flask 76 | pip3 freeze > requirements.txt 77 | ``` 78 | 79 | Flask app 파일 설정 `app.py` 80 | ```bash 81 | cat < app.py 82 | from flask import Flask 83 | app = Flask(__name__) 84 | 85 | @app.route('/') 86 | def hello_world(): 87 | return "Hello, GCE!" 88 | 89 | if __name__ == "__main__": 90 | app.run(debug=True, host='0.0.0.0', port=5000) 91 | EOF 92 | ``` 93 | 94 | Flask app 실행 95 | ```bash 96 | python3 app.py 97 | ``` 98 | 99 | GCE의 External IP를 확인 후 해당 IP에 Flask Port(5000)으로 접속 및 페이지 확인 100 | 101 | (옵션) Flask에 CSS, HTML 페이지를 구성 하고 싶을 경우 아래 코드를 참고 102 | 103 | [simple-flask-web-app](https://github.com/cloudacode/coolstuff/tree/main/simple-flask-web) 104 | 105 | 🎉 Congratulations, you have completed GCE, Flask setup tutorial -------------------------------------------------------------------------------- /docs/devops/cicd/github-action-dockerhub.md: -------------------------------------------------------------------------------- 1 | # Publishing Docker images - GitHub Action 2 | 3 | **개발 빌드 환경 구성 및 Container 빌드 자동화 실습** 4 | 5 | [GitHub Action](https://docs.github.com/en/actions)을 master 혹은 main branch로 코드가 커밋이 되면 어플리케이션을 도커로 빌드 자동화 및 도커 레지스트리([hub.docker.com](https://hub.docker.com/)) 에 이미지 등록 6 | 7 | **Time to Complete: 1 hour** 8 | 9 | **Tutorial Prereqs:** 10 | 11 | * **An Administrator-level for GitHub Repo** 12 | * **Understand what is the GitHub Actions** 13 | 14 | 15 | 16 | ## System Architecture 17 | ![github action dockerhub architecture](assets/github-action-dockerhub-architecture.png) 18 | 19 | ## 1. Create encrypted secrets for a GitHub Repo 20 | 21 | [creating-encrypted-secrets-for-a-repository](https://docs.github.com/en/actions/reference/encrypted-secrets#creating-encrypted-secrets-for-a-repository) 22 | 23 | - Name: `DOCKER_USERNAME`, Vaule: `Your DockerHub Account Name` 24 | - Name: `DOCKER_PASSWORD`, Value: `Your DockerHub Password` 25 | 26 | ## 2. Create a workflow to use actions 27 | 28 | 최상위 디렉토리 `.github/workflows/github-actions-dockerhub.yml`에 workflow 스펙을 아래와 같이 명시 29 | 30 | ```yaml 31 | name: Publish Docker image 32 | 33 | on: 34 | pull_request: 35 | types: [assigned, opened, synchronize, reopened] 36 | 37 | jobs: 38 | push_to_registry: 39 | name: Push Docker image to Docker Hub 40 | runs-on: ubuntu-latest 41 | steps: 42 | - name: Check out the repo 43 | uses: actions/checkout@v3 44 | 45 | - name: Log in to Docker Hub 46 | uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a 47 | with: 48 | username: ${{ secrets.DOCKER_USERNAME }} 49 | password: ${{ secrets.DOCKER_PASSWORD }} 50 | 51 | - name: Extract metadata (tags, labels) for Docker 52 | id: meta 53 | uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 54 | with: 55 | images: dockerhub-namespace/dockerhub-repository 56 | 57 | - name: Build and push Docker image 58 | uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 59 | with: 60 | context: . 61 | file: ./Dockerfile 62 | push: true 63 | tags: ${{ steps.meta.outputs.tags }} 64 | labels: ${{ steps.meta.outputs.labels }} 65 | ``` 66 | 67 | Line 25 번째 줄에 본인의 `dockerhub-namespace/repo-name` 으로 변경후 code commit & main branch에 merge 68 | 69 | ## 3. Verify GitHub Action 70 | 71 | - Git Branch 생성 후 코드 수정 및 Commit 72 | - GitHub에서 Main Branch로 Pull Request 수행 73 | - Pull Request 진행 화면에서 Github Action이 동작 하는지 확인 74 | ![github-action-pr](assets/github-action-pr.png) 75 | 76 | ## 4. Verify DockerHub image 77 | 78 | 이미지가 정상적으로 본인 Repo에 업로드 되었는지 확인 79 | https://hub.docker.com 80 | 81 | !!! Note 82 | workflow 스펙 파일에서 별도로 tag를 지정 하지 않았다면 pr 번호가 image tag로 부여됨 83 | 84 | ## Reference 85 | - https://docs.github.com/en/actions/guides/publishing-docker-images 86 | 87 | 88 | 🎉 Congratulations, you have completed Publishing Docker images - GitHub Action tutorial 89 | -------------------------------------------------------------------------------- /docs/cloud/aws/ec2-setup.md: -------------------------------------------------------------------------------- 1 | # Launch an EC2, Deploy Flask app 2 | 3 | **AWS EC2 구성 및 Python Flask 앱 배포** 4 | 5 | 이번 실습은 AWS를 통해 서비스 구성 시 가장 기본이 되는 EC2 구성 실습을 통해서 AWS의 기본 서비스들을 이해 하고 AWS 콘솔 활용 방법을 익히기 위함입니다. EC2로 컴퓨팅 리소스 활용 및 서비스 배포를 위한 기본 작업들을 이해 할 수 있습니다. 6 | 7 | **Time to Complete: 1-2 hours** 8 | 9 | **Tutorial Prereqs:** 10 | 11 | * **An AWS Account and Administrator-level or PowerUser-level access to it** 12 | 13 | ## System Architecture 14 | ![vpc-architecture](assets/vpc-architecture.png) 15 | 16 | ## 1. Launch EC2 instance 17 | 18 | https://ap-northeast-2.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-2 19 | 20 | ### Choose an Amazon Machine Image(AMI) 21 | 22 | Instance 의 OS 이미지를 선택하는 단계 이며 Amazon Linux, CentOS, Ubunt, WindowsOS 등 다양한 OS 이미지를 선택 가능 23 | 24 | `Amazon Linux 2 AMI (HVM), SSD Volume Type` 25 | 26 | ### Chooose an Instance Type 27 | 28 | Instance의 CPU, Memory , Network 용량을 선택 하는 단계이며 일반 인스턴트 타입외에 높은 CPU, Memory, IO 타입도 제공 29 | 30 | `t2.micro` 31 | 32 | ### Instance Details 33 | 34 | Instance가 배포되는 네트워크 환경 VPC, Subnet) 설정 35 | 36 | - Number of instances: 한번에 배포할 인스턴스의 개수이며 1로 유지 37 | - Purchasing option: Spot instances를 활용 할건지의 유무, 선택 하지 않음 38 | - Network: Default VPC 선택 39 | - Subnet: No preference 40 | - Auto-assign Public IP: 자동으로 Public IP 할당 유무를 체크 하는 부분 Enable로 선택 41 | - IAM role: EC2 인스턴스에 IAM 역할을 부여해 추후 API/ Secret key를 사용하지 않고 AWS 소스 자원을 관리 하도록 설정 하는 부분 42 | - Tenancy: 추후에 License이슈 혹은 매우 낮은 네트워크 Latency를 위해 특정 Hardware에 Instance를 몰아서 배치할 수 있는 기능, Default(Shared)로 선택 43 | 44 | ### Instance Storage 설정 45 | 46 | Instance의 Disk 용량과 추가 Disk를 선택, Root 볼륨 size와 Disk 볼륨의 유무, size를 정하는 부분 47 | 48 | 기본 `8GB`로 진행 49 | 50 | ### Add Tags 51 | 52 | AWS콘솔에서 Display 되는 Tag 의 값을 지정 하는 부분 이고 Add Tag 텝 클릭 후 값 입력 53 | (*추후 손쉽게 생성한 서버를 찾기 위함이며 기억할 수 있는 이름으로 서버 이름 변경 가능 54 | 55 | `Key: Name, Value: Web Server` 56 | 57 | ### Configure Security Group 58 | 59 | SG는 Host 레벨의 방화벽이며 Allow 정책만 가능하며 서비스할 Port 만 허용 혹은 원격 접속을 위한 접근 대역 IP 로만 제한을 통해 보안 수준을 높임 60 | 61 | Secuirty Group Name: `test-flask-sg` 62 | 63 | - SSH(22) 64 | - Type: SSH 65 | - Source: My IP or Anywhere 66 | - TCP(5000, Flask) 67 | - Type: Custom TCP 68 | - PORT: 5000 69 | - Source: My IP or Anywhere 70 | 71 | !!! Note 72 | 만약 node.js 혹은 django 로 실습을 수행할 시에 해당 포트에 맞게 Custom TCP port 설정 변경 73 | 74 | ### Review Instance Launch 75 | 76 | Instance 배포를 위해 지정한 설정값들을 리뷰 하는 단계 이며 서버에 접근을 위한 key 발급을 진행, Launch 클릭후 key pair 생성 77 | 78 | **Create a new key pair** 진행 후 Download Key Pair 79 | 80 | !!! Warning 81 | key는 재발급 되지 않으므로 안전한 곳에 key 를 저장 82 | 83 | ## 2. Monitor EC2 instance 84 | 85 | 정상적으로 Instance가 배포 되는지 EC2 Dashboard에서 확인 가능 86 | Status Checks 가 2/2가 되면 정상 배포 완료 87 | 88 | ## 3. Access EC2 instance 89 | 90 | [EC2 콘솔](https://ap-northeast-2.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-2#Instances:instanceState=running)에서 생성한 인스턴스 선택 후 **connect** 버튼을 클릭하면 터미널로 접속 가이드라인이 아래와 같이 제공 91 | 92 | ```bash 93 | ssh -i ec2-user@ 94 | ``` 95 | 96 | 만약 Windows를 사용 하고 있다면 Xshell을 활용 97 | 98 | 공식 홈페이지에서 다운로드 99 | URL: 100 | https://www.netsarang.co.kr/download/main.html 101 | 102 | 항목: Xshell5 103 | https://www.netsarang.co.kr/download/down_form.html?code=512 104 | 105 | - 새로운 세션 생성 및 사용자 인증 106 | 107 | ![xshell-private-key](assets/xshell-private-key.png) 108 | ![add-xshell-private-key](assets/add-xshell-private-key.png) 109 | ![access-ec2-instance-xshell](assets/access-ec2-instance-xshell.png) 110 | 111 | ## 4. Run Python Flask on EC2 server 112 | 113 | 접근한 Linux에서 Flask 설치 114 | ```bash 115 | pip3 install Flask 116 | pip3 freeze > requirements.txt 117 | ``` 118 | 119 | Flask app 파일 설정 `app.py` 120 | ```bash 121 | cat < app.py 122 | from flask import Flask 123 | app = Flask(__name__) 124 | 125 | @app.route('/') 126 | def hello_world(): 127 | return "Hello, EC2!" 128 | 129 | if __name__ == "__main__": 130 | app.run(debug=True, host='0.0.0.0', port=5000) 131 | EOF 132 | ``` 133 | 134 | Flask app 실행 135 | ```bash 136 | python3 app.py 137 | ``` 138 | 139 | [EC2 콘솔](https://ap-northeast-2.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-2#Instances:instanceState=running) 140 | 에서 **Public IPv4 address** 확인 혹은 리눅스 커멘드로 `curl ifconfig.me` 후 해당 IP에 Flask 포트(5000) 으로 접속 및 페이지 확인 141 | 142 | (옵션) Flask에 CSS, HTML 페이지를 구성 하고 싶을 경우 아래 코드를 참고 143 | 144 | [simple-flask-web-app](https://github.com/cloudacode/coolstuff/tree/main/simple-flask-web) 145 | 146 | 🎉 Congratulations, you have completed EC2, Flask setup tutorial -------------------------------------------------------------------------------- /docs/cloud/aws/aws-ecs-container.md: -------------------------------------------------------------------------------- 1 | # Deploy Container on Elastic Container Service 2 | 3 | **Amazon ECS를 통해 Container 배포** 4 | 5 | 이번 실습은 Amazon ECS 통해 Container를 배포하고 접근을 해보는 실습 입니다. AWS Elastic Container Service의 Cluster, Service의 직접 구성을 통해 프러덕션 어플리케이션을 구성 하고 관리 하는 방법을 이해 할 수 있습니다 6 | 7 | ![ecs-fargate-architecture](./assets/ecs-fargate-architecture.png) 8 | 9 | **Time to Complete: 0.5 hours** 10 | 11 |
12 | 13 | kakao channel add button 14 | 15 | Star 16 |
17 | 18 | **Tutorial Prereqs:** 19 | 20 | * **An AWS Account and Administrator-level or PowerUser-level access to it** 21 | * **본인이 생성한 컨테이너 이미지** [freecode-todo](https://hub.docker.com/repository/docker/cloudacode/freecodetodo), [소스 코드](https://github.com/cloudacode/FlaskIntroduction) 22 | 23 | ## 1. Task Definitions 설정 24 | 25 | 하나 혹은 여러 개의 Container로 구성된 하나의 어플리케이션을 Task정의로 지정 하며 Task 단위로 ECS에 배포 26 | ![ecs-fargate-td](./assets/ecs-fargate-td.png) 27 | 28 | ECS Dashboard 에서 [Task Definitions](https://ap-northeast-2.console.aws.amazon.com/ecs/home/taskDefinitions) 선택 후 **Create new Task Definition** 29 | 30 | - Task Definition Name: 작업 정의 이름, TD이름 31 | - Requires compatibilities: FARGATE 32 | - Task Role: Task에서 AWS 리소스에 API로 호출을 해야 할 경우 사용하는 IAM 역할, 변경없음 33 | - Network Mode: AWS Fargate에서는 awsvpc가 기본이며 그 외는 Linux는 Docker네트워크이며 Windows의 경우 NAT, Bridge모드 선택 가능, 변경없음 34 | - Operating System Family: Linux 35 | - Task memory (MiB): Container에 할당할 최대 메모리(하드 리밋)이며 ECS 인스턴스에 올라가는 Task들의 워크로드에 따라 용량 결정 필요: 0.5GB - 2GB 에서 선택 36 | - Task CPU (unit): Container용으로 예약할 CPU unit: 0.25 vCPU – 16 vCPU 중에 선택 37 | 38 | ![ecs-fargate-td-config](./assets/ecs-fargate-td-config.png) 39 | 40 | **Container Definitions** 정의 항목에 아래와 같이 실제 Container의 이름과 이미지 주소 등의 필수 요소 및 저장소, 로깅, 보안에 관련한 선택 요소 들을 지정 41 | 42 | - Container Name: 컨테이너 이름 43 | - Image: 컨테이너 이미지 URL 44 | 예) cloudacode/freecodetodo:latest 45 | - Port Mappings: 외부로 노출할 컨테이너 포트 46 | 47 | ![ecs-fargate-td-container](./assets/ecs-fargate-td-container.png) 48 | 49 | ## 2. Cluster 생성 50 | 51 | ECS Cluster [콘솔 화면](https://ap-northeast-2.console.aws.amazon.com/ecs/home/clusters)에서 Cluster 생성 52 | 53 | - Template: Networking only 54 | - Cluster Name: 클러스터 이름 55 | 56 | !!! WARN 57 | 기존에 만들어진 VPC를 활용 할 예정이므로 새롭게 Create VPC 하지 않는다 58 | 59 | ## 3. Service 설정 60 | 61 | 위에서 생성한 이름의 Cluster 클릭 후 상세 화면에서 서비스 설정 62 | 63 | ![ecs-fargate-service](./assets/ecs-fargate-service.png) 64 | 65 | ### Service 구성 66 | 67 | - Task Definition: 작업 정의 이름 68 | - Cluster: Container가 배포될 Cluster, cluster 이름 69 | - Service name: 사용할 서비스 이름 결정, service 이름 70 | - Number of tasks: 서비스에 배포할(수평 확장) Task의 개수, 1개 이상 71 | - Minimum healthy percent: 배포 시 RUNNING 상태를 유지해야 하는 서비스 내 작업 수에 대한 최소 리소스 백분율, 100 72 | - Maximum percent: 배포 시 RUNNING/ PENDING 상태를 유지할 최대 작업 수에 대한 리소스 백분율, 200 73 | - Deployments: 작업 배포 정책(Rolling, Blue/Green), Rolling update 74 | 75 | ![ecs-service-spec](./assets/ecs-service-spec.png) 76 | 77 | ### Network 구성 78 | - VPC/Subnets: 원하는 VPC와 Subnets을 지정 79 | - Security Group: Container를 외부로 노출할때 사용하는 Port를 Open(예, Flask 5000포트) 80 | - Load balancer Type: LB 타입 선택, No 81 | 82 | ### AutoScaling 구성 83 | - Service Auto Scaling: AutoScaling 설정 가능, Do not adjust 84 | 85 | 생성 완료 후 ECS Cluster 항목에서 서비스 상태 확인 (Task가 정상적으로 배포 및 Running 확인) 86 | 87 | ## 4. Service 동작 확인 88 | 89 | ![ecs-fargate-service-check](./assets/ecs-fargate-service-check.png) 90 | 91 | 서비스가 정상적으로 `ACTIVE` 상태가 확인이 되면 TASK 상세 화면에서 Public IP로 접속 92 | 93 | ![ecs-fargate-task-check](./assets/ecs-fargate-task-check.png) 94 | 95 | 해당 `URL`을 브라우저에서 접속하여 컨테이너가 정상적으로 서비스 중인지 확인 96 | 97 | ![ecs-fargate-check](./assets/ecs-fargate-check.png) 98 | 99 | ## 4. 환경 삭제 100 | 101 | ECS Cluster [콘솔 화면](https://ap-northeast-2.console.aws.amazon.com/ecs/home/clusters)에서 Cluster 삭제 102 | 103 | 🎉 Congratulations, you have completed Amazon Elastic Container Service tutorial 104 | 105 | 이 글이 유용하였다면 ⭐ Star를, 💬 1:1 질문이나 기술 관련 문의가 필요하신 분들은 클라우드어코드 카카오톡 채널 추가 부탁드립니다.🤗 106 | 107 |
108 | 109 | kakao channel add button 110 | 111 | Star 112 |
113 | 114 | 115 | -------------------------------------------------------------------------------- /docs/cloud/aws/aws-lightsail-container.md: -------------------------------------------------------------------------------- 1 | # Deploy Container on AWS Lightsail 2 | 3 | **AWS LightSail에 Container 배포** 4 | 5 | 이번 실습은 AWS LightSail 통해 Container를 배포하고 접근을 해보는 실습 입니다. AWS에서 컨테이너를 배포할수 있는 리소스중 하나인 LightSail에 대해 배워 보고 컨테이너 서비스 배포를 위한 기본 작업들을 이해 할 수 있습니다. 6 | 7 | **Time to Complete: 0.5 hours** 8 | 9 |
10 | 11 | kakao channel add button 12 | 13 | Star 14 |
15 | 16 | **Tutorial Prereqs:** 17 | 18 | * **An AWS Account and Administrator-level or PowerUser-level access to it** 19 | * **본인이 생성한 컨테이너 이미지** [freecode-todo](https://hub.docker.com/repository/docker/cloudacode/freecodetodo) 20 | * **AWS CLI 및 Lightsail Plugin설치** 21 | [설치 페이지](https://lightsail.aws.amazon.com/ls/docs/en_us/articles/amazon-lightsail-install-software#install-software-aws-cli) 22 | 23 | !!! Warning 24 | Cloud9은 CLI 버전이 1이고 IAM 권한이 제한 되기 때문에 local 개발 환경에서 실습 진행 25 | 26 | 27 | ## 1. Create a Container server on lightsail 28 | 29 | ### Lightsail의 기본적인 스펙과 확장 범위를 설정 30 | 31 | [Lightsail 스펙 페이지](https://aws.amazon.com/lightsail/pricing/?nc1=h_ls) 32 | 33 | !!! Info 34 | 실습은 nano 스펙(512 MB RAM, 0.25 vCPUs)으로 진행 35 | 36 | ```bash 37 | aws lightsail create-container-service \ 38 | --service-name --power nano --scale 1 39 | ``` 40 | 41 | [Lightsail AWS 콘솔](https://lightsail.aws.amazon.com/ls/webapp/home/containers) 에서 확인 가능 42 | ![lightsail-container-service](assets/lightsail-container-service.png) 43 | 44 | ### Continaer 이미지 다운 45 | 46 | ```bash 47 | docker pull cloudacode/freecodetodo:latest 48 | ``` 49 | 50 | 참고: `cloudacode/freecodetodo` [소스 코드](https://github.com/cloudacode/FlaskIntroduction) 51 | 52 | ### Container 이미지 업로드 53 | 54 | ```bash 55 | aws lightsail push-container-image --service-name \ 56 | --label flask-container --image cloudacode/freecodetodo:latest 57 | ``` 58 | 59 | !!! Warning 60 | output 결과로 나오는 ":devops-flask-service.flask-container.[숫자]"가 배포시 사용할 컨테이너 이미지의 정보이므로 결과 값을 저장 61 | 62 | ## 2. Deploy the container 63 | 64 | ### 컨테이너 메타데이터 파일 생성 65 | 66 | containers.json 67 | ```json 68 | { 69 | "": { 70 | "image": ":.