<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Posts on Tom Tech Notes</title>
    <link>https://tomking.xyz/posts/</link>
    <description>Recent content in Posts on Tom Tech Notes</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Sat, 25 Jul 2026 21:09:15 +1000</lastBuildDate><atom:link href="https://tomking.xyz/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>How to Survive This Crazy Ai World</title>
      <link>https://tomking.xyz/posts/how-to-survive-this-crazy-ai-world/</link>
      <pubDate>Sat, 25 Jul 2026 21:09:15 +1000</pubDate>
      
      <guid>https://tomking.xyz/posts/how-to-survive-this-crazy-ai-world/</guid>
      <description>Lets admit it, this is not best time to be a software engineer or for anyone whose job is basically sitting in front of a computer. AI is moving so fast these days, and it&amp;rsquo;s so overwhelming to a lot of us.
Earlier this year, I buried my head in the sand.
I convinced myself it wouldn&amp;rsquo;t affect me that much. I will just sit tight and see it bust just like what happened to Internet around 2000.</description>
    </item>
    
    <item>
      <title>How to Set Up AWS MCP in VS Code with AWS SSO</title>
      <link>https://tomking.xyz/posts/setup-aws-mcp/</link>
      <pubDate>Sat, 28 Mar 2026 16:00:55 +1100</pubDate>
      
      <guid>https://tomking.xyz/posts/setup-aws-mcp/</guid>
      <description>The AWS MCP examples are straightforward when you use the default AWS credential chain. My setup was a little different because I sign in with AWS SSO through a script that writes credentials to a named AWS profile.
The missing piece was telling the AWS MCP server which profile to use.
This post assumes the following are already working:
 uv is installed. Your AWS SSO sign-in flow already works. Your sign-in script writes valid credentials to a named AWS profile.</description>
    </item>
    
    <item>
      <title>How to debug Python script with uv in VS Code</title>
      <link>https://tomking.xyz/posts/config-uv-debug-in-vscode/</link>
      <pubDate>Fri, 20 Feb 2026 10:43:36 +1100</pubDate>
      
      <guid>https://tomking.xyz/posts/config-uv-debug-in-vscode/</guid>
      <description>Under .vscode folder:
Configure your launch.json as below:
{ &amp;#34;version&amp;#34;: &amp;#34;0.2.0&amp;#34;, &amp;#34;configurations&amp;#34;: [ { &amp;#34;name&amp;#34;: &amp;#34;Python: My uv Debug Test&amp;#34;, &amp;#34;type&amp;#34;: &amp;#34;debugpy&amp;#34;, &amp;#34;request&amp;#34;: &amp;#34;launch&amp;#34;, &amp;#34;program&amp;#34;: &amp;#34;./path/to/python/script.py&amp;#34;, &amp;#34;console&amp;#34;: &amp;#34;integratedTerminal&amp;#34;, &amp;#34;args&amp;#34;: [&amp;#34;--arg1&amp;#34;, &amp;#34;--arg2&amp;#34;] } ] } Copy uv project dependencies from your pyproject.toml file.
dependencies = [ &amp;#34;gql[all]&amp;lt;4&amp;#34;, &amp;#34;requests&amp;gt;=2.32.5&amp;#34;, &amp;#34;slack-sdk&amp;gt;=3.39.0&amp;#34;, &amp;#34;urllib3&amp;gt;=2.6.3&amp;#34;, ] In your Python script script.py paste the dependencies to the top of the file and comment it like below.
# /// script # requires-python = &amp;#34;&amp;gt;=3.</description>
    </item>
    
    <item>
      <title>Setup Meross Smart Garage Door Opener with Merlin Roller door</title>
      <link>https://tomking.xyz/posts/setup-meross-smart-opener/</link>
      <pubDate>Fri, 27 Dec 2024 20:56:55 +1100</pubDate>
      
      <guid>https://tomking.xyz/posts/setup-meross-smart-opener/</guid>
      <description>Instead of talking about Kubernetes and Observability, this post is all about home automation. I have long been wanting to make my garage door control a bit smarter than using the usual remotes. Recently I was finally able to found a cheap and easy solution! It all started with this Ozbargain deal.
So this post I’ll guide you through the steps I followed to set up Meross Smart Garage Door Opener (MSG100) with Merlin Roller Door (MR555MYQ).</description>
    </item>
    
    <item>
      <title>How to monitor Python app in Kubernetes with New Relic APM</title>
      <link>https://tomking.xyz/posts/setup-newrelic-kubeapp-monitoring/</link>
      <pubDate>Sun, 15 Dec 2024 16:49:38 +1100</pubDate>
      
      <guid>https://tomking.xyz/posts/setup-newrelic-kubeapp-monitoring/</guid>
      <description>Running a Python Flask web app on Kubernetes without monitoring is like driving without a dashboard: you won’t know when things go south until they do! Here’s how to set up New Relic APM for your app with minimal fuss (and a little fun).
Pre-requisites  Python and Docker ready to roll locally. A working Kubernetes cluster (local or cloud-based). A New Relic account (Free tier is fine).  Step1: Create the app Python Flask makes building a web app as easy as pie 😜.</description>
    </item>
    
    <item>
      <title>My Cka Experience</title>
      <link>https://tomking.xyz/posts/my-cka-experience/</link>
      <pubDate>Fri, 27 Sep 2024 21:02:22 +1000</pubDate>
      
      <guid>https://tomking.xyz/posts/my-cka-experience/</guid>
      <description>Recently I was able to tick CKA off my TODO list. It’s a interesting and unique exam in compare to other certs I have done in my career. Below are some points I want to share to help out folks who plan to take the exam.
Was it hard? The exam is not super difficult in my opinion. My daily job gives me plenty of exposure to different Kubernetes issues. So I was relatively comfortable with the technology itself.</description>
    </item>
    
    <item>
      <title>Fix Ubuntu APT Update Error After Kubernetes Package Repo Change</title>
      <link>https://tomking.xyz/posts/fix-apt-after-k8s-package-repo-change/</link>
      <pubDate>Mon, 11 Mar 2024 11:25:27 +1100</pubDate>
      
      <guid>https://tomking.xyz/posts/fix-apt-after-k8s-package-repo-change/</guid>
      <description>Kubernetes legacy package repositories (apt.kubernetes.io and yum.kubernetes.io) have been deprecated and frozen starting from September 13, 2023. It is strongly recommended to use the new package repositories hosted at pkgs.k8s.io. It is also required in order to install Kubernetes versions released after September 13, 2023. The new package repositories provide downloads for Kubernetes versions starting with v1.24.0. Ubuntu packages update will fail with 404 Not Found error if you have Kubernetes packages still point to the deprecated repositories.</description>
    </item>
    
    <item>
      <title>Fix Docker Container Golang Execute Format Error</title>
      <link>https://tomking.xyz/posts/fix-docker-container-golang-execute-format-error/</link>
      <pubDate>Sun, 10 Dec 2023 20:12:21 +1100</pubDate>
      
      <guid>https://tomking.xyz/posts/fix-docker-container-golang-execute-format-error/</guid>
      <description>Bumped into error Exec format error when tried to run a Go binary within a Docker container. The Go binary is compiled from my M2 Macbook. M2 Macbook uses ARM CPU arch. As a result the Go binary was by default complied with ARM CPU arch, which is different from the Docker image&amp;rsquo;s amd64 CPU arch. Hence the execution format error. To fix it, you can take two approaches.
First, we can build the Go binary within the Docker image.</description>
    </item>
    
    <item>
      <title>Kubernetes Cluster Fail to Start with Error: Error getting node</title>
      <link>https://tomking.xyz/posts/kubernetes-cluster-fail-to-start/</link>
      <pubDate>Sat, 11 Feb 2023 09:27:15 +1100</pubDate>
      
      <guid>https://tomking.xyz/posts/kubernetes-cluster-fail-to-start/</guid>
      <description>After a recent power outage, my Kubernetes cluster failed to come back online. I cannot connect to kube-apiserver through kubectl anymore. Upon checking the controller node, I can see these errors with kubelet service.
Feb 03 00:43:06 tom-lab1 kubelet[3475]: E0203 00:43:06.555186 3475 kubelet.go:2422] &amp;quot;Error getting node&amp;quot; err=&amp;quot;node \&amp;quot;tom-lab1\&amp;quot; not found&amp;quot; Feb 03 00:43:06 tom-lab1 kubelet[3475]: E0203 00:43:06.656323 3475 kubelet.go:2422] &amp;quot;Error getting node&amp;quot; err=&amp;quot;node \&amp;quot;tom-lab1\&amp;quot; not found&amp;quot; In kube-apiserver logs /var/log/container/kube-apiserver-tom-lab1_kube-system_kube-apiserver-2bec70209c1231c69a6501aea951f4ff5bed1996174028cd7e0396b2c4dc34e0.log I can see the errors below.</description>
    </item>
    
    <item>
      <title>Deploy Metrics-server in Kubernetes with TLS enabled</title>
      <link>https://tomking.xyz/posts/kubernetes-deploy-metrics-server-with-tls/</link>
      <pubDate>Thu, 10 Nov 2022 13:50:40 +1100</pubDate>
      
      <guid>https://tomking.xyz/posts/kubernetes-deploy-metrics-server-with-tls/</guid>
      <description>Metrics-server is one of the most common service deployed in their Kubernetes clusters. It is designed to be used for autoscaling purposes. In my case, I simply want to have a way to easily check my nodes status with kubectl top node.
In this post I will walk you through the steps I took to get metrics-server deployed on a local Kubernetes cluster. There are a few interesting issues I bumped into along the way.</description>
    </item>
    
    <item>
      <title>Run Pihole on Kubernetes</title>
      <link>https://tomking.xyz/posts/pihole-on-kubernetes/</link>
      <pubDate>Sun, 16 Oct 2022 18:33:35 +1100</pubDate>
      
      <guid>https://tomking.xyz/posts/pihole-on-kubernetes/</guid>
      <description>In this post I will show how I deployed Pihole onto my local Kubernetes cluster. In compare with some other online tutorials, this deployment saves Pihole configuration onto persistent volumes, so you won&amp;rsquo;t need to reconfigure everything after pod recreation. By using LoadBalancer, original client IPs are captured correctly in my Pihole instead of seeing everything was from the Cluster IP.
 If you want to learn how to build your own local Kubernetes cluster, read this post.</description>
    </item>
    
    <item>
      <title>How to remove NotReady Pods from Kubernetes</title>
      <link>https://tomking.xyz/posts/remove-notready-pods/</link>
      <pubDate>Wed, 12 Oct 2022 16:36:24 +1100</pubDate>
      
      <guid>https://tomking.xyz/posts/remove-notready-pods/</guid>
      <description>Problem You got a pod left in NotReady status due to failed helm chart installation or resource deployment.
