# AWS 雲端架構實作交流 --- [1. 登入 AWS Management Console](#1-%E7%99%BB%E5%85%A5-AWS-Management-Console) [2. 建立 IAM Policy 以限定存取方式](#2-%E5%BB%BA%E7%AB%8B-IAM-Policy-%E4%BB%A5%E9%99%90%E5%AE%9A%E5%AD%98%E5%8F%96%E6%96%B9%E5%BC%8F) [3. 建立 S3 Bucket](#3-%E5%BB%BA%E7%AB%8B-S3-Bucket) [4. 建立 VPC 網路環境](#4-%E5%BB%BA%E7%AB%8B-VPC-%E7%B6%B2%E8%B7%AF%E7%92%B0%E5%A2%83) [5. 建立 IAM Users and Roles](#5-%E5%BB%BA%E7%AB%8B-IAM-Users-and-Roles) [6. 建立 EC2 Instance](#6-%E5%BB%BA%E7%AB%8B-EC2-Instance) [7. 設定 Audit Log (CloudTrail)](#7-%E8%A8%AD%E5%AE%9A-Audit-Log-CloudTrail) [8. 設定 Budget Alarm](#8-%E8%A8%AD%E5%AE%9A-Budget-Alarm) --- ## 1. 登入 AWS Management Console >[!Tip] 提醒 >**建議瀏覽器:Firefox、Chrome** ### 1-1. 通過 AWS Management Console Signin Console 登入 :::spoiler **操作步驟** 1. 進入 [AWS Management Console](https://console.aws.amazon.com/),並輸入 **Account ID / Alias** 及 Admin 的 **User Name** 及 **Password** 後,點擊 **「Sign in」** 登入。 ![圖片](https://hackmd.io/_uploads/r1_mKKNrR.png) 2. 進入 AWS Management Console 後,即完成登入。 ![圖片](https://hackmd.io/_uploads/HJfDqK4H0.png) ::: ### 1-2. 使用 AWS 練習環境 :::spoiler **操作步驟** 1. 進入課程提供的 AWS Workshop Studio 網址 (https://catalog.us-east-1.prod.workshops.aws/join?access-code=311d-09569a-23),並點擊 **「Email one-time password (OTP)」**,以獲得一次性臨時密碼。 ![圖片](https://hackmd.io/_uploads/SyrbMYEH0.png) 2. 輸入**自己的 Email** 以用於接收一次性臨時密碼 ,並點擊 **「傳送密碼」**。 ![圖片](https://hackmd.io/_uploads/r1nU7KNrC.png) >[!Tip] 提醒 >**活動期間使用相同 Email 進行登入將會使用相同的練習環境** 3. 進入自己的 Email 以取得 **9 碼 Passcode**。 ![圖片](https://hackmd.io/_uploads/rJhmNt4rC.png) 4. 將 9 碼 Passcode 填入,並點擊 **「登入」**。 ![圖片](https://hackmd.io/_uploads/BySiVKNB0.png) 5. 登入並進行環境使用要求條款後,請勾選 **「I agree with the Terms and Conditions」**,並點擊 **「Join event」**。 ![圖片](https://hackmd.io/_uploads/r14SItErA.png) ==中間省略== ![圖片](https://hackmd.io/_uploads/B1wWLK4rC.png) 6. 點擊 **「Open AWS console」**,以開啟 AWS Management Console。 ![圖片](https://hackmd.io/_uploads/SJSEvtNSC.png) >[!Tip] 提醒 >**練習過程中,若 AWS Management Console 逾時登出,可再次點擊此連結以重新登入並更新憑證** 7. 進入 AWS Management Console 後,即完成登入。 ![圖片](https://hackmd.io/_uploads/SkIu9KVSA.png) ::: ### 1-3. 通過 AWS Identity Center 登入 (Optional) :::spoiler **操作步驟** 1. 進入 AWS Identity Center 登入網址,並輸入 **Username** 及 **Password**,完成後點擊 **「Sign in」**。 ![圖片](https://hackmd.io/_uploads/B1zwstVHC.png) 2. 登入後,選擇**對應 AWS Account 的 Admin 權限**後,點擊連結以登入。 ![圖片](https://hackmd.io/_uploads/H1SAiKNBA.png) 3. 進入 AWS Management Console 後,即完成登入。 ![圖片](https://hackmd.io/_uploads/SkIu9KVSA.png) :::   [[返回大綱]](#AWS-%E9%9B%B2%E7%AB%AF%E6%9E%B6%E6%A7%8B%E5%AF%A6%E4%BD%9C%E4%BA%A4%E6%B5%81) --- ## 2. 建立 IAM Policy 以限定存取方式 ### 2-1. 強制 Admin MFA 登入 :::spoiler **操作步驟** 1. 進入 **「Security credentials」** 介面以綁定 MFA。 ![圖片](https://hackmd.io/_uploads/rkV0Rt4SC.png) 2. 點擊 **「Assign MFA device」** 進入 MFA 綁定畫面。 ![圖片](https://hackmd.io/_uploads/rkQPkc4HA.png) 3. 根據 MFA 裝置選擇合適的方式進行設置。 ![圖片](https://hackmd.io/_uploads/rJY31q4HC.png) 4. 完成 MFA 設定後,進入 **「Policies」** > **「Create policy」** 以建立用於強制 MFA 登入操作的 IAM Policy。 ![圖片](https://hackmd.io/_uploads/B1ZGF94HC.png) 5. 點擊 **「JSON」** 並貼上下方 ==**IAM Policy 範例**==,完成後點擊 **「Next」**。 ![圖片](https://hackmd.io/_uploads/rkVyO54rA.png) ==**IAM Policy 範例:**== *IAM User 綁定此 Policy 時,若未設定 MFA 即使使用 Administrator 權限也無法進行任何操作。* ```json= { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowViewAccountInfo", "Effect": "Allow", "Action": "iam:ListVirtualMFADevices", "Resource": "*" }, { "Sid": "AllowManageOwnVirtualMFADevice", "Effect": "Allow", "Action": [ "iam:CreateVirtualMFADevice" ], "Resource": "arn:aws:iam::*:mfa/*" }, { "Sid": "AllowManageOwnUserMFA", "Effect": "Allow", "Action": [ "iam:DeactivateMFADevice", "iam:EnableMFADevice", "iam:GetUser", "iam:GetMFADevice", "iam:ListMFADevices", "iam:ResyncMFADevice" ], "Resource": "arn:aws:iam::*:user/${aws:username}" }, { "Sid": "DenyAllExceptListedIfNoMFA", "Effect": "Deny", "NotAction": [ "iam:CreateVirtualMFADevice", "iam:EnableMFADevice", "iam:GetUser", "iam:ListMFADevices", "iam:ListVirtualMFADevices", "iam:ResyncMFADevice", "sts:GetSessionToken", "iam:ChangePassword" ], "Resource": "*", "Condition": { "BoolIfExists": { "aws:MultiFactorAuthPresent": "false" } } } ] } ``` ![圖片](https://hackmd.io/_uploads/HJxbLi4rR.png) 6. 輸入 **Policy name** `Required_MFA`,點擊 **「Create policy」** 完成 IAM Policy 建立。 ![圖片](https://hackmd.io/_uploads/BJ0MujVSA.png) ==中間省略== ![圖片](https://hackmd.io/_uploads/r1GBdsEHA.png) 7. 點擊 **「Users」** > **「admin」**,以套用 IAM Policy。 ![圖片](https://hackmd.io/_uploads/rkEqY5Er0.png) 8. 點擊 **「Add permissions」**。 ![圖片](https://hackmd.io/_uploads/SktJ5q4B0.png) 9. 選擇 **「Attach policies directly」**,勾選 **IAM Policy** `Required_MFA` 後,點擊 **「Next」**。 ![圖片](https://hackmd.io/_uploads/Bk3BccVrR.png) 10. 點擊 **「Add permissions」** 完成 IAM Policy 設定。 ![圖片](https://hackmd.io/_uploads/ryNkFi4B0.png) :::warning :bulb: 當套用了 `Required_MFA` Policy,若未通過 MFA 登入,在進行任何操作都將會出現 Access denied 錯誤。 ![圖片](https://hackmd.io/_uploads/Skgyn94HA.png) ::: ::: ### 2-2. 強制僅允許特定 Client IP 行使權限 (Optional) :::spoiler **操作步驟** 1. 進入 **「IAM」** > **「Policies」** > **「Create policy」**,以建立僅限特定 Client IP 存取的 IAM Policy。 ![圖片](https://hackmd.io/_uploads/B1FnxjES0.png) 2. 點擊 **「JSON」** 並貼上下方 ==**IAM Policy 範例**==,完成後點擊 **「Next」**。 ![圖片](https://hackmd.io/_uploads/HJwpro4BR.png) ==**IAM Policy 範例:**== *請將 ==[Your_Allowed_IP_Addresses_Here]== (含中括號) 修改為允許的 CIDR Range(s)。* ```json= { "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "*", "Resource": "*", "Condition": { "NotIpAddress": { "aws:SourceIp": [ "[Your_Allowed_IP_Addresses_Here]" ] } } } ] } ``` ![圖片](https://hackmd.io/_uploads/HJxbLi4rR.png) 3. 輸入 **Policy name** `Restricted_SourceIP`,點擊 **「Create policy」** 完成 IAM Policy 建立。 ![圖片](https://hackmd.io/_uploads/SkMvDsVBA.png) ==中間省略== ![圖片](https://hackmd.io/_uploads/SkE8dsNS0.png) :::warning :bulb: 將 **IAM Policy** `Restricted_SourceIP` 套用到 IAM User(s)/Role(s),若登入時的客戶端 IP 非屬於允許的 CIDR 範圍,在進行任何操作都將會出現 Access denied 錯誤。 ![圖片](https://hackmd.io/_uploads/Skgyn94HA.png) ::: :::   [[返回大綱]](#AWS-%E9%9B%B2%E7%AB%AF%E6%9E%B6%E6%A7%8B%E5%AF%A6%E4%BD%9C%E4%BA%A4%E6%B5%81) --- ## 3. 建立 S3 Bucket ### 3-1. 建立 Training Data 的 S3 Bucket :::spoiler **操作步驟** 1. 進入 **「S3」** > **「Buckets」** > **「Create bucket」**,以建立 S3 Bucket。 ![圖片](https://hackmd.io/_uploads/SkPHUhVS0.png) 2. 輸入 **Bucket name** `federated-learning-trainingdata-ap-northeast-1-[Account-ID]`,完成後點擊 **「Create bucket」**,以建立 S3 Bucket。 >[!Tip] 提醒 >**S3 bucket name 為全球獨立唯一命名,因此建立名稱時需注意其獨立性,即使是不同的 Region 或 Account,也皆須保持其名稱獨立性才能建立。** >您可將 ==[Account-ID]== 更改為任何標註名稱 ![圖片](https://hackmd.io/_uploads/SJOyTn4rC.png) ==中間省略== ![圖片](https://hackmd.io/_uploads/B1MMT3NrA.png) 3. [Optional] 點擊 **Bucket name** `federated-learning-trainingdata-ap-northeast-1-[Account-ID]`,以設定其 Bucket Policy。 ![圖片](https://hackmd.io/_uploads/Byfz03VH0.png) 4. [Optional] 點擊 **「Permissions」** 分頁 > **Bucket policy** 區塊 > **「Edit」**。 ![圖片](https://hackmd.io/_uploads/B1QP03NrC.png) ==中間省略== ![圖片](https://hackmd.io/_uploads/S1uky6ESA.png) 5. [Optional] 貼上下方 **==Bucket Policy 範例==**,完成後點擊 **「Save changes」**。 ![圖片](https://hackmd.io/_uploads/r1F9baNrR.png) >[!Tip] 提醒 >**1. 請務必將 Resource 中的 ARN (Amazon Resource Name) 調整成符合您的設定** >**2. 請務必將 [Account-ID] 調整成符合您的設定 (含中括號)** **==Bucket Policy 範例==** *此 Policy 將限制 S3 的任何存取僅能通過自身 Account 的 User(s) / Role(s)* ```json= { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::[Account-ID]:root" }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::federated-learning-trainingdata-ap-northeast-1-[Account-ID]", "arn:aws:s3:::federated-learning-trainingdata-ap-northeast-1-[Account-ID]/*" ], "Condition": { "StringEquals": { "aws:PrincipalAccount": "[Account-ID]" } } } ] } ``` ![圖片](https://hackmd.io/_uploads/rJ2_GaVBC.png) :::info :bulb: 可參考[此連結](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html?icmpid=docs_amazons3_console)以按照需求調整 Bucket Policy,例如限制可存取的 IP 範圍、限定可存取的 IAM Users、或是必須使用 MFA 等。 ::: ::: ### 3-2. 建立 CaFe Artifacts 的 S3 Bucket :::spoiler **操作步驟** 1. 進入 **「S3」** > **「Buckets」** > **「Create bucket」**,以建立 S3 Bucket。 ![圖片](https://hackmd.io/_uploads/SkPHUhVS0.png) 2. 輸入 **Bucket name** `federated-learning-cafeartifact-ap-northeast-1-[Account-ID]`,完成後點擊 **「Create bucket」**,以建立 S3 Bucket。 >[!Tip] 提醒 >**S3 bucket name 為全球獨立唯一命名,因此建立名稱時需注意其獨立性,即使是不同的 Region 或 Account,也皆須保持其名稱獨立性才能建立。** >您可將 ==[Account-ID]== 更改為任何標註名稱 ![圖片](https://hackmd.io/_uploads/rybxrp4BC.png) ==中間省略== ![圖片](https://hackmd.io/_uploads/SkcGHTVB0.png) 3. [Optional] 點擊 **Bucket name** `federated-learning-cafeartifact-ap-northeast-1-[Account-ID]`,以設定其 Bucket Policy。 ![圖片](https://hackmd.io/_uploads/BJ9vSTESC.png) 4. [Optional] 點擊 **「Permissions」** 分頁 > **Bucket policy** 區塊 > **「Edit」**。 ![圖片](https://hackmd.io/_uploads/HkYJI6VBC.png) ==中間省略== ![圖片](https://hackmd.io/_uploads/S1TGI64SA.png) 5. [Optional] 貼上下方 **==Bucket Policy 範例==**,完成後點擊 **「Save changes」**。 ![圖片](https://hackmd.io/_uploads/SJ5FLaNBA.png) >[!Tip] 提醒 >**1. 請務必將 Resource 中的 ARN (Amazon Resource Name) 調整成符合您的設定** >**2. 請務必將 [Account-ID] 調整成符合您的設定 (含中括號)** **==Bucket Policy 範例==** *此 Policy 將限制 S3 的任何存取僅能通過自身 Account 的 User(s) / Role(s)* ```json= { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::[Account-ID]:root" }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::federated-learning-cafeartifact-ap-northeast-1-[Account-ID]", "arn:aws:s3:::federated-learning-cafeartifact-ap-northeast-1-[Account-ID]/*" ], "Condition": { "StringEquals": { "aws:PrincipalAccount": "[Account-ID]" } } } ] } ``` ![圖片](https://hackmd.io/_uploads/rJ2_GaVBC.png) :::info :bulb: 可參考[此連結](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html?icmpid=docs_amazons3_console)以按照需求調整 Bucket Policy,例如限制可存取的 IP 範圍、限定可存取的 IAM Users、或是必須使用 MFA 等。 ::: :::   [[返回大綱]](#AWS-%E9%9B%B2%E7%AB%AF%E6%9E%B6%E6%A7%8B%E5%AF%A6%E4%BD%9C%E4%BA%A4%E6%B5%81) --- ## 4. 建立 VPC 網路環境 ### 4.1 建立 VPC 虛擬私有網路 :::spoiler **操作步驟** 1. 進入 **「VPC」** > **「Your VPCs」** > **「Create VPC」**,以建立 VPC。 ![圖片](https://hackmd.io/_uploads/SJIuwpVrA.png) 2. 輸入以下參數,完成後點擊 **「Create VPC」**,以建立 VPC。 >[!Tip] 提醒 >**建議各家採用不同的 CIDR 網段,以利後續的測試彈性** 參數 | 值 ----|----- Resource to create | `VPC and more` Name tag auto-generation | `fed-learning` Auto-generate | `勾選` IPv4 CIDR block | `建議各家選用不同的 CIDR Range` Number of Availability Zones | `3` Number of public subnets | `3` Number of private subnets | `3` NAT gateway ($) | `None` (未來可調整) VPC endpoints | `S3 Gateway` DNS options | `兩個選項都確認勾選` ![圖片](https://hackmd.io/_uploads/S11cKa4S0.png) ![圖片](https://hackmd.io/_uploads/B1Hyc64HA.png) ![圖片](https://hackmd.io/_uploads/HkRHqTVrC.png) 3. 等待 VPC 建立完成的同時,紀錄 **VPC ID**,將用於限制 EC2 Instance 使用的 IAM Role 僅能從此 VPC 存取。 ![圖片](https://hackmd.io/_uploads/Sy21h6ES0.png) 4. 進入 **「Subnets」** > 搜尋 **"subnet-public"**,並尋找 **Availability Zone ID** 為 **「apne1-az1」** 的 Public Subnet,紀錄該 **Public Subnet Name 與 ID**,將用於建立 EC2 Instance。 ![圖片](https://hackmd.io/_uploads/H1EHM-HrR.png) ::: ### 4.2 設定 S3 通過內部 (S3 Gateway Endpoint) 路由傳輸 :::spoiler **操作步驟** 1. 進入 **「VPC」** > **「Endpoints」** > 勾選 `fed-learning-vpce-s3` > 切換 **「Route tables」** 分頁 > 點擊 **「Manage route tables」**。 ![圖片](https://hackmd.io/_uploads/H1QsijrrA.png) 2. 勾選 `fed-learning-rtb-public`,完成後點擊 **「Modify route tables」**。 ![圖片](https://hackmd.io/_uploads/Byc2ijBH0.png) :::   [[返回大綱]](#AWS-%E9%9B%B2%E7%AB%AF%E6%9E%B6%E6%A7%8B%E5%AF%A6%E4%BD%9C%E4%BA%A4%E6%B5%81) --- ## 5. 建立 IAM Users and Roles ### 5-1. 建立 IAM User (用於上傳訓練資料至 S3 Bucket) :::spoiler **操作步驟** 1. 進入 **「Policies」** > **「Create policy」**,以建立上傳訓練資料至 S3 Bucket 的 IAM Policy。 ![圖片](https://hackmd.io/_uploads/B1FnxjES0.png) 2. 點擊 **「JSON」** 並貼上下方 ==**IAM Policy 範例**==,完成後點擊 **「Next」**。 ![圖片](https://hackmd.io/_uploads/ByxF2R4HR.png) >[!Tip] 提醒 >**請務必將 [Account-ID] 調整成符合您的設定 (含中括號)** ==**IAM Policy 範例:**== *此 Policy 將允許 IAM User:(1) 列出所有 buckets、(2) 上傳及刪除特定 bucket 的 objects、(3) 存取自己的 IAM 相關資訊、(4) 變更密碼、(5) 管理 Access Key、(6) 管理 MFA。* ```json= { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowListBuckets", "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets" ], "Resource": "*" }, { "Sid": "AllowS3Put", "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:DeleteObject", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::federated-learning-trainingdata-ap-northeast-1-[Accound-ID]", "arn:aws:s3:::federated-learning-trainingdata-ap-northeast-1-[Accound-ID]/*" ] }, { "Sid": "AllowManageSecurityCredentials", "Effect": "Allow", "Action": [ "iam:ChangePassword", "iam:CreateLoginProfile", "iam:DeleteLoginProfile", "iam:GetAccountPasswordPolicy", "iam:GetLoginProfile", "iam:GetUser", "iam:UpdateLoginProfile", "iam:ListSigningCertificates" ], "Resource": "arn:aws:iam::*:user/${aws:username}" }, { "Sid": "AllowManageAccessKey", "Effect": "Allow", "Action": [ "iam:CreateAccessKey", "iam:DeleteAccessKey", "iam:ListAccessKeys", "iam:UpdateAccessKey", "iam:TagUser", "iam:ListUserTags", "iam:GetAccessKeyLastUsed" ], "Resource": "arn:aws:iam::*:user/${aws:username}" }, { "Sid": "AllowManageMFA", "Effect": "Allow", "Action": [ "iam:EnableMFADevice", "iam:DeactivateMFADevice", "iam:ListMFADevices", "iam:ResyncMFADevice" ], "Resource": [ "arn:aws:iam::*:user/${aws:username}" ] }, { "Sid": "AllowManageVirtualMFADevice", "Effect": "Allow", "Action": [ "iam:CreateVirtualMFADevice", "iam:DeleteVirtualMFADevice", "iam:ListVirtualMFADevices" ], "Resource": "arn:aws:iam::*:mfa/*" } ] } ``` ![圖片](https://hackmd.io/_uploads/HJxbLi4rR.png) 3. 輸入 **Policy name** ``Federated_Learning_S3_Uploader``,點擊 **「Create policy」** 完成 IAM Policy 建立。 ![圖片](https://hackmd.io/_uploads/r1P6csNBR.png) ==中間省略== ![圖片](https://hackmd.io/_uploads/SkE8dsNS0.png) 4. 進入 **「Users」**> **「Create user」** 以建立 IAM User。 ![圖片](https://hackmd.io/_uploads/HkeMR9EHC.png) 5. 設定以下參數,完成後點擊 **「Next」**。 參數 | 值 ----|----- User name | ``s3_uploader`` Provide user access to the AWS Management Console | ``勾選`` Console password | ``Custom password (並設定初始密碼)`` Users must create a new password at next sign-in | ``若希望在第一次登入時,強制調整密碼則勾選`` ![圖片](https://hackmd.io/_uploads/SJWzeo4H0.png) ![圖片](https://hackmd.io/_uploads/BkRXgsVHC.png) 6. 選擇 **「Attach policies directly」**,勾選 IAM Policy ``Federated_Learning_S3_Uploader`` 後,點擊 **「Next」**。 ![圖片](https://hackmd.io/_uploads/S1zlhjVHR.png) ![圖片](https://hackmd.io/_uploads/rkfN2oEBA.png) 7. 點擊 **「Create user」** 完成 IAM User 建立。 ![圖片](https://hackmd.io/_uploads/Bk2_hoVSC.png) 8. 將登入資訊提供給負責人員進行登入及存取操作。 ![圖片](https://hackmd.io/_uploads/BJv-ZhVBA.png) ::: ### 5-2. 建立 IAM Role (提供 EC2 Instance 取得 S3 Bucket 資料) :::spoiler **操作步驟** 1. 進入 **「Policies」** > **「Create policy」**,以建立至 S3 Bucket 下載資料的 IAM Policy。 ![圖片](https://hackmd.io/_uploads/B1FnxjES0.png) 2. 點擊 **「JSON」** 並貼上下方 ==**IAM Policy 範例**==,完成後點擊 **「Next」**。 ![圖片](https://hackmd.io/_uploads/B1OmCRVSR.png) >[!Tip] 提醒 >**1. 請務必將 [Account-ID] 調整成符合您的設定 (含中括號)** >**2. 請務必將 VPC ID 調整為您的 VPC ID** ==**IAM Policy 範例:**== *此 Policy 將允許 IAM User:(1) 列出所有 buckets、(2) 下載及刪除特定 bucket 的 objects、(3) 限定使用此權限者僅能來自特定 VPC。* ```json= { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowListBuckets", "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets" ], "Resource": "*" }, { "Sid": "AllowS3GetTrainingData", "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:DeleteObject", "s3:GetObject" ], "Resource": [ "arn:aws:s3:::federated-learning-trainingdata-ap-northeast-1-[Account-ID]", "arn:aws:s3:::federated-learning-trainingdata-ap-northeast-1-[Account-ID]/*" ] }, { "Sid": "AllowS3GetCaFeArtifact", "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:DeleteObject", "s3:GetObject" ], "Resource": [ "arn:aws:s3:::federated-learning-cafeartifact-ap-northeast-1-[Account-ID]", "arn:aws:s3:::federated-learning-cafeartifact-ap-northeast-1-[Account-ID]/*" ] }, { "Sid": "RestrictSpecificVPCOnly", "Effect": "Deny", "Action": "*", "Resource": "*", "Condition": { "StringNotEqualsIfExists": { "aws:SourceVpc": "[VPC-ID]" } } } ] } ``` ![圖片](https://hackmd.io/_uploads/HJxbLi4rR.png) 3. 輸入 **Policy name** `Federated_Learning_S3_Downloader`,點擊 **「Create policy」** 完成 IAM Policy 建立。 ![圖片](https://hackmd.io/_uploads/r1S11JHSR.png) ==中間省略== ![圖片](https://hackmd.io/_uploads/SkE8dsNS0.png) 4. 進入 **「Roles」**> **「Create role」** 以建立 IAM Role。 ![圖片](https://hackmd.io/_uploads/rJZBk1rSA.png) 5. 設定以下參數,完成後點擊 **「Next」**。 參數 | 值 ----|----- Trusted entity type | `AWS service` Service or use case | `EC2` ![圖片](https://hackmd.io/_uploads/Hy9K1krrR.png) ![圖片](https://hackmd.io/_uploads/S1uzeJSrC.png) 6. 選擇 **IAM Policy** `Federated_Learning_S3_Downloader`,完成後點擊 **「Next」**。 ![圖片](https://hackmd.io/_uploads/H1tTg1rS0.png) 7. 輸入 **Role name** `Federated_Learning_S3_Downloader`,完成後點擊 **「Create role」** 完成 IAM Role 建立。 ![圖片](https://hackmd.io/_uploads/BJWB-yHrR.png) ==中間省略== ![圖片](https://hackmd.io/_uploads/BJWtWyrSA.png) ::: ### 5-3. 建立 IAM Role (提供 Arbiter 上傳 CaFe Artifacts 至 S3 Bucket) :::spoiler **操作步驟** 1. 進入 **「Policies」** > **「Create policy」**,以建立至 S3 Bucket 上傳 Cafe Artifact 的 IAM Policy。 ![圖片](https://hackmd.io/_uploads/B1FnxjES0.png) 2. 點擊 **「JSON」** 並貼上下方 ==**IAM Policy 範例**==,完成後點擊 **「Next」**。 ![圖片](https://hackmd.io/_uploads/SyhNXyrSA.png) >[!Tip] 提醒 >**請務必將 [Account-ID] 調整成符合您的設定 (含中括號)** ==**IAM Policy 範例:**== ```json= { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowS3PutCaFeArtifact", "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:DeleteObject", "s3:GetObject", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::federated-learning-cafeartifact-ap-northeast-1-[Account-ID]", "arn:aws:s3:::federated-learning-cafeartifact-ap-northeast-1-[Account-ID]/*" ] } ] } ``` ![圖片](https://hackmd.io/_uploads/HJxbLi4rR.png) 3. 輸入 **Policy name** `Federated_Learning_CaFeArtifact_Uploader`,點擊 **「Create policy」** 完成 IAM Policy 建立。 ![圖片](https://hackmd.io/_uploads/r1lRiQkrBC.png) ==中間省略== ![圖片](https://hackmd.io/_uploads/SkE8dsNS0.png) 4. 進入 **「Roles」**> **「Create role」** 以建立 IAM Role。 ![圖片](https://hackmd.io/_uploads/rJZBk1rSA.png) 5. 設定以下參數,完成後點擊 **「Next」**。 參數 | 值 ----|----- Trusted entity type | `AWS account` Another AWS account | `圈選` Account ID | `[Arbiter_Account_ID]` Require external ID | `勾選` External ID | `約定通關密語` Required MFA | `勾選` ![圖片](https://hackmd.io/_uploads/B16WVJrrR.png) ![圖片](https://hackmd.io/_uploads/HJ-NH1SBC.png) 6. 選擇 **IAM Policy** `Federated_Learning_CaFeArtifact_Uploader`,完成後點擊 **「Next」**。 ![圖片](https://hackmd.io/_uploads/S1nurkHH0.png) 7. 輸入 **Role name** `Federated_Learning_CaFeArtifact_Uploader`,完成後點擊 **「Create role」** 完成 IAM Role 建立。 ![圖片](https://hackmd.io/_uploads/Hyl3HkSHR.png) ==中間省略== ![圖片](https://hackmd.io/_uploads/BJWtWyrSA.png) :::info :bulb: **Arbiter 可通過 assume IAM Role 上傳 CaFe Artifact(s) 至其他 Account(s) 的 S3 Buckets。** 1. 賦予 Arbiter assume role 至其他 Account(s) 的權限。 ==*([Target_Account_ID] 需調整為其他 Account ID)*== ```json= { "Version": "2012-10-17", "Statement": [ { "Sid": "AssumeRoleToAnotherAccounts", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource":[ "arn:aws:iam::[Target_Account_ID]:role/Federated_Learning_CaFeArtifact_Uploader" ] } ] } ``` 2. 通過 CLI 登入 Arbiter 後,執行下方 CLI 指令以 Assume 其他 Account(s) 的 IAM Role,成功將獲得臨時 Access Key ID、Secret Access Key 與 Session Token。 ==*([Target_Account_ID] 需調整為其他 Account ID、[External_ID] 需調整為正確通關密語)*== ```bash= aws sts assume-role --role-arn arn:aws:iam::[Target_Account_ID]:role/Federated_Learning_CaFeArtifact_Uploader --role-session-name SESSION_NAME --external-id [External_ID] ``` ![圖片](https://hackmd.io/_uploads/rJWx2lBSR.png) 3. 確認可成功獲得臨時憑證後,將臨時憑證設置為環境變數;或參考下方指令直接帶入環境變數,完成後即可進行相關 S3 操作。 ==*([Target_Account_ID] 需調整為其他 Account ID、[External_ID] 需調整為正確通關密語)*== ```bash= $(aws sts assume-role --role-arn arn:aws:iam::[Target_Account_ID]:role/Federated_Learning_CaFeArtifact_Uploader --role-session-name SESSION_NAME --external-id [External_ID] --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]' --output text | awk '{print "export AWS_ACCESS_KEY_ID=" $1 "\n" "export AWS_SECRET_ACCESS_KEY=" $2 "\n" "export AWS_SESSION_TOKEN=" $3}') ``` ![圖片](https://hackmd.io/_uploads/H19MkbBr0.png) ::: :::   [[返回大綱]](#AWS-%E9%9B%B2%E7%AB%AF%E6%9E%B6%E6%A7%8B%E5%AF%A6%E4%BD%9C%E4%BA%A4%E6%B5%81) --- ## 6. 建立 EC2 Instance ### 6-1. 建立 Elastic IP :::spoiler **操作步驟** 1. 進入 **「EC2」** > **「Elastic IPs」** > **「Allocate Elastic IP address」**,以申請對外 IP。 ![圖片](https://hackmd.io/_uploads/HypxcZrBC.png) 2. 點擊 **「Allocate」**,完成 IP 申請。 ![圖片](https://hackmd.io/_uploads/BkwBqZBH0.png) 3. 編輯名稱,輸入 **Name** `Federated Learning Instance`,完成後點擊 **「Save」**。 ![圖片](https://hackmd.io/_uploads/B1OncbBBR.png) ::: ### 6-2. 建立 EC2 Instance、 Key Pair 及 Security Group (防火牆) :::spoiler **操作步驟** 1. 進入 **「EC2」** > **「Instances」** > **「Launch instances」**,以建立 EC2 Instance。 ![圖片](https://hackmd.io/_uploads/rkbz7brSA.png) 2. 設定以下參數,完成後點擊 **「Launch instance」**。 >[!Tip] 提示 >**建立過程將會自動下載用於登入 EC2 Instance 的 key pair 檔案 (Private Key),請務必將其保存好,後續無法補發。** 參數 | 值 ----|----- Name | `Federated Learning Instance` Application and OS Images | `Ubuntu Server 22.04 LTS` Instance type | `t2.micro` or `t3.micro` *(之後可修改)* Key pair (login) | `Create new key pair: (Key pair name: federated_learning_instance, Private key file format: 依需求選擇)` Network settings | `點擊 Edit` VPC | `fed-learning-vpc` Subnet | `選擇 Availability Zone ID 位於 apne1-az1 的 Public Subnet` Security group name | `federated-learning-instance` Inbound Security Group Rules | `ssh - Anywhere` *(之後可修改)* Configure storage | `點擊 Advanced` Size (GiB) | `100` Encrypted | `Encrypted` KMS key | `aws/ebs` Advanced details | `展開` IAM instance profile | `Federated_Learning_S3_Downloader` ![圖片](https://hackmd.io/_uploads/r1UQ8bHHA.png) ![圖片](https://hackmd.io/_uploads/H1wvL-HHA.png) ![圖片](https://hackmd.io/_uploads/HyUnIZBBA.png) ![圖片](https://hackmd.io/_uploads/SybDDZHr0.png) ![圖片](https://hackmd.io/_uploads/rJA4ubSrA.png) ![圖片](https://hackmd.io/_uploads/HkEddZSHC.png) ![圖片](https://hackmd.io/_uploads/Hyy3O-BHR.png) ![圖片](https://hackmd.io/_uploads/BJVWKbSBR.png) 3. 點擊 **EC2 instance ID** 以確認其啟動狀態 ![圖片](https://hackmd.io/_uploads/HykwFWHSC.png) 4. 當出現 ==**2/2 checks passed**==,即表示 EC2 Instance 已就緒。 ![圖片](https://hackmd.io/_uploads/ByTLs-HB0.png) ::: ### 6-3. 套用 Elastic IP 至 EC2 Instance :::spoiler **操作步驟** 1. 進入 **「EC2」** > **「Elastic IPs」** > 勾選 EIP `Federated Learning Instance` > **「Actions」** > **「Allocate Elastic IP address」**。 ![圖片](https://hackmd.io/_uploads/HkQPhWSHR.png) 2. 選擇 **Instance** `Federated Learning Instance`,完成後點擊 **「Associate」** ![圖片](https://hackmd.io/_uploads/HkvXabrrC.png) ::: ### 6-4. 登入 EC2 Instance :::spoiler **操作步驟** 開啟 Command Line 工具,並輸入以下指令以完成登入操作。 1. 變更 Key Pair (Private Key) 檔案執行權限 ```bash= chmod 400 federated_learning_instance.pem ``` 2. 通過 Elastic IP 登入 EC2 ==(需將 [Elastic-IP] 調整為您訂閱的 Public IP)== ```bash= ssh -i federated_learning_instance.pem ec2-user@[Elastic-IP] ``` 3. 若出現如下畫面即表示連線測試成功。執行 `aws s3 ls s3://federated-learning-trainingdata-ap-northeast-1-[Account-ID]` 指令,測試 **IAM instance profile** `Federated_Learning_S3_Downloader` 所賦予的權限。 ![圖片](https://hackmd.io/_uploads/SyipxnBH0.png) ::: ### 6-5. 調整 Security Group (Firewall) :::spoiler **操作步驟** 1. 進入 **「EC2」** > **「Security Groups」** > 勾選 `federated-learning-instance` > 切換 **「Inbound rules」** 分頁 > 點擊 **「Edit inbound rules」**。 ![圖片](https://hackmd.io/_uploads/B1AFM2BBC.png) 2. 依需求增加及調整 Security Group (防火牆) 設定。 >[!Tip] 提示 >**Security Group 是預設阻擋流量的 Stateful 防火牆,因此僅需要針對發動端開通所需通道。** ![圖片](https://hackmd.io/_uploads/r1EF72SSC.png) ::: ### 6-6. 調整 EC2 Instance Type :::spoiler **操作步驟** 1. 選擇欲調整的 EC2 Instance,並點擊 **「Stop instance」** 以關閉該 EC2 Instance。 ![圖片](https://hackmd.io/_uploads/ryIklzSH0.png) 2. 當關閉完成時 ==(State: Stopped)==,點擊 **「Actions」** > **「Instance settings」** > **「Change instance type」**,以進行 EC2 Instance Type 變更。 ![圖片](https://hackmd.io/_uploads/B1p9lGHH0.png) 3. 依資源需求選擇合適的 Instance Type,完成後點擊 **「Apply」**。 ![圖片](https://hackmd.io/_uploads/HyJlbGrH0.png) ![圖片](https://hackmd.io/_uploads/H1fQ-fBSC.png) 4. 完成變更後,點擊 **「Instance state」** > **「Start instance」**,並等待其啟動完成 ==(2/2 checks passed)==。 ![圖片](https://hackmd.io/_uploads/rkutWzrH0.png) ::: ### 6-7. 檢視 EC2 Instance 資源狀態 :::spoiler **操作步驟** 進入 **「EC2」** > **「Instances」** > 勾選 `Federated Learning Instance` > 切換 **「Monitoring」** 分頁 ![圖片](https://hackmd.io/_uploads/rJWt5b8SA.png) ![圖片](https://hackmd.io/_uploads/r11JjZUBA.png) :::   [[返回大綱]](#AWS-%E9%9B%B2%E7%AB%AF%E6%9E%B6%E6%A7%8B%E5%AF%A6%E4%BD%9C%E4%BA%A4%E6%B5%81) --- ## 7. 設定 Audit Log (CloudTrail) :::spoiler **操作步驟** 1. 進入 **「CloudTrail」** > **「Event history」**,您將可於此處看到 90 天內的 AWS Audit Logs。 ![圖片](https://hackmd.io/_uploads/BJlkRW8rA.png) 2. 進入 **「CloudTrail」** > **「Trails」** > 點擊 **「Create trail」**,您可將 CloudTrial Audit Logs 長期存放於 S3 Bucket 中。 ![圖片](https://hackmd.io/_uploads/HkB90-UH0.png) ![圖片](https://hackmd.io/_uploads/BkAVJzUHC.png) ![圖片](https://hackmd.io/_uploads/B1ua1G8rC.png) ![圖片](https://hackmd.io/_uploads/BkEWgfLBR.png) ![圖片](https://hackmd.io/_uploads/HkxNlzLrC.png) ![圖片](https://hackmd.io/_uploads/HkFPlGUSC.png) ![圖片](https://hackmd.io/_uploads/B1ZcxzISC.png) :::   [[返回大綱]](#AWS-%E9%9B%B2%E7%AB%AF%E6%9E%B6%E6%A7%8B%E5%AF%A6%E4%BD%9C%E4%BA%A4%E6%B5%81) --- ## 8. 設定 Budget Alarm :::spoiler **操作步驟** 1. 進入 **「Billing and Cost Management」** > **「Budgets」** > **「Create budget」** ,以建立預算告警。 ![image](https://hackmd.io/_uploads/HJ9lxTSr0.png) 2. 選擇 **Use a template(simplified)** > **Monthly cost budget** > **輸入Budget名稱** > **Budget amount 輸入1800**。 ![image](https://hackmd.io/_uploads/ByealaBBA.png) 3. 輸入欲通知的Email並以逗號做分隔,輸入完後點選 **Create budget** 。 ![image](https://hackmd.io/_uploads/BJYpZTSH0.png) 在此配置下當: 1) 實際支出達到 85% (1530) 2) 實際支出達到 100% (1800) 3) 預測支出預期達到 100% (1800) 會發出告警信通知 :::   [[返回大綱]](#AWS-%E9%9B%B2%E7%AB%AF%E6%9E%B6%E6%A7%8B%E5%AF%A6%E4%BD%9C%E4%BA%A4%E6%B5%81) ---