---
# System prepended metadata

title: AWS 雲端架構實作交流會

---

# 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)

---