➜ ✗ kubectl get pods NAME READY STATUS RESTARTS AGE release-0.11-kube-promethe-admission-create-7j7fz 1/2 NotReady 2 8m1s Tried to remove the pod with kubectl delete pod will just cause the pod to be recreated.
Solutions Uninstall helm chart Run helm ls -A to list all current installed charts. Check the chart status.
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION tomlab default 1 2022-09-26 09:30:38.</description>
    </item>
    
    <item>
      <title>Build Full Stack Webapp Using Cloudflare Worker and Github Pages</title>
      <link>https://tomking.xyz/posts/build-full-stack-webapp-using-worker-and-github-pages/</link>
      <pubDate>Wed, 20 Apr 2022 08:07:31 +1000</pubDate>
      
      <guid>https://tomking.xyz/posts/build-full-stack-webapp-using-worker-and-github-pages/</guid>
      <description>I have been following the COVID situation in Shanghai lately. Intentionally or not, it is surprisingly hard to find a daily chart to reflect the proper case numbers overthere. To solve this problem, I decided to build a webapp just does exactly that: a simple chart the displays Shanghai daily COVID cases that includes both symptomatic and asymptomatic cases.
The overall design includes a backend API that provides daily numbers in JSON format, and a front-end page that presents the data in the form of an area chart.</description>
    </item>
    
    <item>
      <title>Setup Kubernetes Cluster from scratch</title>
      <link>https://tomking.xyz/posts/setup-kubernetes-cluster/</link>
      <pubDate>Fri, 28 Jan 2022 17:09:43 +1100</pubDate>
      
      <guid>https://tomking.xyz/posts/setup-kubernetes-cluster/</guid>
      <description>This post I will try to go through the steps I took to build a Kubernetes cluster from scratch.
The physcial host is an old Dell Latitude laptop with 8GB memory, which runs VMware ESXi 6.7. The plan is to run 3 nodes on it with one of the VM set as master. Each server runs Ubuntu 20.04. I will skip the VM building steps here as our focus is Kubernetes.</description>
    </item>
    
    <item>
      <title>I wrote a Cloudflare CLI tool</title>
      <link>https://tomking.xyz/posts/cloudflare-cli-tool/</link>
      <pubDate>Sat, 16 Oct 2021 11:50:12 +1000</pubDate>
      
      <guid>https://tomking.xyz/posts/cloudflare-cli-tool/</guid>
      <description>I just wrote a Cloudflare CLI tool called flare 🔥! Check it out from my GitHub repo git@github.com:tomkingchen/cloudflare-cli.git.
The tool does some basic queries to Cloudflare API and retrieves information based on the parameters provided.
The reason for creating the tool is mainly to help myself to quickly identify information hard to find through Cloudflare dashboard like Firewall rule ID.
The current version is to focus on display information only rather than modifing configuration within Cloudflare.</description>
    </item>
    
    <item>
      <title>Bye Bye Google Blogger🖐, Hello Cloudflare Pages😘</title>
      <link>https://tomking.xyz/posts/move-to-cloudflare/</link>
      <pubDate>Sat, 04 Sep 2021 11:50:12 +1000</pubDate>
      
      <guid>https://tomking.xyz/posts/move-to-cloudflare/</guid>
      <description>I had enough of Google Blogger! It has terrible editing UI for and I constantly receiving SPAM comments for my posts😤. Time to move my blog off to somewhere better! I was thinking to run a Wordpress server. Though I think it&amp;rsquo;s way cooler to run my blog simplely without worrying about backend infrastructure.
After look around, I ended up using Cloudflare Pages to publish my blog. This allows me to write my posts with Markdown and then generate static html pages using Hugo.</description>
    </item>
    
    <item>
      <title>Setup Cloudflare for S3 Bucket</title>
      <link>https://tomking.xyz/2021/08/setup-cloudflare-for-s3-bucket.html</link>
      <pubDate>Sat, 14 Aug 2021 22:38:00 -0700</pubDate>
      
      <guid>https://tomking.xyz/2021/08/setup-cloudflare-for-s3-bucket.html</guid>
      <description>One way to improve website performance is to use CDN to distribute the static contents of your site. S3 is a common place to host such type contents. In this post, I will show you how to publish a S3 bucket using Cloudflare. In fact, the screen shots used in this blogpost is published exactly through this manner.
Setup S3 Bucket Permissions This is an optional step which adds a S3 bucket policy to your bucket.</description>
    </item>
    
    <item>
      <title>Setup Cloudflare for AWS API Gateway</title>
      <link>https://tomking.xyz/2021/06/setup-cloudflare-for-aws-api-gateway.html</link>
      <pubDate>Sun, 27 Jun 2021 00:25:00 -0700</pubDate>
      
      <guid>https://tomking.xyz/2021/06/setup-cloudflare-for-aws-api-gateway.html</guid>
      <description>In this post I will show how to setup Cloudflare for a Serverless app built with AWS API Gateway and Lambda. For demonstration, I use a simple web app I built (rona.tomking.xyz). The app is hosted in AWS Sydney region. It displays daily Victoria COVID case and that&amp;rsquo;s it.
To use Cloudflare, I have signed up a free Cloudflare account. The first site can be added for free with following features.</description>
    </item>
    
    <item>
      <title>Automate EC2 Instance Security Group Rules Update</title>
      <link>https://tomking.xyz/2021/06/automate-ec2-instance-security-group.html</link>
      <pubDate>Fri, 04 Jun 2021 22:47:00 -0700</pubDate>
      
      <guid>https://tomking.xyz/2021/06/automate-ec2-instance-security-group.html</guid>
      <description>Ever come into the situation where you need to whitelist a long list of IPs for a EC2 instance? It can be painful to add them manually one by one. On top of that, what if these IPs change on a regular basis? You are in luck! I will show you how to update Security Group rules automatically using Python🐍.
