<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Jonathan Wong</title>
    <description>The latest articles on Forem by Jonathan Wong (@jonathan78wong).</description>
    <link>https://forem.com/jonathan78wong</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3871202%2F343e4457-180b-4eab-af90-04c5935b3567.jpg</url>
      <title>Forem: Jonathan Wong</title>
      <link>https://forem.com/jonathan78wong</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jonathan78wong"/>
    <language>en</language>
    <item>
      <title>Technical Deep Dive: How I Delivered Zero Trust Security for a Client’s Legacy PHP System — Without Rewrites, Downtime, or...</title>
      <dc:creator>Jonathan Wong</dc:creator>
      <pubDate>Tue, 14 Apr 2026 19:26:40 +0000</pubDate>
      <link>https://forem.com/jonathan78wong/technical-deep-dive-how-i-delivered-zero-trust-security-for-a-clients-legacy-php-system-without-hc</link>
      <guid>https://forem.com/jonathan78wong/technical-deep-dive-how-i-delivered-zero-trust-security-for-a-clients-legacy-php-system-without-hc</guid>
      <description>&lt;p&gt;This section expands on the technical architecture and implementation behind my recent Zero Trust case study:&lt;strong&gt; &lt;a href="https://blog.jonanata.com/how-i-delivered-zero-trust-security-for-a-clients-legacy-php-system-without-rewrites-downtime-or-big-costs/" rel="noopener noreferrer"&gt;How I Delivered Zero Trust Security for a Client’s Legacy PHP System — Without Rewrites, Downtime, or Big Costs – Behind the Build&lt;/a&gt;&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;Below is the high‑level architecture diagram:  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jonanata.com%2Fwp-content%2Fuploads%2F2026%2F04%2Farchitecture-1-1024x683.png" class="article-body-image-wrapper"&gt;&lt;img width="800" height="534" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.jonanata.com%2Fwp-content%2Fuploads%2F2026%2F04%2Farchitecture-1-1024x683.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS Layer — Role‑Based Access + Network Isolation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The AWS environment is built around least privilege, no public exposure, and segmented trust boundaries.  We enforce this through IAM roles, security groups, resource‑level permissions, and Cloudflare Tunnel. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Resources&lt;/em&gt;  &lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1. EC2 (api-production) — API Server with No Public IP&lt;/p&gt;

&lt;p&gt;This EC2 instance runs the PHP API and sits entirely inside a private subnet.  It has no public IP, no inbound rules, and no exposed ports. The only way it communicates with the internet is through Cloudflare Tunnel.&lt;/p&gt;

&lt;p&gt;Cloudflare Tunnel works because:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The EC2 instance initiates an outbound TLS connection to Cloudflare&lt;/li&gt;



&lt;li&gt;Cloudflare never needs to reach into AWS  &lt;/li&gt;



&lt;li&gt;No public IP, no inbound SG rules, and no NAT Gateway are required&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This outbound‑only model eliminates the attack surface while still allowing global access.  &lt;br&gt;Cloudflare Tunnel setup: &lt;/p&gt;

&lt;p&gt;A. Install the cloudflared  &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg \
| sudo tee /usr/share/keyrings/cloudflare.gpg &amp;gt;/dev/null 

echo "deb [signed-by=/usr/share/keyrings/cloudflare.gpg] https://pkg.cloudflare.com/cloudflared jammy main" \
| sudo tee /etc/apt/sources.list.d/cloudflared.list  

sudo apt update
sudo apt install cloudflared  &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;B. Cloudflare Login and authentication. This command generates a one‑time login URL that authenticates your machine with Cloudflare and authorizes this cloudflared instance. During the process, Cloudflare downloads a “cert.pem” file, which the CLI uses later when creating and managing tunnels.  &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// Please log in to your Cloudflare dashboard before running the command below. Otherwise, you will be redirected to the Cloudflare login page and the authentication flow will not complete.  

cloudflared tunnel login &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;C. Create Cloudflare tunnel. This command create Cloudflare tunnel, and returns a tunnel ID in the format xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx1234  &lt;br&gt;## Make sure to copy the tunnel ID for use in subsequent configuration steps  &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cloudflared tunnel create api-production-cf-tunnel  &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E. Create tunnel DNS record. This command creates the DNS record for in Cloudflare. You should see a new ‘tunnel’ DNS record appear automatically in the Cloudflare dashboard. There is no need to manually add the record yourself.    &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cloudflared tunnel route dns api-production-cf-tunnel yourdomain.com with value xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx1234.cfargotunnel.com &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;D. Create tunnel runtime configurations  &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;nano ~/.cloudflared/config.yaml &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The settings  &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;tunnel: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx1234        # The tunnel ID returned by Cloudflare
credentials-file: /etc/cloudflared/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx1234.json  # Tunnel credentials

ingress:
  - hostname: yourdomain.com                        # Public hostname
    service: http://localhost:80                    # Local service to forward to
  - service: http_status:404                        # Default fallback  &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;F. Start the Cloudflare tunnel  &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;## save the configuration  