Here&amp;rsquo;s my use case. I got an EC2 instance takes syslog feeds from VMWare&amp;rsquo;s WorkspaceOne.</description>
    </item>
    
    <item>
      <title>Setup Splunk Universal Forwarder with TLS</title>
      <link>https://tomking.xyz/2021/05/setup-splunk-universal-forwarder-with.html</link>
      <pubDate>Fri, 21 May 2021 18:23:00 -0700</pubDate>
      
      <guid>https://tomking.xyz/2021/05/setup-splunk-universal-forwarder-with.html</guid>
      <description>One of the best practice to setup Splunk Universal Forwarder (UF) is to encrypt incoming log traffic with TLS. This is especially important if your intake is from an external source on Internet, e.g from a SaaS solution. In this blog I will demostrate the steps to get this setup. First, we will create a public A DNS record for the UF. This is because our UF will be receiving logs from Internet.</description>
    </item>
    
    <item>
      <title>Use PowerShell to delete SPAM Blogger comments</title>
      <link>https://tomking.xyz/2021/02/work-with-google-oauth2-flow-and.html</link>
      <pubDate>Sat, 27 Feb 2021 21:29:00 -0800</pubDate>
      
      <guid>https://tomking.xyz/2021/02/work-with-google-oauth2-flow-and.html</guid>
      <description>I haven&amp;rsquo;t been very diligent on maintaining this blog. There has been quite a few SPAM comments accumulated on my posts. I am going to turn on moderation to block those. But I need a way to clean all those existing SPAM comments. So over the weekend, I wrote this PowerShell script to do just that. In the end, it will probably take less time if I just manually all the cleanup manually.</description>
    </item>
    
    <item>
      <title>Use Ansible to update Splunk Universal Forwarder Configuration</title>
      <link>https://tomking.xyz/2021/02/use-ansible-to-update-splunk-universal.html</link>
      <pubDate>Sat, 20 Feb 2021 20:55:00 -0800</pubDate>
      
      <guid>https://tomking.xyz/2021/02/use-ansible-to-update-splunk-universal.html</guid>
      <description>Today we will look at how to use Ansible to update Splunk UF (Universal Forwarder) configuration. The benefits of using Ansible to achive this are:
- Save the hassel to manually modify conf files of syslog-ng and splunk uf.
- Codify Splunk UF configuratoin, so they can be version controlled via GitHub.
- Automate multiple UFs update without the need to ssh to each single server. - The playbook can also be used to configure newly provisioned Spunk UF.</description>
    </item>
    
    <item>
      <title>OWA and ECP failure after Install Exchange 2016 CU17 </title>
      <link>https://tomking.xyz/2020/11/owa-and-ecp-failure-after-install.html</link>
      <pubDate>Mon, 02 Nov 2020 21:07:00 -0800</pubDate>
      
      <guid>https://tomking.xyz/2020/11/owa-and-ecp-failure-after-install.html</guid>
      <description>I recently ran into an issue after update Exchange 2016 from CU15 to CU17. The upgrade installation took around an hour, but was eventually completed successfully according to the Installation Wizard at least. When I tried to access ECP, I got the error below even before the login page shows up. At the meantime, Exchange Management Shell is inaccessible due to the error.

In the eventlog, there are lots of 1003 errors relate to MSExchange Front End HTTP Proxy.</description>
    </item>
    
    <item>
      <title>Package and deploy a PowerShell Lambda function with custom modules</title>
      <link>https://tomking.xyz/2020/06/package-and-deploy-powershell-lambda.html</link>
      <pubDate>Sat, 06 Jun 2020 05:20:00 -0700</pubDate>
      
      <guid>https://tomking.xyz/2020/06/package-and-deploy-powershell-lambda.html</guid>
      <description>Recently I had the need to create a Lambda function with PowerShell 7. The function is to synchronize data between two REST APIs. It&amp;rsquo;s fairly simple, but does need to use a custom made module. I spent quite bit time to find out how to deploy PowerShell Lambdas with custom modules. Thought might write a guide to help people want to do the same. My script is fairly simple, it gets a list of users from one API and then convert it to a XML format object and export into the target API.</description>
    </item>
    
    <item>
      <title>Test out PowerShell 7 new features in WSL1</title>
      <link>https://tomking.xyz/2020/03/test-out-powershell-7-new-features-in.html</link>
      <pubDate>Sat, 21 Mar 2020 17:59:00 -0700</pubDate>
      
      <guid>https://tomking.xyz/2020/03/test-out-powershell-7-new-features-in.html</guid>
      <description>Finally, PowerShell 7 is now GA! As a heavy WSL user, I was keen to see how some of its new features will work in WSL1 (Ubuntu 4.4.0-18362-Microsoft). Below are the tests I have done.
Installation in WSL
Download the binary from Github repo to a local folder /usr/share/powershell
sudo wget https://github.com/PowerShell/PowerShell/releases/download/v7.0.0/powershell-7.0.0-linux-x64.tar.gz Untar the file
sudo tar xzvf powershell-7.0.0-linux-x64.tar.gz
Add path for your shell
export PATH=/usr/share/PowerShell:$PATH
Reload .bashrc
source .bashrc</description>
    </item>
    
    <item>
      <title>Monitor AWS VPC Connectivity with Python</title>
      <link>https://tomking.xyz/2019/12/how-to-monitor-aws-direct-connect.html</link>
      <pubDate>Thu, 12 Dec 2019 13:14:00 -0800</pubDate>
      
      <guid>https://tomking.xyz/2019/12/how-to-monitor-aws-direct-connect.html</guid>
      <description>We recently have the need to cutover our AWS Direct Connects to a different vendor. In order to carry out the change, I was tasked to find a way to monitor Direct Connect connectivities to our on premise network from our hundreds of VPCs in AWS.
After some discussion with our network engineers and security team, the solution I end up using is to deploy a single EC2 instance into each those VPCs that has a connection to VGW.</description>
    </item>
    
    <item>
      <title>RDP to EC2 with SSM Port Forwarding</title>
      <link>https://tomking.xyz/2019/10/rdp-to-ec2-with-ssm-port-forwarding.html</link>
      <pubDate>Sat, 19 Oct 2019 14:05:00 -0700</pubDate>
      
      <guid>https://tomking.xyz/2019/10/rdp-to-ec2-with-ssm-port-forwarding.html</guid>
      <description>Say you have a bunch of Windows servers hosted in AWS. The VPC they are in does not have VPN or Direct Connect connect back to your on premse network. Expose RDP port through public IP for these Windows servers is a very good way to get hacked. So how can we securely connect to the servers in this kind setup?
Fortunately we have SSM for the rescue. In August, AWS announced a new feature for SSM Session Manager, which allows us to securely create tunnels between your EC2 instances deployed in private subnets and your local machine.</description>
    </item>
    
    <item>
      <title>VMware Site Recovery Manager Multi-Site Pair Deployment</title>
      <link>https://tomking.xyz/2019/09/vmware-site-recovery-manager-multi-site.html</link>
      <pubDate>Fri, 06 Sep 2019 23:22:00 -0700</pubDate>
      
      <guid>https://tomking.xyz/2019/09/vmware-site-recovery-manager-multi-site.html</guid>
      <description>I was recently involved in a data center migration project, which used VMware SRM (Site Recovery Manager) as the migration tool to move virtual machines between 3 DCs. The diagram below shows how the setup looks like. The version of SRM is 8.1.
[SiteA] &amp;lt;&amp;mdash;-&amp;gt; [SiteB] &amp;lt;&amp;mdash;-&amp;gt; [SiteC]
VMware documentation refer the above scenario as Shared Recovery Site. For each site-pair, you will need to deploy individual SRM server to ensure the SRM Plug-in ID is unique to that pair.</description>
    </item>
    
    <item>
      <title>How Secure is RDP?</title>
      <link>https://tomking.xyz/2019/06/hands-up-if-you-have-following.html</link>
      <pubDate>Sun, 23 Jun 2019 03:06:00 -0700</pubDate>
      
      <guid>https://tomking.xyz/2019/06/hands-up-if-you-have-following.html</guid>
      <description>Hands up if you have following setup/practices in your organization:
  A RDP server (Terminal server) that everyone can jump onto. Apart from the IT admins, some users have local admin rights on the box, just so they can run or configure a particular application.
  To help troubleshooting an issue, your IT admins often RDP to servers directly from user&amp;rsquo;s laptop, which the user is a local admin.</description>
    </item>
    
    <item>
      <title>Use Terraform to build server in VMware</title>
      <link>https://tomking.xyz/2019/05/use-terraform-to-build-server-in-vmware.html</link>
      <pubDate>Sat, 18 May 2019 00:25:00 -0700</pubDate>
      
      <guid>https://tomking.xyz/2019/05/use-terraform-to-build-server-in-vmware.html</guid>
      <description>Like Cloud Formation and ARM Templates, Terraform enables the way of Infrastructure as Code to provision resources in Clouds, but it also works with on premise infrastructures like VMware vSphere and NSX. I recently have been working on the automation of on premise server provision process. The goal is to provision a Ubuntu server on our vSphere 6.5 environment with iPerf3 installed and configured.
It surprises me that there aren’t many useful resources/examples out there when comes to using Terraform with VMware.</description>
    </item>
    
    <item>
      <title>Sydney AWS Summit 2019 - My Experience</title>
      <link>https://tomking.xyz/2019/05/sydney-aws-summit-2019-my-experience.html</link>
      <pubDate>Fri, 03 May 2019 21:41:00 -0700</pubDate>
      
      <guid>https://tomking.xyz/2019/05/sydney-aws-summit-2019-my-experience.html</guid>
      <description>The past week I attended AWS Summit Sydney for three days. It&amp;rsquo;s such an action packed show. Full of brilliant speakers and tons of interesting workshops. I feel so hard to decide on my agenda. In the end, based on the technologies I am interested in and the relevance to my job these are sessions I went for.
AWS Innovation Day
Keynote - I was late for it. But still It was good to hear the story of Qantas and learn about how they improve performance and efficiency with AWS.</description>
    </item>
    
    <item>
      <title>Setup Cross Account S3 Access for Cloudberry Drive</title>
      <link>https://tomking.xyz/2019/04/setup-cross-account-s3-access-for.html</link>
      <pubDate>Sat, 13 Apr 2019 16:05:00 -0700</pubDate>
      
      <guid>https://tomking.xyz/2019/04/setup-cross-account-s3-access-for.html</guid>
      <description>I recently run into a scenario, which one of EC2 instances in our production AWS account (IT) need to access a S3 bucket hosted in a separate account (Marketing). The EC2 instance is a Windows 2008 R2 server. It runs Cloudberry Drive to map the S3 bucket as a local volume for a local application to retrieve the data off it.