sudo mkdir -p /etc/cloudflared 
sudo mv ~/.cloudflared/config.yml /etc/cloudflared/
sudo mv ~/.cloudflared/*.json /etc/cloudflared/  
sudo chown root:root /etc/cloudflared/config.yml
sudo chown root:root /etc/cloudflared/&lt;em&gt;.json &lt;/em&gt;
&lt;em&gt;sudo chmod 600 /etc/cloudflared/&lt;/em&gt;.json
sudo chmod 600 /etc/cloudflared/config.yml  

## start the cloudflare tunnel in the api-production (EC2) 
cloudflared tunnel run api-production-cf-tunnel &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;G. Install cloudflared as service  &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo cloudflared service install  
sudo systemctl enable cloudflared
sudo systemctl start cloudflared
sudo systemctl status cloudflared  &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;2. RDS (rds-production) — Private MySQL Database  &lt;br&gt;The production database is fully isolated:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No public access  &lt;/li&gt;



&lt;li&gt;No internet routing  &lt;/li&gt;



&lt;li&gt;IAM authentication only  &lt;/li&gt;



&lt;li&gt;Encryption enabled  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It can only be reached through the RDS Proxy. &lt;/p&gt;

&lt;p&gt;3. RDS Proxy (rds-proxy-production) — IAM‑Authenticated Database Access  &lt;br&gt;The proxy sits between the EC2 instance and the database. It enforces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IAM authentication  &lt;/li&gt;



&lt;li&gt;Connection pooling  &lt;/li&gt;



&lt;li&gt;No direct database exposure &lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;&lt;em&gt;IAM Roles&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1. role-ec2-production — API Server Role  &lt;br&gt;Attached to the EC2 instance. It grants access only to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Specific S3 buckets  &lt;/li&gt;



&lt;li&gt;The RDS Proxy  &lt;/li&gt;



&lt;li&gt;CloudWatch logs  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No IAM users, no access keys, no long‑lived credentials. The inline policy: &lt;/p&gt;

&lt;p&gt;role-ec2-production Inline Policy&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;//  RDS  
{
  "Effect": "Allow",
  "Action": [
    "rds-db:connect"
  ],
  "Resource": [
    "arn:aws:rds-db:aws-region:aws-ac-id:dbuser:db-instance-arn/role-rds-db",
    "arn:aws:rds-db:aws-region:aws-ac-id:dbuser:prx-proxy-arn/role-rds-db"
  ]
}
//  S3  
{
  "Sid": "AllowListBucket",
  "Effect": "Allow",
  "Action": "s3:ListBucket",
  "Resource": "arn:aws:s3:::bucket-name",
  "Condition": {
    "StringEquals": {
      "aws:RequestedRegion": "aws-region"
    }
  }
},
{
  "Sid": "AllowObjectReadWrite",
  "Effect": "Allow",
  "Action": [
    "s3:GetObject",
    "s3:PutObject"
  ],
  "Resource": "arn:aws:s3:::bucket-name/*",
  "Condition": {
    "StringEquals": {
      "aws:RequestedRegion": "aws-region"
    }
  }
}
//  CloudWatch  
{
  "Effect": "Allow",
  "Action": [
    "logs:DescribeLogGroups",
    "logs:DescribeLogStreams",
    "logs:CreateLogGroup",
    "logs:CreateLogStream",
    "logs:PutLogEvents"
  ],
  "Resource": "*"
}
//  JWT  
{
  "Sid": "AllowJWTPrivateKey",
  "Effect": "Allow",
  "Action": [
    "ssm:GetParameter",
    "ssm:GetParameters"
  ],
  "Resource": "arn:aws:ssm:aws-region:aws-ac-id:parameter/category-name/jwt/private-key"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;2. role-rds-db — RDS Proxy Role  &lt;br&gt;Attached to the RDS Proxy. It allows the proxy to authenticate to the database using IAM auth. Tokens are generated and signed by AWS KMS.  &lt;/p&gt;

&lt;p&gt;role-rds-db Inline policy  &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
  "Sid": "GetSecretValue",
  "Action": [
    "secretsmanager:GetSecretValue"
  ],
  "Effect": "Allow",
  "Resource": [
    "arn:aws:secretsmanager:aws-region:aws-ac-id:secret:rds-proxy-role-rds-db-name"
  ]
}
{
  "Sid": "DecryptSecretValue",
  "Action": [
    "kms:Decrypt"
  ],
  "Effect": "Allow",
  "Resource": [
    "arn:aws:kms:aws-region:aws-ac-id:key/decrypt-key"
  ],
  "Condition": {
    "StringEquals": {
      "kms:ViaService": "secretsmanager.aws-region.amazonaws.com"
    }
  }
}
{
  "Effect": "Allow",
  "Action": "rds-db:connect",
  "Resource": "arn:aws:rds-db:aws-region:aws-ac-id:dbuser:db-name/role-rds-db"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;3. role-rds-db — Database IAM Auth User  &lt;br&gt;The same IAM auth username must exist inside the MySQL database.  Creation SQL:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;-- 1. Create IAM-authenticated user (no password)
CREATE USER 'role-rds-db'@'%' IDENTIFIED WITH AWSAuthenticationPlugin AS 'RDS';

-- 2. Grant only SELECT, INSERT, UPDATE, DELETE on the your_db database
GRANT SELECT, INSERT, UPDATE, DELETE ON your_db.* TO 'role-rds-db'@'%';

-- 3. Reload privileges (optional but safe)
FLUSH PRIVILEGES;  &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This ensures the proxy can authenticate as a database user without passwords.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;&lt;em&gt;Security Groups&lt;/em&gt;&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;1. sg-ec2-production  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Attached to the api-production  &lt;/li&gt;



&lt;li&gt;No inbound access except from the bastion host via private IP  &lt;/li&gt;



&lt;li&gt;Outbound allowed for Cloudflare Tunnel  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This removes the external attack surface entirely.&lt;/p&gt;

&lt;p&gt;2. sg-rds-proxy&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Attached to the RDS Proxy  &lt;/li&gt;



&lt;li&gt;Only allows inbound 3306 from sg-ec2-production  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3. sg-rds-db  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Attached to the RDS instance  &lt;/li&gt;



&lt;li&gt;Only allows inbound 3306 from sg-rds-proxy  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This ensures:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EC2 cannot reach the database directly  &lt;/li&gt;



&lt;li&gt;Only the proxy can communicate with the database  &lt;/li&gt;



&lt;li&gt;Even inside the private network, lateral movement is blocked  &lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;API Server — PHP Layer&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;1. JWT validation and authorization in the PHP API before processing any request  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The PHP API verifies the JWT signature &lt;/li&gt;



&lt;li&gt;enforces expiration &lt;/li&gt;



&lt;li&gt;checks user permissions directly from the claims &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Generate JWT Code Snippet  &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// your function 

// -------------------------------
// 1. Load RSA private key from SSM
// -------------------------------

$ssm = new SsmClient([
    'region'  =&amp;gt; 'aws-region',
    'version' =&amp;gt; 'latest'
]);

$result = $ssm-&amp;gt;getParameter([
    'Name' =&amp;gt; '/category-name/jwt/private-key',   // &amp;lt;-- your parameter name
    'WithDecryption' =&amp;gt; true
]);

$privateKeyPem = $result['Parameter']['Value'];

$privateKey = openssl_pkey_get_private($privateKeyPem);

if (!$privateKey) {
    
    //  error handling  
}

// -------------------------------
// 2. Helper: Base64URL encoding
// -------------------------------

function base64UrlEncode($data) {
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

// -------------------------------
// 3. Build JWT header + payload
// -------------------------------

$header = [
    'alg' =&amp;gt; 'RS256',
    'typ' =&amp;gt; 'JWT'
];

$payload = [
    "sub" =&amp;gt; $sub,  //  variable for later checking  
    "iat" =&amp;gt; time(),
    "exp" =&amp;gt; time() + 360000,
    "iss" =&amp;gt; "yourdomain.com",
    "aud" =&amp;gt; "cloudflare"
];

$base64Header  = base64UrlEncode(json_encode($header, JSON_UNESCAPED_SLASHES));
$base64Payload = base64UrlEncode(json_encode($payload, JSON_UNESCAPED_SLASHES));

$dataToSign = "$base64Header.$base64Payload";

// -------------------------------
// 4. Sign with RSA private key
// -------------------------------

if (!openssl_sign($dataToSign, $signature, $privateKey, OPENSSL_ALGO_SHA256)) {
    
    //  error handling  
}

$jwt = $dataToSign . "." . base64UrlEncode($signature);  

// other function logic  &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Validate JWT Code Snippet  &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;//  your function  

list($h, $p, $s) = explode('.', $jwt);

$dataToVerify = "$h.$p";
$signature    = base64UrlDecode($s);

$publicKey = openssl_pkey_get_public(file_get_contents(your_jwt_public_key_path));

// validate signature  
$valid = openssl_verify($dataToVerify, $signature, $publicKey, OPENSSL_ALGO_SHA256);

if ($valid !== 1) { 

    // error handling  

}  

$payload = json_decode(base64UrlDecode($p), true);  

// validate payload 
if (!$payload || !isset($payload['exp'])) {

    // error handling  

}

// validate expiry 
if (time() &amp;lt;= $payload['exp']) { 

    // error handling  
    
}  

//  your function other logic  
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;2. Secure database access  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All database operations use PDO’s native parameter binding, which inherently prevents SQL injection. &lt;/li&gt;



&lt;li&gt;The connection enforces TLS encryption with the RDS CA bundle, ensuring data in transit is protected and the server identity is verified. The RDS CA bundle can be downloaded &lt;a href="https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem" rel="noopener noreferrer"&gt;here&lt;/a&gt;   &lt;/li&gt;



&lt;li&gt;Authentication is fully passwordless using IAM role–based RDS authentication, so no credentials are stored in the application. &lt;/li&gt;



&lt;li&gt;The PHP layer is restricted to connect exclusively through the RDS Proxy, never directly to the RDS instance, enforcing a strict Zero Trust boundary.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Database Connection Code Snippet  &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;//  your function 

$host = "proxy-xxxxxxxx"; // RDS Proxy endpoint
$port = 3306;
$username = "role-rds-db"; // MySQL user created with IDENTIFIED WITH AWSAuthenticationPlugin
$region = "aws-region";
$dbname = "your_db";

// AWS SDK
$sdk = new Sdk([
    'region'   =&amp;gt; $region,
    'version'  =&amp;gt; 'latest'
]);  

$provider = CredentialProvider::defaultProvider();  

$rdsAuthGenerator = new AuthTokenGenerator($provider);

// Generate IAM token (no password stored)
$token = $rdsAuthGenerator-&amp;gt;createToken("$host:$port", $region, $username);  

$dsn = "mysql:host=$host;port=$port;dbname=$dbname;charset=utf8mb4";  

// Enforces TLS encryption with the RDS CA bundle  
$ca_bundle_path = realpath($path_to_store_ . "/cert/global-bundle.pem");

$options = [
    PDO::ATTR_PERSISTENT         =&amp;gt; false,                  // Disable persistence in PDO  
    PDO::ATTR_ERRMODE            =&amp;gt; PDO::ERRMODE_EXCEPTION, // Throw exceptions on errors    
    PDO::MYSQL_ATTR_SSL_CA       =&amp;gt; $ca_bundle_path,       // Path to RDS CA bundle  
//  other option settings  
];

try {
    // 3. Establish the connection
    $pdo = new PDO($dsn, $username, $token, $options);
    
    return $pdo;  
    
} catch (PDOException $e) {
    //  error handling  
}  

//  other function logic  &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;3. No direct file handling on the server — The API never accepts file uploads. All file operations are performed through S3 pre‑signed URLs, ensuring the PHP layer remains stateless and free from file‑system exposure  &lt;/p&gt;

&lt;p&gt;S3 Upload / Read Code Snippet  &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;//  your upload function  

$bucket = 'your-bucket';
$region = 'aws-region';
$subFolder = 'your-subFolder';  
//  $contentType as parameter  

$s3 = new S3Client([
    'region'  =&amp;gt; $region,
    'version' =&amp;gt; 'latest'
]);

// Generate unique filename
$filename = random_str() . '.' . $ext;
$key = $subFolder . $filename;

// Create command for PUT
$cmd = $s3-&amp;gt;getCommand('PutObject', [
    'Bucket' =&amp;gt; $bucket,
    'Key'    =&amp;gt; $key,
    'ContentType' =&amp;gt; $contentType  
]);

// Create pre-signed URL valid for 60 seconds
$request = $s3-&amp;gt;createPresignedRequest($cmd, '+600 seconds');
$presignedUrl = (string) $request-&amp;gt;getUri();

//  other function logic  

//  your read function  

    $bucket = 'your-bucket';
    $region = 'aws-region';  
    //  $filepath  as parameter  

    $s3 = new S3Client([
        'region'  =&amp;gt; $region,
        'version' =&amp;gt; 'latest'
    ]);

    // Create command for PUT
    $cmd = $s3-&amp;gt;getCommand('GetObject', [
        'Bucket' =&amp;gt; $bucket,
        'Key'    =&amp;gt; $filepath 
    ]);

    // Create pre-signed URL valid for 60 seconds
    $request = $s3-&amp;gt;createPresignedRequest($cmd, '+600 seconds');
    $presignedUrl = (string) $request-&amp;gt;getUri();  
    
//  other function logic  &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;4. php.ini Security Hardening — These php.ini changes lock down the PHP runtime by removing risk. The result is a minimal‑surface, production‑safe environment aligned with Zero Trust principles.&lt;/p&gt;

&lt;p&gt;php.ini Setting Snippet    &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Disable Dangerous Functions
; Prevent command execution, file system abuse, and code injection
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_multi_exec,parse_ini_file,show_source

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Disable URL File Access
; Prevent Remote File Inclusion (RFI) attacks
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

allow_url_fopen = Off
allow_url_include = Off

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Hide PHP Version &amp;amp; Reduce Fingerprinting
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

expose_php = Off

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Session Security
; Protect against hijacking, fixation, and CSRF
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

session.use_strict_mode = 1
session.use_only_cookies = 1
session.cookie_httponly = 1
session.cookie_secure = 1
session.cookie_samesite = Strict
session.use_trans_sid = 0
session.sid_length = 48
session.sid_bits_per_character = 6

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Error Handling
; Never leak stack traces or internal paths to users
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

display_errors = Off
display_startup_errors = Off
log_errors = On
error_log = path_to_log_folder/php_errors.log

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Disable Legacy, Unsafe Features
; Prevent remote code injection via old PHP behaviors
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

register_globals = Off
magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off&lt;/code&gt;&lt;/pre&gt;




&lt;p&gt;&lt;strong&gt;Security Outcome&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;This layered setup ensures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zero public exposure — no public IPs, all traffic enters through Cloudflare Tunnel only.&lt;/li&gt;



&lt;li&gt;Authentication — JWTs are fully validated before any request is allowed to trigger the API.  &lt;/li&gt;



&lt;li&gt;No direct origin access — only Cloudflare Tunnel can reach the private API server.  &lt;/li&gt;



&lt;li&gt;No stored passwords — API connects to RDS using IAM authentication, not static credentials.&lt;/li&gt;



&lt;li&gt;RDS Proxy only — EC2 instances cannot connect directly to the database.&lt;/li&gt;



&lt;li&gt;Identity at every hop — IAM role → RDS Proxy → RDS.&lt;/li&gt;



&lt;li&gt;East‑west segmentation — security groups restrict lateral movement between internal components.  &lt;/li&gt;



&lt;li&gt;Hardened runtime — PHP runs with disabled dangerous functions, strict session rules, and no version leakage.  &lt;/li&gt;



&lt;li&gt;Minimal attack surface — no file uploads, no sensitive files exposed.&lt;/li&gt;



&lt;li&gt;Consistent Zero Trust posture — every request, device, and connection must prove identity before being allowed through.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What Next’s&lt;/strong&gt; &lt;br&gt;This article focused on the AWS private‑network Zero Trust architecture I applied to a legacy PHP system — the part that happens inside the VPC, with no public exposure and identity‑driven access to every internal component.&lt;br&gt;In my next article, I’ll extend the story to the internet‑facing Zero Trust layer, covering how external traffic is authenticated, filtered, and isolated before it ever reaches the private network. That next piece will dive into:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloudflare Edge and global identity enforcement  &lt;/li&gt;



&lt;li&gt;Nginx request filtering and origin isolation &lt;/li&gt;



&lt;li&gt;Supporting operational components like CloudWatch and the bastion host  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together, these complete the full end‑to‑end Zero Trust posture — from the public internet all the way down to the private AWS runtime.  &lt;/p&gt;





&lt;p&gt;The post &lt;a href="https://blog.jonanata.com/technical-deep-dive-how-i-delivered-zero-trust-security-for-a-clients-legacy-php-system-without-rewrites-downtime-or-big-costs-part-1/" rel="noopener noreferrer"&gt;Technical Deep Dive: How I Delivered Zero Trust Security for a Client’s Legacy PHP System — Without Rewrites, Downtime, or Big Costs (Part 1)&lt;/a&gt; appeared first on &lt;a href="https://blog.jonanata.com" rel="noopener noreferrer"&gt;Behind the Build&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cybersecurity</category>
      <category>zerotrust</category>
    </item>
    <item>
      <title>Joining the Google Cloud Get Certified Program Again — Day 1 Highlights</title>
      <dc:creator>Jonathan Wong</dc:creator>
      <pubDate>Tue, 14 Apr 2026 03:01:08 +0000</pubDate>
      <link>https://forem.com/jonathan78wong/joining-the-google-cloud-get-certified-program-again-day-1-highlights-59a3</link>
      <guid>https://forem.com/jonathan78wong/joining-the-google-cloud-get-certified-program-again-day-1-highlights-59a3</guid>
      <description>&lt;p&gt;I’m glad to have the chance to join the &lt;strong&gt;Google Cloud Get Certified&lt;/strong&gt; Program again. Today I attended the online, live, Instructor‑Led Training (ILT) session. It was a full one‑day workshop that delivered a solid refresh across key Google Cloud services.&lt;/p&gt;

&lt;p&gt;The training covered a wide range of topics, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloud Marketplace &lt;/li&gt;
&lt;li&gt;VPC Networking &lt;/li&gt;
&lt;li&gt;Google Compute Engine &lt;/li&gt;
&lt;li&gt;Cloud Storage &lt;/li&gt;
&lt;li&gt;Cloud SQL &lt;/li&gt;
&lt;li&gt;Cloud Run (Kubernetes)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The session was well organized by Jellyfish Training, with clear explanations and strong demonstrations throughout the day. The structure made it easy to follow the progression from foundational services to more hands‑on deployment scenarios.&lt;/p&gt;

&lt;p&gt;We also completed several &lt;strong&gt;Google Skill Boost hands‑on labs&lt;/strong&gt; , which helped reinforce the concepts with practical exercises.&lt;/p&gt;

&lt;p&gt;With the first stage completed, I’m looking forward to the next phase of the program — the Certification Journey. This is where the deeper preparation begins, and I’m excited to continue building momentum.&lt;/p&gt;

&lt;p&gt;If you’re also working toward a Google Cloud certification, feel free to connect. Always open to sharing study approaches and learning together.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://blog.jonanata.com/joining-the-google-cloud-get-certified-program-again-day-1-highlights/" rel="noopener noreferrer"&gt;Joining the Google Cloud Get Certified Program Again — Day 1 Highlights&lt;/a&gt; appeared first on &lt;a href="https://blog.jonanata.com" rel="noopener noreferrer"&gt;Behind the Build&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>certification</category>
      <category>google</category>
      <category>learning</category>
    </item>
    <item>
      <title>Building Agentic AI Solutions with Azure AI Foundry — My Training Day Review &amp; Updated AI‑103 Study Plan</title>
      <dc:creator>Jonathan Wong</dc:creator>
      <pubDate>Thu, 09 Apr 2026 17:16:00 +0000</pubDate>
      <link>https://forem.com/jonathan78wong/building-agentic-ai-solutions-with-azure-ai-foundry-my-training-day-review-updated-ai-103-study-3k8k</link>
      <guid>https://forem.com/jonathan78wong/building-agentic-ai-solutions-with-azure-ai-foundry-my-training-day-review-updated-ai-103-study-3k8k</guid>
      <description>&lt;p&gt;On March 19, I attended the &lt;strong&gt;Microsoft Virtual Training Day: Build Agentic AI Solutions with Azure AI Foundry&lt;/strong&gt; , a deep‑dive session focused on the emerging world of &lt;strong&gt;agentic AI&lt;/strong&gt; , multi‑agent orchestration, and the evolving Azure ecosystem. With the new &lt;strong&gt;AI‑103 (beta)&lt;/strong&gt; exam approaching, this training arrived at the perfect time.&lt;/p&gt;

&lt;p&gt;Microsoft has now published the &lt;strong&gt;official AI‑103 syllabus and a few self‑paced modules&lt;/strong&gt; , which provide much‑needed structure for early learners:&lt;br&gt;&lt;br&gt;
&lt;a href="https://learn.microsoft.com/en-us/training/courses/ai-103t00#course-syllabus" rel="noopener noreferrer"&gt;https://learn.microsoft.com/en-us/training/courses/ai-103t00#course-syllabus&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Below is my updated summary of the training, how it aligns with the exam, and my revised learning plan.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;1. Summary of the Training Day Content&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The training covered the full lifecycle of building AI agents on Azure:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Getting Started with AI Agent Development on Azure&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A walkthrough of Azure AI Foundry, including model catalog, prompt flow, and evaluation tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Developing an AI Agent with Azure AI Agent Service&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;How to configure, deploy, and scale agents using Microsoft’s new agent runtime.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Integrating Custom Tools into Your Agent&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Connecting agents to APIs, enterprise systems, and custom tools for real‑world use cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Developing Agents with the Semantic Kernel SDK&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Using planners, skills, connectors, and orchestration patterns to build intelligent workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Orchestrating Multi‑Agent Solutions&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Designing collaborative agent systems that delegate tasks and coordinate actions.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Developing Multi‑Agent Solutions with Azure AI Foundry Agent Service&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Advanced multi‑agent patterns, routing strategies, and evaluation workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Integrating MCP Tools with Azure AI Agents&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;A forward‑looking module on the Model Context Protocol (MCP) and standardized tool integration.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;2. How This Training Supports AI‑103 Exam Preparation&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The training aligns closely with the expected AI‑103 domains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Azure AI Foundry fundamentals&lt;/li&gt;
&lt;li&gt;Agent Service configuration&lt;/li&gt;
&lt;li&gt;Semantic Kernel development&lt;/li&gt;
&lt;li&gt;Tool integration (including MCP)&lt;/li&gt;
&lt;li&gt;Multi‑agent orchestration&lt;/li&gt;
&lt;li&gt;Evaluation and responsible AI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With the syllabus now available, it’s clear that &lt;strong&gt;AI‑103 is centered on agentic AI&lt;/strong&gt; , not just traditional LLM operations.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;3. AI‑103 Beta Exam — Registration Still Pending&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Although the exam has been announced, &lt;strong&gt;beta registration is not yet open&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
This creates a unique situation: early learners must prepare using a mix of training content, documentation, and hands‑on practice.&lt;/p&gt;

&lt;p&gt;The newly published syllabus helps clarify the scope, but official learning paths are still limited.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;4. Updated Learning Plan (Now Including Official Syllabus)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;With the syllabus available, I’ve updated my study plan to align with Microsoft’s structure.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;A. Follow the Official AI‑103 Syllabus&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The syllabus outlines the core domains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Azure AI Foundry&lt;/li&gt;
&lt;li&gt;Agent development&lt;/li&gt;
&lt;li&gt;Semantic Kernel&lt;/li&gt;
&lt;li&gt;Tool integration&lt;/li&gt;
&lt;li&gt;Multi‑agent orchestration&lt;/li&gt;
&lt;li&gt;Evaluation and monitoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is now my primary roadmap.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;B. Complete the Available Self‑Paced Modules&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The course page includes a few early modules that reinforce foundational concepts.&lt;br&gt;&lt;br&gt;
These are short but useful for grounding terminology and workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;C. Deep Dive into Azure AI Foundry Documentation&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Focus areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Model catalog&lt;/li&gt;
&lt;li&gt;Prompt flow&lt;/li&gt;
&lt;li&gt;Agent Service&lt;/li&gt;
&lt;li&gt;Evaluation tools&lt;/li&gt;
&lt;li&gt;Deployment patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;D. Semantic Kernel GitHub Samples&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Hands‑on practice with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Planners&lt;/li&gt;
&lt;li&gt;Skills&lt;/li&gt;
&lt;li&gt;Connectors&lt;/li&gt;
&lt;li&gt;Multi‑agent orchestration&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;E. Build Practical Mini‑Projects&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To internalize the concepts, I’m building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A multi‑agent research assistant&lt;/li&gt;
&lt;li&gt;A tool‑calling enterprise agent&lt;/li&gt;
&lt;li&gt;A workflow‑orchestration agent using SK&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;F. Review Build &amp;amp; Ignite Sessions&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;These sessions contain early previews of Microsoft’s agentic architecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;5. Suggested Learning Plan for Other AI‑103 Candidates&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If you’re also preparing for AI‑103, here’s a simple, effective path:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start with the &lt;strong&gt;official syllabus&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Complete the &lt;strong&gt;self‑paced modules&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Learn Azure AI Foundry basics&lt;/li&gt;
&lt;li&gt;Build a single agent with Azure AI Agent Service&lt;/li&gt;
&lt;li&gt;Deep‑dive into Semantic Kernel&lt;/li&gt;
&lt;li&gt;Create a multi‑agent solution&lt;/li&gt;
&lt;li&gt;Practice tool integration (including MCP)&lt;/li&gt;
&lt;li&gt;Use Azure’s evaluation tools&lt;/li&gt;
&lt;li&gt;Monitor Microsoft Learn for new content&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This sequence mirrors both the training and the exam structure.&lt;/p&gt;




&lt;h1&gt;
  
  
  &lt;strong&gt;Closing Thoughts&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;The March 19 training was a strong introduction to Microsoft’s agentic AI stack and a helpful starting point for &lt;strong&gt;AI‑103 beta&lt;/strong&gt; preparation. With the syllabus now available, I’ve updated my study plan to align with Microsoft’s official direction.&lt;/p&gt;

&lt;p&gt;I’ll continue sharing updates as I progress through the learning materials and as Microsoft releases more content leading up to the exam.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://blog.jonanata.com/building-agentic-ai-solutions-with-azure-ai-foundry-my-training-day-review-updated-ai-103-study-plan/" rel="noopener noreferrer"&gt;Building Agentic AI Solutions with Azure AI Foundry — My Training Day Review &amp;amp; Updated AI‑103 Study Plan&lt;/a&gt; appeared first on &lt;a href="https://blog.jonanata.com" rel="noopener noreferrer"&gt;Behind the Build&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>certification</category>
      <category>learning</category>
    </item>
    <item>
      <title>How I Delivered Zero Trust Security for a Client’s Legacy PHP System — Without Rewrites, Downtime, or Big Costs</title>
      <dc:creator>Jonathan Wong</dc:creator>
      <pubDate>Sun, 05 Apr 2026 02:13:55 +0000</pubDate>
      <link>https://forem.com/jonathan78wong/how-i-delivered-zero-trust-security-for-a-clients-legacy-php-system-without-rewrites-downtime-jj4</link>
      <guid>https://forem.com/jonathan78wong/how-i-delivered-zero-trust-security-for-a-clients-legacy-php-system-without-rewrites-downtime-jj4</guid>
      <description>&lt;p&gt;A practical playbook to implementing Zero Trust architecture using AWS and Cloudflare. Covering edge security, identity controls, and data protection for modern cloud infrastructure.&lt;/p&gt;

&lt;p&gt;As the founder of &lt;a href="https://jonanata.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Jonanata&lt;/strong&gt;&lt;/a&gt;, I often support clients who are growing fast but whose infrastructure hasn’t kept up with modern security expectations. One recent project stands out because it reflects a challenge many founders face:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you bring an existing production system closer to SOC 2 and PCI‑DSS expectations , without rewriting the application, without downtime, and without blowing the budget?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;My client had a public‑facing mobile app backed by a legacy PHP API server built on a proprietary framework. It worked, but it wasn’t compliant, and it wasn’t defensible. They were already using AWS and Cloudflare — but only Cloudflare’s free plan. &lt;/p&gt;

&lt;p&gt;The constraints were clear: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No application revamp &lt;/li&gt;
&lt;li&gt;No downtime&lt;/li&gt;
&lt;li&gt;Free or low‑cost solutions only &lt;/li&gt;
&lt;li&gt;Compliance‑aligned security improvements&lt;/li&gt;
&lt;li&gt;Immediate business value &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the story of how I delivered a  &lt;strong&gt;Zero Trust Architecture&lt;/strong&gt;  that strengthened every layer — AWS, Cloudflare, PHP, and Nginx — while keeping the system running and the budget under control. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Why Zero Trust, SOC 2, and PCI‑DSS Matter&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before diving into the solution, it’s worth explaining these concepts in business terms. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero Trust Architecture (ZTA)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A modern security model built on one principle:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Never trust anything by default — verify everything.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
It protects businesses from: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Credential theft&lt;/li&gt;
&lt;li&gt;Lateral movement inside servers&lt;/li&gt;
&lt;li&gt;Insider threats&lt;/li&gt;
&lt;li&gt;Misconfigurations&lt;/li&gt;
&lt;li&gt;Public exposure &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For founders, Zero Trust means  &lt;strong&gt;reduced risk&lt;/strong&gt; ,  &lt;strong&gt;better investor confidence&lt;/strong&gt; , and  &lt;strong&gt;stronger customer trust&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SOC 2&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A widely recognized security and operational standard.&lt;br&gt;&lt;br&gt;
It focuses on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access control&lt;/li&gt;
&lt;li&gt;Logging and monitoring&lt;/li&gt;
&lt;li&gt;Network restrictions&lt;/li&gt;
&lt;li&gt;Data protection&lt;/li&gt;
&lt;li&gt;Operational discipline&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even if you’re not formally audited, aligning with SOC 2 makes your business  &lt;strong&gt;more trustworthy to partners and enterprise clients&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PCI‑DSS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A security standard for systems that handle  &lt;strong&gt;payment‑related data&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
It emphasizes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Network segmentation&lt;/li&gt;
&lt;li&gt;Least privilege&lt;/li&gt;
&lt;li&gt;Secure coding&lt;/li&gt;
&lt;li&gt;Logging&lt;/li&gt;
&lt;li&gt;Encryption&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even if you don’t process payments directly, PCI‑DSS alignment reduces the risk of data breaches and strengthens your compliance posture. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The Challenge: Secure a Legacy System Without Rewriting It&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The client’s PHP backend was built on a proprietary framework. Rewriting it would take months and introduce risk. Instead, I designed a solution that  &lt;strong&gt;wraps the existing system in Zero Trust&lt;/strong&gt; , hardens every layer, and enforces strict access control — all without touching core business logic.&lt;/p&gt;

&lt;p&gt;The only additional cost?&lt;br&gt;&lt;br&gt;
&lt;strong&gt;CloudWatch log storage.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Everything else used AWS native features and Cloudflare’s free plan. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;AWS Layer: Identity‑Based Access and Network Isolation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. IAM Roles Only — No Stored Keys&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The production EC2 instance uses a dedicated IAM role (role-ec2-production) with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access only to specific S3 buckets&lt;/li&gt;
&lt;li&gt;Access only to the RDS MySQL instance&lt;/li&gt;
&lt;li&gt;Access only to CloudWatch&lt;/li&gt;
&lt;li&gt;All permissions scoped to resource names&lt;/li&gt;
&lt;li&gt;No IAM users, no access keys stored on the server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Business &amp;amp; compliance value:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No leaked keys, no credential rotation headaches, and full alignment with SOC 2 CC6.1 and PCI‑DSS 7.1. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Private EC2 — No Public IP&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The production EC2 sits behind a new security group (sg-ec2-production) with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No public IP&lt;/li&gt;
&lt;li&gt;No inbound access from the internet&lt;/li&gt;
&lt;li&gt;Only the bastion host can reach it via private IP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Business &amp;amp; compliance value:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The production server is invisible to attackers.&lt;br&gt;&lt;br&gt;
This satisfies PCI‑DSS 1.2.1 and SOC 2 CC6.6.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. RDS: Identity‑Based Database Access&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The MySQL database:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accepts connections only from the production SG&lt;/li&gt;
&lt;li&gt;Uses IAM authentication (no password stored anywhere)&lt;/li&gt;
&lt;li&gt;Generates short‑lived tokens via AWS KMS&lt;/li&gt;
&lt;li&gt;Grants the role-ec2-production only SELECT/INSERT/UPDATE/DELETE &lt;/li&gt;
&lt;li&gt;No public IP and is accessible only inside the VPC &lt;/li&gt;
&lt;li&gt;Is fully encrypted &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Business &amp;amp; compliance value:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No database passwords to leak.&lt;br&gt;&lt;br&gt;
No over‑privileged accounts.&lt;br&gt;&lt;br&gt;
Meets PCI‑DSS 3.4, 7.2 and SOC 2 CC6.1.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. S3: Fully Private With Pre‑Signed URLs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Block all public access&lt;/li&gt;
&lt;li&gt;Upload/download only via pre‑signed URLs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Business value:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Keeps all PII and sensitive files private and off the public internet, reducing breach risk and supporting compliance with SOC 2 (CC6.6, CC6.7, CC9.1) and PCI‑DSS (3.4, 7.1, 10.2). &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Logging: Fluent Bit + CloudWatch + Logrotate&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Logs stored outside the web root&lt;/li&gt;
&lt;li&gt;Fluent Bit ships logs to CloudWatch&lt;/li&gt;
&lt;li&gt;Logrotate deletes rotated logs immediately&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Business &amp;amp; compliance value:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Centralized, tamper‑resistant logs that satisfy SOC 2 CC7.2 and PCI‑DSS 10.x.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Bastion Host: Controlled, Auditable Access&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only turned on when needed&lt;/li&gt;
&lt;li&gt;Only developer IPs allowed&lt;/li&gt;
&lt;li&gt;Developers authenticate with their own SSH keys&lt;/li&gt;
&lt;li&gt;Developers never see the production private key&lt;/li&gt;
&lt;li&gt;A controlled script handles access to the production EC2&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Business &amp;amp; compliance value:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No shared credentials.&lt;br&gt;&lt;br&gt;
Full accountability.&lt;br&gt;&lt;br&gt;
Meets SOC 2 CC6.3 and PCI‑DSS 8.x.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Cloudflare Layer: Strong Perimeter Security (Free Plan)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even on the free plan, Cloudflare provides powerful security controls when configured correctly. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Cloudflare Tunnel — What It Is and Why It Matters&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Cloudflare Tunnel creates an outbound‑only connection from the EC2 instance to Cloudflare.&lt;br&gt;&lt;br&gt;
This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The server is  &lt;strong&gt;never exposed&lt;/strong&gt;  to the public internet&lt;/li&gt;
&lt;li&gt;No open ports&lt;/li&gt;
&lt;li&gt;No public IP&lt;/li&gt;
&lt;li&gt;All traffic passes through Cloudflare’s Zero Trust layer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Compliance value:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Supports SOC 2 CC6.6 (network segmentation) and PCI‑DSS 1.3 (no direct public access). &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. mTLS With Client Certificates&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A security mechanism where both the client and server present certificates, proving their identities before any data is exchanged.&lt;br&gt;&lt;br&gt;
This means: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The server to trust the client&lt;/li&gt;
&lt;li&gt;The client to trust the server &lt;/li&gt;
&lt;li&gt;Only devices with valid client certificates can reach the API &lt;/li&gt;
&lt;li&gt;Prevents unauthorized devices, bots, or compromised workloads from connecting to your API &lt;/li&gt;
&lt;li&gt;Eliminates blind trust inside the network and blocks lateral movement &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Business &amp;amp; compliance value:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Even if someone discovers the tunnel URL, or credentials (JWT) leak they cannot bypass certificate‑based authentication to access the API.&lt;br&gt;&lt;br&gt;
This fulfills SOC 2 CC6.7 (strong authentication) and PCI‑DSS 8.x.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Cloudflare Worker: JWT Validation at the Edge&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Before requests reach the EC2 instance, a Worker:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validates the JWT&lt;/li&gt;
&lt;li&gt;Rejects invalid or expired tokens&lt;/li&gt;
&lt;li&gt;Ensures only authenticated traffic reaches the backend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Business &amp;amp; compliance value:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Reduces load on the server and blocks attacks early.&lt;br&gt;&lt;br&gt;
Supports SOC 2 CC7.1 (input validation) and PCI‑DSS 6.5.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;PHP Layer: Hardening Without Rewriting Code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even without modifying business logic, we strengthened the runtime environment. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Disable Dangerous Functions&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Functions like exec, system, popen, etc. are disabled. Prevents remote command execution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Disable URL File Access&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Prevents remote file inclusion (RFI) attacks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Disable legacy PHP features that automatically turn user input into variables&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Attackers can exploit old PHP behaviors such as register_globals and magic_quotes_gpc, which implicitly convert or modify user input. Prevents malicious input from becoming variables and reduces the risk of remote code injection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Hide PHP Version &amp;amp; Disable Error Display&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Prevents attackers from fingerprinting the system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Session Security Hardening&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Protects against session hijacking and fixation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. PDO Everywhere&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Prevents SQL injection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compliance value:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Hardens the PHP runtime without modifying business logic, eliminating high‑risk attack vectors (RCE, SQL injection, session hijacking) and strengthening compliance posture for SOC 2 and PCI‑DSS by enforcing safer defaults, strict input handling, and controlled execution paths. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Nginx Layer: API‑Focused Security Controls&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No directory browsing&lt;/li&gt;
&lt;li&gt;Block multipart uploads&lt;/li&gt;
&lt;li&gt;Enforce correct Host header&lt;/li&gt;
&lt;li&gt;Add HSTS and minimal CSP&lt;/li&gt;
&lt;li&gt;Limit request size&lt;/li&gt;
&lt;li&gt;Block directory traversal&lt;/li&gt;
&lt;li&gt;Block hidden files except .well-known&lt;/li&gt;
&lt;li&gt;Block sensitive files&lt;/li&gt;
&lt;li&gt;Remove version numbers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Business &amp;amp; compliance value:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Reduces attack surface and prevents common web vulnerabilities.&lt;br&gt;&lt;br&gt;
Supports PCI‑DSS 6.6 and SOC 2 CC7.1.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Defense in Depth: How Each Layer Protects the Business&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprod-assets.cosmic.aws.dev%2Fa%2F3BmN7NIq6F0BOUtLBKefhy3RyqR%2FSecu.webp%3FimgSize%3D1000x592" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprod-assets.cosmic.aws.dev%2Fa%2F3BmN7NIq6F0BOUtLBKefhy3RyqR%2FSecu.webp%3FimgSize%3D1000x592" title="How Each Layer Protects the Business " alt="How Each Layer Protects the Business" width="1000" height="592"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;How Each Layer Protects the Business&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is  &lt;strong&gt;Zero Trust in practice&lt;/strong&gt; : every layer assumes nothing is safe and verifies everything. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;The Outcome: Compliance‑Aligned Security Without Rewrites or Cost Overruns&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;By applying Zero Trust principles across AWS, Cloudflare, PHP, and Nginx, we delivered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A secure, compliant, modernized backend&lt;/li&gt;
&lt;li&gt;No application rewrite&lt;/li&gt;
&lt;li&gt;No downtime&lt;/li&gt;
&lt;li&gt;No expensive tools&lt;/li&gt;
&lt;li&gt;Only CloudWatch storage cost&lt;/li&gt;
&lt;li&gt;A defensible security posture aligned with SOC 2 and PCI‑DSS &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For the client, this meant:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stronger trust with users&lt;/li&gt;
&lt;li&gt;Better readiness for enterprise partnerships&lt;/li&gt;
&lt;li&gt;Reduced operational risk&lt;/li&gt;
&lt;li&gt;A future‑proof foundation for growth&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A compliance‑aligned architecture that enables expansion into regulated or restricted markets without major rework&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A security posture that meets the expectations of partners operating in highly controlled industries and jurisdictions&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the kind of security upgrade that delivers  &lt;strong&gt;real business value&lt;/strong&gt; , not just technical improvements. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What’s Next&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I’ll publish a deeper technical breakdown on my next AWS Builder Center article, including full configuration examples and source code in my GitHub repository. &lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://blog.jonanata.com/how-i-delivered-zero-trust-security-for-a-clients-legacy-php-system-without-rewrites-downtime-or-big-costs/" rel="noopener noreferrer"&gt;How I Delivered Zero Trust Security for a Client’s Legacy PHP System — Without Rewrites, Downtime, or Big Costs&lt;/a&gt; appeared first on &lt;a href="https://blog.jonanata.com" rel="noopener noreferrer"&gt;Behind the Build&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cybersecurity</category>
      <category>zerotrust</category>
    </item>
    <item>
      <title>What We Learned from Building Two PartyRock Apps</title>
      <dc:creator>Jonathan Wong</dc:creator>
      <pubDate>Sat, 04 Apr 2026 09:00:00 +0000</pubDate>
      <link>https://forem.com/jonathan78wong/what-we-learned-from-building-two-partyrock-apps-5k9</link>
      <guid>https://forem.com/jonathan78wong/what-we-learned-from-building-two-partyrock-apps-5k9</guid>
      <description>&lt;p&gt;Over the past weeks, Jonanata published two exploratory articles showcasing our early experiments with AWS PartyRock — one focused on daily workflow automation, and the other on ad‑hoc research and data interpretation.&lt;br&gt;&lt;br&gt;
This new article serves as a conclusion and insight summary, connecting both experiments and highlighting what they reveal about practical AI adoption inside modern organizations.&lt;br&gt;&lt;br&gt;
Rather than revisiting the technical details, this piece focuses on the patterns, lessons, and strategic implications that emerged across both builds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two Experiments, One Theme: Practical AI for Everyday Work&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Although the two PartyRock prototypes addressed different business needs, they shared a common purpose:&lt;br&gt;&lt;br&gt;
Helping people work faster with less friction.&lt;br&gt;&lt;br&gt;
Across both experiments, two high‑value use cases consistently stood out:&lt;/p&gt;

&lt;p&gt;Daily Workflow Automation&lt;br&gt;&lt;br&gt;
Reducing repetitive tasks such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Drafting structured content&lt;/li&gt;
&lt;li&gt;Summarizing updates&lt;/li&gt;
&lt;li&gt;Generating templates&lt;/li&gt;
&lt;li&gt;Supporting routine decision‑making&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ad‑Hoc Research &amp;amp; Insight Generation&lt;br&gt;&lt;br&gt;
Accelerating tasks like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quick data interpretation&lt;/li&gt;
&lt;li&gt;Rapid content summarization&lt;/li&gt;
&lt;li&gt;Lightweight analysis&lt;/li&gt;
&lt;li&gt;Exploratory thinking
These are universal needs across business, product, and technical teams — and they represent some of the fastest‑moving AI adoption areas today.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What These Experiments Revealed&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Across both prototypes, several clear insights emerged that shape how Jonanata approaches AI strategy and implementation.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Insight 1 — No‑Code AI Is Now a Serious Prototyping Layer&lt;/em&gt;&lt;br&gt;&lt;br&gt;
PartyRock demonstrated that teams can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validate ideas&lt;/li&gt;
&lt;li&gt;Test workflows&lt;/li&gt;
&lt;li&gt;Explore user experience&lt;/li&gt;
&lt;li&gt;Gather feedback
…without writing a single line of code.
This dramatically lowers the cost of experimentation and accelerates innovation cycles.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Insight 2 — Prompt Engineering Is Product Design&lt;/em&gt;&lt;br&gt;&lt;br&gt;
In both apps, the quality of the output depended entirely on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How clearly the prompts were structured&lt;/li&gt;
&lt;li&gt;How the workflow was sequenced&lt;/li&gt;
&lt;li&gt;How the user inputs were framed
Prompt design is no longer a technical skill — it’s a core UX skill.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Insight 3 — Small Tools Deliver Big Value&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Neither prototype was complex.&lt;/li&gt;
&lt;li&gt;Neither required infrastructure.&lt;/li&gt;
&lt;li&gt;Neither needed custom models.&lt;/li&gt;
&lt;li&gt;Yet both delivered immediate, practical utility. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This reinforces a key belief at Jonanata: AI value often comes from small, focused tools — not massive platforms.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Insight 4 — AI Is Most Useful When It Reduces Cognitive Load&lt;/em&gt;&lt;br&gt;&lt;br&gt;
Both apps helped users:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Think faster&lt;/li&gt;
&lt;li&gt;Interpret information more easily&lt;/li&gt;
&lt;li&gt;Offload repetitive mental tasks&lt;/li&gt;
&lt;li&gt;Make decisions with less effort
This is where AI shines today:
reducing the mental overhead of everyday work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Insight 5 — Prototypes Are the Bridge to Enterprise AI&lt;/em&gt;&lt;br&gt;&lt;br&gt;
PartyRock is not the final destination.&lt;br&gt;&lt;br&gt;
It’s the starting point.&lt;br&gt;&lt;br&gt;
Once a prototype proves valuable, it can evolve into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Amazon Bedrock workflows&lt;/li&gt;
&lt;li&gt;Lambda‑powered microservices&lt;/li&gt;
&lt;li&gt;API‑driven applications&lt;/li&gt;
&lt;li&gt;Secure enterprise integrations
This is the path from idea → prototype → production.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why This Matters for Jonanata’s Clients&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
These experiments reinforce the consulting approach we bring to organizations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start small&lt;/li&gt;
&lt;li&gt;Validate quickly&lt;/li&gt;
&lt;li&gt;Focus on real workflows&lt;/li&gt;
&lt;li&gt;Scale only what works&lt;/li&gt;
&lt;li&gt;Keep security and governance in mind
AI adoption doesn’t need to begin with a large, multi‑year initiative.
It can begin with a simple prototype that solves a real problem today.
PartyRock gave us a fast, low‑risk environment to explore these ideas — and the insights gained will guide how we help clients adopt AI in a way that is:&lt;/li&gt;
&lt;li&gt;Practical&lt;/li&gt;
&lt;li&gt;Secure&lt;/li&gt;
&lt;li&gt;Business‑aligned&lt;/li&gt;
&lt;li&gt;Cost‑effective&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Explore the Original Experiments&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
For readers who want to dive deeper, here are the two original articles:&lt;br&gt;&lt;br&gt;
Experiment 1 — Daily Workflow Automation&lt;br&gt;&lt;br&gt;
&lt;a href="https://blog.jonanata.com/hands-on-with-aws-partyrock-my-first-app-and-key-takeaways/" rel="noopener noreferrer"&gt;Hands‑On with AWS PartyRock: My First App and Key Takeaways – Behind the Build&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Experiment 2 — Ad‑Hoc Research &amp;amp; Data Insights&lt;br&gt;&lt;br&gt;
&lt;a href="https://blog.jonanata.com/aws-partyrock-data-app-my-second-project-in-the-aws-ai-practitioner-challenge/" rel="noopener noreferrer"&gt;AWS PartyRock Data App: My Second Project in the AWS AI Practitioner Challenge – Behind the Build&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Closing Thoughts&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
These two PartyRock experiments were small by design — but they revealed big truths about how AI can support everyday business operations. As we continue expanding our AI practice, Jonanata will keep sharing insights, prototypes, and practical frameworks that help organizations adopt AI with clarity and confidence.&lt;br&gt;&lt;br&gt;
If your team is exploring workflow automation, research acceleration, or early AI prototyping, we’d be happy to help you shape the right path forward.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://blog.jonanata.com/what-we-learned-from-building-two-partyrock-apps/" rel="noopener noreferrer"&gt;What We Learned from Building Two PartyRock Apps&lt;/a&gt; appeared first on &lt;a href="https://blog.jonanata.com" rel="noopener noreferrer"&gt;Behind the Build&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>aws</category>
    </item>
    <item>
      <title>AWS PartyRock Data App: My Second Project in the AWS AI Practitioner Challenge</title>
      <dc:creator>Jonathan Wong</dc:creator>
      <pubDate>Sat, 04 Apr 2026 03:54:43 +0000</pubDate>
      <link>https://forem.com/jonathan78wong/aws-partyrock-data-app-my-second-project-in-the-aws-ai-practitioner-challenge-46c7</link>
      <guid>https://forem.com/jonathan78wong/aws-partyrock-data-app-my-second-project-in-the-aws-ai-practitioner-challenge-46c7</guid>
      <description>&lt;p&gt;Zero Setup, No Code Data Analysis for Fast, Business Friendly Insights&lt;/p&gt;

&lt;p&gt;As part of my AWS AI Practitioner Challenge, this is my second PartyRock project. It focused entirely on  &lt;strong&gt;hands‑on data analysis using PartyRock’s new data app service&lt;/strong&gt;. If you haven’t seen my &lt;a href="https://builder.aws.com/content/3BY4b221HYECMOQB4rq5YYhlZ1j/handson-with-aws-partyrock-my-first-app-and-key-takeaways" rel="noopener noreferrer"&gt;first PartyRock article&lt;/a&gt;, check it out for details on  &lt;strong&gt;account registration&lt;/strong&gt; ,  &lt;strong&gt;advanced prompting&lt;/strong&gt; , and  &lt;strong&gt;LLM settings&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This time, we explore something even more practical:  &lt;strong&gt;partyrock.aws/data,&lt;/strong&gt;  a lightweight, no‑code environment for ad‑hoc data analysis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What This Project Is About&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PartyRock’s data analysis feature lets you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upload a dataset&lt;/li&gt;
&lt;li&gt;Ask analytical questions in natural language&lt;/li&gt;
&lt;li&gt;Receive structured insights with generated data tables&lt;/li&gt;
&lt;li&gt;Download the results instantly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s designed for  &lt;strong&gt;business users&lt;/strong&gt; ,  &lt;strong&gt;analysts&lt;/strong&gt; , and  &lt;strong&gt;operators&lt;/strong&gt;  who need quick insights without spinning up notebooks, BI tools, or ETL pipelines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Meet Whiskers — Your Data Analyst&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The workflow is intentionally simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Upload your CSV file&lt;/strong&gt;  directly in the chat&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask Whiskers&lt;/strong&gt;  analytical questions about your data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review the answer&lt;/strong&gt;  and  &lt;strong&gt;generated data side‑by‑side&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Download the generated table&lt;/strong&gt;  from the top‑right corner&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This simplicity is the magic. No setup. No environment. No code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example: Air Quality Dataset Analysis&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of my questions was:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“How do PM10 and PM2.5 levels change throughout the day, and what explains the sharp early‑morning drop?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Whiskers responded with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A clear explanation of the daily pollutant pattern&lt;/li&gt;
&lt;li&gt;A structured insight on the early‑morning drop&lt;/li&gt;
&lt;li&gt;A generated dataset showing the hourly trend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All within seconds.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprod-assets.cosmic.aws.dev%2Fa%2F3BlybsswJYasXOBvEye3WL4G5NL%2Fimg1.webp%3FimgSize%3D602x290" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprod-assets.cosmic.aws.dev%2Fa%2F3BlybsswJYasXOBvEye3WL4G5NL%2Fimg1.webp%3FimgSize%3D602x290" title="Question 1 " alt="Question 1" width="602" height="290"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Question 1&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It also handled more advanced analytical questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;“How strongly are PM10, PM2.5, NO₂, and CO correlated during overlapping hours?”&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprod-assets.cosmic.aws.dev%2Fa%2F3BlylLiwY8SfSqpYcU10Na2cVw8%2Fimg2.webp%3FimgSize%3D602x337" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprod-assets.cosmic.aws.dev%2Fa%2F3BlylLiwY8SfSqpYcU10Na2cVw8%2Fimg2.webp%3FimgSize%3D602x337" title="Question 2 " alt="Question 2" width="602" height="337"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Question 2&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;“What are the peak hours for each pollutant, and why do their peaks occur at different times?”&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprod-assets.cosmic.aws.dev%2Fa%2F3BlyrKS17CanWr92GturGT66L40%2Fimg3.webp%3FimgSize%3D602x338" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprod-assets.cosmic.aws.dev%2Fa%2F3BlyrKS17CanWr92GturGT66L40%2Fimg3.webp%3FimgSize%3D602x338" title="Question 3 " alt="Question 3" width="602" height="338"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Question 3&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Each answer came with supporting tables and a clean explanation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auto‑Generated Analysis Report&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Whiskers can also prepare a  &lt;strong&gt;well‑formatted downloadable report&lt;/strong&gt; , including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Summary&lt;/li&gt;
&lt;li&gt;Key takeaways&lt;/li&gt;
&lt;li&gt;Data tables&lt;/li&gt;
&lt;li&gt;Insights&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is extremely useful for business teams who need quick deliverables.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprod-assets.cosmic.aws.dev%2Fa%2F3Blz3rqbPl1ZDFhaBVR8sR90sfA%2Fimg4.webp%3FimgSize%3D602x323" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprod-assets.cosmic.aws.dev%2Fa%2F3Blz3rqbPl1ZDFhaBVR8sR90sfA%2Fimg4.webp%3FimgSize%3D602x323" title="Generate Analysis Report " alt="Generate Analysis Report" width="602" height="323"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Generate Analysis Report&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprod-assets.cosmic.aws.dev%2Fa%2F3Blz9RtZT6lUCfu73rW0QCOWi8G%2Fimg5.webp%3FimgSize%3D570x931" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprod-assets.cosmic.aws.dev%2Fa%2F3Blz9RtZT6lUCfu73rW0QCOWi8G%2Fimg5.webp%3FimgSize%3D570x931" title="Download Analysis Report " alt="Download Analysis Report" width="570" height="931"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Download Analysis Report&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why These Questions Matter&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PartyRock’s real strength appears when you guide it with a  &lt;strong&gt;clear analysis strategy&lt;/strong&gt; , not random brainstorming. Instead of asking vague or exploratory prompts, you can frame questions around  &lt;strong&gt;patterns&lt;/strong&gt; ,  &lt;strong&gt;correlations&lt;/strong&gt; , and  &lt;strong&gt;daily cycles&lt;/strong&gt;  as the same way a human analyst approaches structured problem‑solving.&lt;/p&gt;

&lt;p&gt;This makes PartyRock especially powerful for  &lt;strong&gt;non‑technical users and business owners&lt;/strong&gt;. They can focus on &lt;em&gt;why&lt;/em&gt; a question matters, while PartyRock handles the &lt;em&gt;how&lt;/em&gt; behind the analysis.&lt;/p&gt;

&lt;p&gt;Here’s how strategy‑driven questions unlock value:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Strategic Question&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;What It Helps You Do&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;How do PM10 and PM2.5 levels change throughout the day?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Detect structured daily patterns instead of reacting to random noise&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;How strongly are PM10, PM2.5, NO₂, and CO correlated?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Understand whether pollutants share common sources or behave independently&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What are the peak hours for each pollutant, and why?&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Identify the drivers behind different peak times and their operational impact&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;By anchoring the analysis in a deliberate strategy, PartyRock becomes a  &lt;strong&gt;flow‑maximizing tool&lt;/strong&gt;  for business users, which helping them explore data quickly, validate hypotheses, and make decisions without needing code, setup, or technical expertise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Takeaways&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Works Well&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero setup required&lt;/strong&gt;
No environment, no dependencies, no configuration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No‑code experience&lt;/strong&gt;
Ask questions in natural language. No Python, SQL, or VBA.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free to use&lt;/strong&gt;
Perfect for experimentation and ad‑hoc analysis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business‑friendly workflow&lt;/strong&gt;
Upload → Ask → Validate → Download
Everything happens in one place, with data always visible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Where It Can Improve&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simple analysis only&lt;/strong&gt;
Great for patterns, correlations, summaries. Not for complex modeling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No real‑time in‑place data editing&lt;/strong&gt;
You can’t transform or clean data interactively.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Overall Perspective on AWS PartyRock Data Service&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Whiskers bridges the gap between  &lt;strong&gt;Ad‑hoc business analysis&lt;/strong&gt;  and  &lt;strong&gt;Traditional BI/ETL workflows&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It gives teams a fast, low‑cost, no‑setup way to explore data and validate hypotheses. The UI is significantly better than a typical chatbot because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data stays visible&lt;/li&gt;
&lt;li&gt;Generated tables appear side‑by‑side&lt;/li&gt;
&lt;li&gt;Downloads are instant&lt;/li&gt;
&lt;li&gt;Reports are clean and structured&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For  &lt;strong&gt;daily lightweight analysis&lt;/strong&gt; , it’s genuinely impressive.&lt;/p&gt;

&lt;p&gt;For  &lt;strong&gt;large‑scale, interactive, or production‑grade analytics&lt;/strong&gt; , BI and ETL tools still remain the best choice.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://blog.jonanata.com/aws-partyrock-data-app-my-second-project-in-the-aws-ai-practitioner-challenge/" rel="noopener noreferrer"&gt;AWS PartyRock Data App: My Second Project in the AWS AI Practitioner Challenge&lt;/a&gt; appeared first on &lt;a href="https://blog.jonanata.com" rel="noopener noreferrer"&gt;Behind the Build&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>aws</category>
      <category>partrock</category>
    </item>
    <item>
      <title>Hands‑On with AWS PartyRock: My First App and Key Takeaways</title>
      <dc:creator>Jonathan Wong</dc:creator>
      <pubDate>Sat, 04 Apr 2026 03:04:08 +0000</pubDate>
      <link>https://forem.com/jonathan78wong/hands-on-with-aws-partyrock-my-first-app-and-key-takeaways-3pe7</link>
      <guid>https://forem.com/jonathan78wong/hands-on-with-aws-partyrock-my-first-app-and-key-takeaways-3pe7</guid>
      <description>&lt;p&gt;As part of the AWS AI Practitioner Challenge, I created a shareable productivity app using AWS PartyRock. In this write‑up, I walk through how I built it and share my thoughts on the platform and the overall experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;About This App&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This app helps streamline job and project applications.&lt;br&gt;&lt;br&gt;
You can upload your master resume and paste a job description, and the AI will automatically generate a tailored resume and cover letter. It highlights the most relevant experience and skills for the role, and you can edit the generated content directly.&lt;/p&gt;

&lt;p&gt;App link: &lt;a href="https://partyrock.aws/u/jonanata/oi9BjbKcR/Resume-and-Cover-Letter-Tailor" rel="noopener noreferrer"&gt;PartyRock | Resume and Cover Letter Tailor &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How I Built My First AWS PartyRock App&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sign in to &lt;a href="https://partyrock.aws/" rel="noopener noreferrer"&gt;&lt;strong&gt;partyrock.aws&lt;/strong&gt;  &lt;/a&gt;. You can find the signup instructions &lt;a href="https://partyrock.aws/guide/getStarted" rel="noopener noreferrer"&gt;&lt;strong&gt;here&lt;/strong&gt;  &lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;In the app build panel, you’ll find a chatbot named  &lt;strong&gt;Whiskers&lt;/strong&gt; , which acts as your no‑code app builder.&lt;/li&gt;
&lt;li&gt;You describe the workflow you want, and Whiskers generates the app structure for you.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprod-assets.cosmic.aws.dev%2Fa%2F3BddZOIqeItAt4zgD4KoQ5BmzYK%2Fapp-.webp%3FimgSize%3D602x326" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprod-assets.cosmic.aws.dev%2Fa%2F3BddZOIqeItAt4zgD4KoQ5BmzYK%2Fapp-.webp%3FimgSize%3D602x326" title="PartyRock Selected App Panel" alt="PartyRock Selected App Panel" width="602" height="326"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;PartyRock Selected App Panel&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For example, I asked Whiskers to build an app with the following workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upload a master resume&lt;/li&gt;
&lt;li&gt;Upload additional background documents (PDF, Word, TXT)&lt;/li&gt;
&lt;li&gt;Display uploaded file names&lt;/li&gt;
&lt;li&gt;Allow removing uploaded files&lt;/li&gt;
&lt;li&gt;Reuse uploaded documents within the same session&lt;/li&gt;
&lt;li&gt;Input a job description&lt;/li&gt;
&lt;li&gt;Generate a tailored resume and cover letter in editable text areas&lt;/li&gt;
&lt;li&gt;Provide download buttons for both documents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whiskers then responded with what it &lt;em&gt;can&lt;/em&gt; build and what current &lt;em&gt;limitations&lt;/em&gt; exist, along with alternative approaches. It generated a workable layout including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Master resume upload&lt;/li&gt;
&lt;li&gt;Additional documents upload&lt;/li&gt;
&lt;li&gt;Job description input&lt;/li&gt;
&lt;li&gt;Editable tailored resume&lt;/li&gt;
&lt;li&gt;Editable tailored cover letter&lt;/li&gt;
&lt;li&gt;Download buttons&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The app was created in seconds. From there, I iterated with Whiskers to refine the workflow, adjust prompts, and tune the AI model settings.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprod-assets.cosmic.aws.dev%2Fa%2F3BdewEIi7UPnvtR46yRWf0Ud4Pc%2Fapp-.webp%3FimgSize%3D1000x532" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprod-assets.cosmic.aws.dev%2Fa%2F3BdewEIi7UPnvtR46yRWf0Ud4Pc%2Fapp-.webp%3FimgSize%3D1000x532" title="App Flow Overview " alt="App Flow Overview" width="1000" height="532"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;App Flow Overview&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprod-assets.cosmic.aws.dev%2Fa%2F3Bdf7kAGXjhfgT0KbySE3IwDM9V%2Fapp-.webp%3FimgSize%3D602x515" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprod-assets.cosmic.aws.dev%2Fa%2F3Bdf7kAGXjhfgT0KbySE3IwDM9V%2Fapp-.webp%3FimgSize%3D602x515" title="App Prompt " alt="App Prompt" width="602" height="515"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;App Prompt&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprod-assets.cosmic.aws.dev%2Fa%2F3BdfIV3i5e9AcbMukVfQt4IpyXJ%2Fapp-.webp%3FimgSize%3D602x589" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprod-assets.cosmic.aws.dev%2Fa%2F3BdfIV3i5e9AcbMukVfQt4IpyXJ%2Fapp-.webp%3FimgSize%3D602x589" title="App Model Options " alt="App Model Options" width="602" height="589"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;App Model Options&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Once the app was ready, I set it to  &lt;strong&gt;“Anyone on the web”&lt;/strong&gt;  and shared the link.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprod-assets.cosmic.aws.dev%2Fa%2F3BdfSWnTnVNE5oMa0Q75PTJVBOh%2Fapp-.webp%3FimgSize%3D590x815" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprod-assets.cosmic.aws.dev%2Fa%2F3BdfSWnTnVNE5oMa0Q75PTJVBOh%2Fapp-.webp%3FimgSize%3D590x815" title="App Share " alt="App Share" width="590" height="815"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;App Share&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Takeaways&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Works Well&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero setup required&lt;/strong&gt;
No development environment or configuration is needed. Everything runs in the browser, making it friendly for non‑technical users and ideal for quick experimentation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No‑code experience&lt;/strong&gt;
Business users can build functional AI apps without engineering support.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free to use&lt;/strong&gt;
Low‑risk experimentation for teams exploring AI productivity tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business‑friendly workflow&lt;/strong&gt;
Clear navigation from input to output, unlike a chatbot where context can be lost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast app creation&lt;/strong&gt;
You can go from idea to working prototype in minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easy distribution&lt;/strong&gt;
Share a single link with colleagues or clients.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built‑in versioning support&lt;/strong&gt;
PartyRock keeps versions of your app as you iterate. This makes it easy to experiment, roll back changes, and refine your workflow without worrying about losing previous configurations. It’s especially helpful when you’re tuning prompts or adjusting the app structure over multiple iterations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced tuning available&lt;/strong&gt;
Power users can adjust prompts and model settings for better accuracy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Where It Can Improve&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Limited file management&lt;/strong&gt;
No custom buttons for selective file removal or opt‑in/opt‑out document handling, which reduces control for business workflows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No support for processing links&lt;/strong&gt;
PartyRock cannot read or extract information from a URL. Users must manually copy and paste website content, which slows down tasks like handling job postings or referencing online materials.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No built‑in download options&lt;/strong&gt;
You cannot export generated content as PDF or Word files, which adds manual steps to daily work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No reset function&lt;/strong&gt;
Refreshing the page resets the entire session, which may cause loss of progress.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inconsistent guidance from Whiskers&lt;/strong&gt;
Whiskers sometimes provides instructions for features that do not exist.
For example, it initially told me to download a .docx file from a widget menu, then later corrected itself and said PartyRock does not support downloads.
This can confuse users and lead to unnecessary redesign of the workflow.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Overall Perspective on AWS PartyRock&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AWS PartyRock is a strong entry‑level no-code platform for rapid AI prototyping. In my case, it took about 20 minutes to build and share a fully working app, which makes it ideal for quick experimentation and early validation of ideas.&lt;/p&gt;

&lt;p&gt;It allows users to explore AI‑assisted workflows, test concepts, and understand how AI can enhance productivity without requiring engineering resources or technical setup. The no‑code interface, zero environment configuration, and built‑in versioning make it easy to iterate and refine ideas quickly.&lt;/p&gt;

&lt;p&gt;PartyRock is designed for fast learning cycles and creative exploration. It provides a simple way to try out new AI‑driven workflows before deciding whether to develop a more advanced or customized solution later on.&lt;/p&gt;

&lt;p&gt;The post &lt;a href="https://blog.jonanata.com/hands-on-with-aws-partyrock-my-first-app-and-key-takeaways/" rel="noopener noreferrer"&gt;Hands‑On with AWS PartyRock: My First App and Key Takeaways&lt;/a&gt; appeared first on &lt;a href="https://blog.jonanata.com" rel="noopener noreferrer"&gt;Behind the Build&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>aws</category>
      <category>partrock</category>
    </item>
  </channel>
</rss>