The easiest way to make this work is to create an IAM user in the and assign it with Access keys.</description>
    </item>
    
    <item>
      <title>The Un-documented Way to Setup AWS SSO with Okta</title>
      <link>https://tomking.xyz/2019/02/the-un-documented-way-to-setup-aws-sso.html</link>
      <pubDate>Fri, 22 Feb 2019 21:22:00 -0800</pubDate>
      
      <guid>https://tomking.xyz/2019/02/the-un-documented-way-to-setup-aws-sso.html</guid>
      <description>In this article I would like to share an un-documented way of setting up AWS SSO by using Okta.In case you don’t know what Okta is. It is one of the popular identity management solutions out in the market. It provides Identity as a service through its Web portal and APIs.
There is a detailed document provided by Okta walks through steps of how to setting up SAML SSO between your AWS accounts and Okta.</description>
    </item>
    
    <item>
      <title>Infrastructure as Code with CloudFormation</title>
      <link>https://tomking.xyz/2019/01/infrastructure-as-code-with.html</link>
      <pubDate>Fri, 04 Jan 2019 22:37:00 -0800</pubDate>
      
      <guid>https://tomking.xyz/2019/01/infrastructure-as-code-with.html</guid>
      <description>Recently I was working on a server migration task, which is to move a Windows IIS web server to AWS. The server’s sole purpose is to redirect bunch of the short URLs to some of the most frequently used long URLs. E.g. if user type in “o365/“ in browser, it will be redirected to https://portal.office365.com.
Instead of uplifting the whole Windows server to AWS, I have decided to use a Linux server with Apache to replace this box.</description>
    </item>
    
    <item>
      <title>Use Microsoft Graph API to extract Excel file contents</title>
      <link>https://tomking.xyz/2018/12/use-microsoft-graph-api-to-extract.html</link>
      <pubDate>Sun, 09 Dec 2018 02:40:00 -0800</pubDate>
      
      <guid>https://tomking.xyz/2018/12/use-microsoft-graph-api-to-extract.html</guid>
      <description>Recently I was working on automating a process that extracts contents from a Excel spreadsheet stored in Office 365 SharePoint Online. It took me quite sometime to figure out how to get this done. I thought there must be people out there looking for the same thing. Hence here is the post.
Based on the requirements, the Excel file needs to be shared among few specified staff. They should be able to modify the spreadsheet with their Office 365 accounts.</description>
    </item>
    
    <item>
      <title>Understand OAuth and Open ID Connect</title>
      <link>https://tomking.xyz/2018/11/understand-oauth-and-open-id-connect.html</link>
      <pubDate>Sat, 17 Nov 2018 19:39:00 -0800</pubDate>
      
      <guid>https://tomking.xyz/2018/11/understand-oauth-and-open-id-connect.html</guid>
      <description>IT world is always full of buzz words. “Digital Transformation”, “Automation”, “Blockchain”, “AI”, “Machine Learning”, etc, etc… We like to talk about them all the time, to show that we are not out of touch, we are up to date. Although I have to admit some of those words are used so often yet so few people have the really proper understanding of the actual technologies themselves. I believe OAuth is one of them.</description>
    </item>
    
    <item>
      <title>How did I pass AWS Solution Architect Professional Exam in just 3 weeks</title>
      <link>https://tomking.xyz/2018/10/how-did-i-pass-aws-solution-architect.html</link>
      <pubDate>Fri, 26 Oct 2018 12:08:00 -0700</pubDate>
      
      <guid>https://tomking.xyz/2018/10/how-did-i-pass-aws-solution-architect.html</guid>
      <description>This post will be a bit different from my usual technical walk through. I recently passed AWS Solution Architect Professional exam with just three weeks of preparation. In this post, I want to share my experience with the exam itself as well as how I prepared for it. Hopefully you will find it somewhat useful.
I booked the exam on 1st Oct 2018. Honestly I didn’t expect myself to pass at that time.</description>
    </item>
    
    <item>
      <title>Deploy Docker Image with AWS ECS (Part 2)</title>
      <link>https://tomking.xyz/2018/10/deploy-docker-image-with-aws-ecs-part-2.html</link>
      <pubDate>Tue, 16 Oct 2018 20:34:00 -0700</pubDate>
      
      <guid>https://tomking.xyz/2018/10/deploy-docker-image-with-aws-ecs-part-2.html</guid>
      <description>In Part 1 we uploaded a Docker image to AWS ECR. In this post, we will complete building the ECS Cluster and deploy the container image onto the cluster.
Note: The lab I worked on was recreated. The container image was renamed from webfront to testweb.
Before we start, you need to understand some ECS basic concepts.
Task Definition
A task definition describes one or more containers, their relationships, how they should be launched etc.</description>
    </item>
    
    <item>
      <title>Create a PowerShell Module</title>
      <link>https://tomking.xyz/2018/09/create-powershell-module.html</link>
      <pubDate>Thu, 27 Sep 2018 02:18:00 -0700</pubDate>
      
      <guid>https://tomking.xyz/2018/09/create-powershell-module.html</guid>
      <description>Recently I came across an issue on our Hyper-V Cluster. One of the VM was stuck in the “Stopping” state. I had to force the VM to shutdown by kill its process on the Hyper-V host. To do so, I first find out the VM’s GUID and then kill the process with the same GUID. Needless to say, the whole process can be achieved with the PowerShell commands below.
\# Get the VM GUID and find the process with the GUID  $VM \= Get-VM \-Name $VMName \-ErrorAction Stop $VMGUID \= $VM.</description>
    </item>
    
    <item>
      <title>Build a PDC in Azure with DSC</title>
      <link>https://tomking.xyz/2018/09/build-pdc-in-azure-with-dsc.html</link>
      <pubDate>Fri, 07 Sep 2018 17:19:00 -0700</pubDate>
      
      <guid>https://tomking.xyz/2018/09/build-pdc-in-azure-with-dsc.html</guid>
      <description>There are a lot ARM templates out there can do this. But in this post, we will go through the nitty gritty of using DSC to automate the PDC setup. Before we begin, I assume you already know what DSC is and does. Otherwise, check it out here.
First, let’s build a new VM in Azure with these PowerShell commands. In this case, the VM will have direct Internet and can be accessed via Internet directly.</description>
    </item>
    
    <item>
      <title>Install AWS CLI on WSL Ubuntu</title>
      <link>https://tomking.xyz/2018/09/install-aws-cli-on-wsl-ubuntu.html</link>
      <pubDate>Sat, 01 Sep 2018 03:43:00 -0700</pubDate>
      
      <guid>https://tomking.xyz/2018/09/install-aws-cli-on-wsl-ubuntu.html</guid>
      <description>Here are the steps I took to get AWS CLI installed on my WSL Ubuntu.
Before we install AWS CLI package itself, we need to get Python package manager pip installed first.
Download pip install script. Notice I use –k here, this is because I am running this behind company proxy, the proxy changes HTTPS certificate to its own certificate. Without –k the command will fail. You can leave it out if you have direct Internet access</description>
    </item>
    
    <item>
      <title>Deploy Docker Image with AWS ECS (Part 1)</title>
      <link>https://tomking.xyz/2018/08/deploy-docker-image-with-aws-ecs-part-1.html</link>
      <pubDate>Fri, 24 Aug 2018 13:00:00 -0700</pubDate>
      
      <guid>https://tomking.xyz/2018/08/deploy-docker-image-with-aws-ecs-part-1.html</guid>
      <description>One of the things I have been working on is to help our developers to containerize their applications and deploy them to AWS ECS. In this post, I will walk through the steps to upload a Docker image to AWS ECR (Elastic Container Repository).
As the first step, we need to provision the ECR with CloudFormation template.
Below is a simple CFN template written in YAML.
AWSTemplateFormatVersion: &amp;#34;2010-09-09&amp;#34; Description: \&amp;gt; Play stack Parameters: RepoName: Default: tomrepo Description: ECR Repoistory Name Type: String \# required ConstraintDescription: must be a name Resources: myrepo: Type: AWS::ECR::Repository Properties: RepositoryName: !</description>
    </item>
    
    <item>
      <title>Azure - Update Existing RSG with ARM Template</title>
      <link>https://tomking.xyz/2018/08/azure-update-existing-rsg-with-arm.html</link>
      <pubDate>Fri, 10 Aug 2018 14:03:00 -0700</pubDate>
      
      <guid>https://tomking.xyz/2018/08/azure-update-existing-rsg-with-arm.html</guid>
      <description>Do you ever find yourself face this kind the situation: You are told to provision new resources with ARM templates to an existing resource group that already has VMs and vNets built and running. How can you add new subnets and VMs to the resource group without breaking those ones already there?
Unlike AWS Cloud Formation Templates, Microsoft ARM Templates do not provide “Update” option for past deployments. In order to modify the existing environment, the usual option is to make the change through CLI, PowerShell or Azure portal.</description>
    </item>
    
    <item>
      <title>Monitor Office 365 Outages with Twitter</title>
      <link>https://tomking.xyz/2018/07/monitor-office-365-outages-with-twitter.html</link>
      <pubDate>Sat, 28 Jul 2018 05:29:00 -0700</pubDate>
      
      <guid>https://tomking.xyz/2018/07/monitor-office-365-outages-with-twitter.html</guid>
      <description>Office 365 has high SLAs (the latest English version) backed by Microsoft’s excellent Azure Cloud. However, like every other cloud services, there is always the chance for something unexpected to happen.
This year April Office 365 had a major hiccup to its service. Its Asia Pacific backend Azure AD authentication went haywire. As a result, users lost access all O365 services. To make it worse, the usual Office 365 monitoring channel: Office 365 dashboard was not accessible due to this fault.</description>
    </item>
    
    <item>
      <title>Over the Wall - with help from Azure</title>
      <link>https://tomking.xyz/2018/07/over-wall-with-help-from-azure.html</link>
      <pubDate>Sun, 22 Jul 2018 22:01:00 -0700</pubDate>
      
      <guid>https://tomking.xyz/2018/07/over-wall-with-help-from-azure.html</guid>
      <description>I had a long holiday in China recently. It had been a fun and eyes opening trip. Feels like the whole nation is in the middle of a “technology revolution”. Among all, Internet has become one of the core driving force. But while Wifi beomces a life essential here, the infamous Great Firewall (GFW) is also getting more effective. After tried numbers of paid and free VPN providers, I just could not find a reliable VPN service to simply let me post a picture on Facebook.</description>
    </item>
    
    <item>
      <title>Setup AWS SSO CLI &amp; API Access</title>
      <link>https://tomking.xyz/2018/06/setup-aws-sso-cli-api-access.html</link>
      <pubDate>Mon, 25 Jun 2018 17:24:00 -0700</pubDate>
      
      <guid>https://tomking.xyz/2018/06/setup-aws-sso-cli-api-access.html</guid>
      <description>In my last article, I discussed the steps to setup AWS SSO through Azure AD. By using Azure AD app roles, we are able to use our Azure AD accounts to access AWS Console. But with this measure, you will find there is no option in AWS IAM to generate Access Key and Secrete for CLI and API access.
Fortunately, we are not the only ones out there have this problem.</description>
    </item>
    
    <item>
      <title>Setup SSO Access to AWS Console with Azure AD</title>
      <link>https://tomking.xyz/2018/06/setup-sso-access-to-aws-console-with.html</link>
      <pubDate>Thu, 21 Jun 2018 23:05:00 -0700</pubDate>
      
      <guid>https://tomking.xyz/2018/06/setup-sso-access-to-aws-console-with.html</guid>
      <description>As organization acquires more AWS accounts, it becomes quite a challenge for IT to manage the access to all those accounts. Instead of dealing with individual IAM accounts across multiple accounts. We need an identity solution to simplify the user access provision and removal process.
AWS itself offers a service called AWS SSO, which allows integrate AWS access with on premise AD through SAML. However, the service does incur charges and will require provision of an AD Connect appliance in AWS, if you don&amp;rsquo;t already have ADFS in place(Yes, it has the same name as Azure AD Connect).</description>
    </item>
    
    <item>
      <title>Migrate Azure AD Connect Between AD Forests</title>
      <link>https://tomking.xyz/2018/05/migrate-azure-ad-connect-between-ad.html</link>
      <pubDate>Thu, 10 May 2018 04:22:00 -0700</pubDate>
      
      <guid>https://tomking.xyz/2018/05/migrate-azure-ad-connect-between-ad.html</guid>
      <description>Migrate Azure AD Connect Between AD Forests
I was recently involved in an AD forest migration project for one of our customers. As part of the requirements, we need to move the existing AD Connect server to a newly created AD forest. While the process itself is pretty straight forward, I do notice there aren&amp;rsquo;t many online resource out there detail the whole process. So to make things even easier for the folks out there, I will share the steps I took to complete this AD Connect migration.</description>
    </item>
    
    <item>
      <title>On Premise Mailbox user missing in Exchange Online GAL</title>
      <link>https://tomking.xyz/2015/11/on-premise-mailbox-user-does-not-show.html</link>
      <pubDate>Sun, 01 Nov 2015 20:12:00 -0800</pubDate>
      
      <guid>https://tomking.xyz/2015/11/on-premise-mailbox-user-does-not-show.html</guid>
      <description>Ran into an interesting issue with one of our Exchange Online customer. Thought it probably worth sharing with the solution I found.
The customer has an Exchange Hybrid setup. Recently some of Office 365 Exchange Online users complain they cannot email to a particular on premise mailbox: Paul.Smith@contoso.com. The user bascialy does not show up in Exchange Online GAL. The on premise mailbox is working fine and other on premise staff can send emails to it without issue.</description>
    </item>
    
    <item>
      <title>Enable local timestamp on Office 365 SharePoint site</title>
      <link>https://tomking.xyz/2015/09/enable-local-timestamp-on-office-365.html</link>
      <pubDate>Mon, 14 Sep 2015 21:01:00 -0700</pubDate>
      
      <guid>https://tomking.xyz/2015/09/enable-local-timestamp-on-office-365.html</guid>
      <description>Recently I received some complains from our US users about the timestamp of our SharePoint site hosted in Office 365. The timestamp of the documents and folders on the site are all showing Australia Eastern time for them. It takes me sometime to find out how to allow each individual user to see their local timestamp. This requires some setting changes from the user end. Here is what needs to be done.</description>
    </item>
    
    <item>
      <title>Annoying Office 365 issues: Username won&#39;t sync through DirSync</title>
      <link>https://tomking.xyz/2014/06/annoying-office-365-issues-username.html</link>
      <pubDate>Wed, 18 Jun 2014 18:03:00 -0700</pubDate>
      
      <guid>https://tomking.xyz/2014/06/annoying-office-365-issues-username.html</guid>
      <description>It happens to me quite a few times. After synced On-Premise AD user objects into Office365 through DirSync, users&#39; specified UPN will not be synced correctly into Office 365.
Tried all the suggested tricks from Office 365 forum. None of them worked. I even tried to re-configure our DirSync settings. But the username in O365 just refuse to change. After banging my head on this issue for a few days. Eventually I figured it out, the solution is simply to revoke any O365 licenses assigned to the user.</description>
    </item>
    
    <item>
      <title>Receive error: Target mailbox doesn&#39;t have an SMTP proxy matching &#39;.mail.onmicrosoft.com&#39; when move mailbox to Office 365</title>
      <link>https://tomking.xyz/2014/04/office-365-exchange-hybrid-deployment.html</link>
      <pubDate>Sun, 06 Apr 2014 23:51:00 -0700</pubDate>
      
      <guid>https://tomking.xyz/2014/04/office-365-exchange-hybrid-deployment.html</guid>
      <description>Recently I was working on Exchange Hybrid Deployment for one of our customer. The Hybrid Configuration process itself went smoothly. No errors for HCW. The problems came when I tried to move mailbox to Exchange Online. The migration fails with error:
Target mailbox doesn&amp;rsquo;t have an SMTP proxy matching &amp;lsquo;.mail.onmicrosoft.com&amp;rsquo;&amp;quot;
To check that I ran the following command against the On-premise Exchange.
Get-Mailbox &amp;ldquo;O365 Test5&amp;rdquo; | fl and check the EmailAddress filed</description>
    </item>
    
  </channel>
</rss>
