# 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」** 登入。

2. 進入 AWS Management Console 後,即完成登入。

:::
### 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)」**,以獲得一次性臨時密碼。

2. 輸入**自己的 Email** 以用於接收一次性臨時密碼 ,並點擊 **「傳送密碼」**。

>[!Tip] 提醒
>**活動期間使用相同 Email 進行登入將會使用相同的練習環境**
3. 進入自己的 Email 以取得 **9 碼 Passcode**。

4. 將 9 碼 Passcode 填入,並點擊 **「登入」**。

5. 登入並進行環境使用要求條款後,請勾選 **「I agree with the Terms and Conditions」**,並點擊 **「Join event」**。

==中間省略==

6. 點擊 **「Open AWS console」**,以開啟 AWS Management Console。

>[!Tip] 提醒
>**練習過程中,若 AWS Management Console 逾時登出,可再次點擊此連結以重新登入並更新憑證**
7. 進入 AWS Management Console 後,即完成登入。

:::
### 1-3. 通過 AWS Identity Center 登入 (Optional)
:::spoiler **操作步驟**
1. 進入 AWS Identity Center 登入網址,並輸入 **Username** 及 **Password**,完成後點擊 **「Sign in」**。

2. 登入後,選擇**對應 AWS Account 的 Admin 權限**後,點擊連結以登入。

3. 進入 AWS Management Console 後,即完成登入。

:::
[[返回大綱]](#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。

2. 點擊 **「Assign MFA device」** 進入 MFA 綁定畫面。

3. 根據 MFA 裝置選擇合適的方式進行設置。

4. 完成 MFA 設定後,進入 **「Policies」** > **「Create policy」** 以建立用於強制 MFA 登入操作的 IAM Policy。

5. 點擊 **「JSON」** 並貼上下方 ==**IAM Policy 範例**==,完成後點擊 **「Next」**。

==**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"
}
}
}
]
}
```

6. 輸入 **Policy name** `Required_MFA`,點擊 **「Create policy」** 完成 IAM Policy 建立。

==中間省略==

7. 點擊 **「Users」** > **「admin」**,以套用 IAM Policy。

8. 點擊 **「Add permissions」**。

9. 選擇 **「Attach policies directly」**,勾選 **IAM Policy** `Required_MFA` 後,點擊 **「Next」**。

10. 點擊 **「Add permissions」** 完成 IAM Policy 設定。

:::warning
:bulb: 當套用了 `Required_MFA` Policy,若未通過 MFA 登入,在進行任何操作都將會出現 Access denied 錯誤。

:::
:::
### 2-2. 強制僅允許特定 Client IP 行使權限 (Optional)
:::spoiler **操作步驟**
1. 進入 **「IAM」** > **「Policies」** > **「Create policy」**,以建立僅限特定 Client IP 存取的 IAM Policy。

2. 點擊 **「JSON」** 並貼上下方 ==**IAM Policy 範例**==,完成後點擊 **「Next」**。

==**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]"
]
}
}
}
]
}
```

3. 輸入 **Policy name** `Restricted_SourceIP`,點擊 **「Create policy」** 完成 IAM Policy 建立。

==中間省略==

:::warning
:bulb: 將 **IAM Policy** `Restricted_SourceIP` 套用到 IAM User(s)/Role(s),若登入時的客戶端 IP 非屬於允許的 CIDR 範圍,在進行任何操作都將會出現 Access denied 錯誤。

:::
:::
[[返回大綱]](#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。

2. 輸入 **Bucket name** `federated-learning-trainingdata-ap-northeast-1-[Account-ID]`,完成後點擊 **「Create bucket」**,以建立 S3 Bucket。
>[!Tip] 提醒
>**S3 bucket name 為全球獨立唯一命名,因此建立名稱時需注意其獨立性,即使是不同的 Region 或 Account,也皆須保持其名稱獨立性才能建立。**
>您可將 ==[Account-ID]== 更改為任何標註名稱

==中間省略==

3. [Optional] 點擊 **Bucket name** `federated-learning-trainingdata-ap-northeast-1-[Account-ID]`,以設定其 Bucket Policy。

4. [Optional] 點擊 **「Permissions」** 分頁 > **Bucket policy** 區塊 > **「Edit」**。

==中間省略==

5. [Optional] 貼上下方 **==Bucket Policy 範例==**,完成後點擊 **「Save changes」**。

>[!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]"
}
}
}
]
}
```

:::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。

2. 輸入 **Bucket name** `federated-learning-cafeartifact-ap-northeast-1-[Account-ID]`,完成後點擊 **「Create bucket」**,以建立 S3 Bucket。
>[!Tip] 提醒
>**S3 bucket name 為全球獨立唯一命名,因此建立名稱時需注意其獨立性,即使是不同的 Region 或 Account,也皆須保持其名稱獨立性才能建立。**
>您可將 ==[Account-ID]== 更改為任何標註名稱

==中間省略==

3. [Optional] 點擊 **Bucket name** `federated-learning-cafeartifact-ap-northeast-1-[Account-ID]`,以設定其 Bucket Policy。

4. [Optional] 點擊 **「Permissions」** 分頁 > **Bucket policy** 區塊 > **「Edit」**。

==中間省略==

5. [Optional] 貼上下方 **==Bucket Policy 範例==**,完成後點擊 **「Save changes」**。

>[!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]"
}
}
}
]
}
```

:::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。

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 | `兩個選項都確認勾選`



3. 等待 VPC 建立完成的同時,紀錄 **VPC ID**,將用於限制 EC2 Instance 使用的 IAM Role 僅能從此 VPC 存取。

4. 進入 **「Subnets」** > 搜尋 **"subnet-public"**,並尋找 **Availability Zone ID** 為 **「apne1-az1」** 的 Public Subnet,紀錄該 **Public Subnet Name 與 ID**,將用於建立 EC2 Instance。

:::
### 4.2 設定 S3 通過內部 (S3 Gateway Endpoint) 路由傳輸
:::spoiler **操作步驟**
1. 進入 **「VPC」** > **「Endpoints」** > 勾選 `fed-learning-vpce-s3` > 切換 **「Route tables」** 分頁 > 點擊 **「Manage route tables」**。

2. 勾選 `fed-learning-rtb-public`,完成後點擊 **「Modify route tables」**。

:::
[[返回大綱]](#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。

2. 點擊 **「JSON」** 並貼上下方 ==**IAM Policy 範例**==,完成後點擊 **「Next」**。

>[!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/*"
}
]
}
```

3. 輸入 **Policy name** ``Federated_Learning_S3_Uploader``,點擊 **「Create policy」** 完成 IAM Policy 建立。

==中間省略==

4. 進入 **「Users」**> **「Create user」** 以建立 IAM User。

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 | ``若希望在第一次登入時,強制調整密碼則勾選``


6. 選擇 **「Attach policies directly」**,勾選 IAM Policy ``Federated_Learning_S3_Uploader`` 後,點擊 **「Next」**。


7. 點擊 **「Create user」** 完成 IAM User 建立。

8. 將登入資訊提供給負責人員進行登入及存取操作。

:::
### 5-2. 建立 IAM Role (提供 EC2 Instance 取得 S3 Bucket 資料)
:::spoiler **操作步驟**
1. 進入 **「Policies」** > **「Create policy」**,以建立至 S3 Bucket 下載資料的 IAM Policy。

2. 點擊 **「JSON」** 並貼上下方 ==**IAM Policy 範例**==,完成後點擊 **「Next」**。

>[!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]"
}
}
}
]
}
```

3. 輸入 **Policy name** `Federated_Learning_S3_Downloader`,點擊 **「Create policy」** 完成 IAM Policy 建立。

==中間省略==

4. 進入 **「Roles」**> **「Create role」** 以建立 IAM Role。

5. 設定以下參數,完成後點擊 **「Next」**。
參數 | 值
----|-----
Trusted entity type | `AWS service`
Service or use case | `EC2`


6. 選擇 **IAM Policy** `Federated_Learning_S3_Downloader`,完成後點擊 **「Next」**。

7. 輸入 **Role name** `Federated_Learning_S3_Downloader`,完成後點擊 **「Create role」** 完成 IAM Role 建立。

==中間省略==

:::
### 5-3. 建立 IAM Role (提供 Arbiter 上傳 CaFe Artifacts 至 S3 Bucket)
:::spoiler **操作步驟**
1. 進入 **「Policies」** > **「Create policy」**,以建立至 S3 Bucket 上傳 Cafe Artifact 的 IAM Policy。

2. 點擊 **「JSON」** 並貼上下方 ==**IAM Policy 範例**==,完成後點擊 **「Next」**。

>[!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]/*"
]
}
]
}
```

3. 輸入 **Policy name** `Federated_Learning_CaFeArtifact_Uploader`,點擊 **「Create policy」** 完成 IAM Policy 建立。

==中間省略==

4. 進入 **「Roles」**> **「Create role」** 以建立 IAM Role。

5. 設定以下參數,完成後點擊 **「Next」**。
參數 | 值
----|-----
Trusted entity type | `AWS account`
Another AWS account | `圈選`
Account ID | `[Arbiter_Account_ID]`
Require external ID | `勾選`
External ID | `約定通關密語`
Required MFA | `勾選`


6. 選擇 **IAM Policy** `Federated_Learning_CaFeArtifact_Uploader`,完成後點擊 **「Next」**。

7. 輸入 **Role name** `Federated_Learning_CaFeArtifact_Uploader`,完成後點擊 **「Create role」** 完成 IAM Role 建立。

==中間省略==

:::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]
```

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}')
```

:::
:::
[[返回大綱]](#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。

2. 點擊 **「Allocate」**,完成 IP 申請。

3. 編輯名稱,輸入 **Name** `Federated Learning Instance`,完成後點擊 **「Save」**。

:::
### 6-2. 建立 EC2 Instance、 Key Pair 及 Security Group (防火牆)
:::spoiler **操作步驟**
1. 進入 **「EC2」** > **「Instances」** > **「Launch instances」**,以建立 EC2 Instance。

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`








3. 點擊 **EC2 instance ID** 以確認其啟動狀態

4. 當出現 ==**2/2 checks passed**==,即表示 EC2 Instance 已就緒。

:::
### 6-3. 套用 Elastic IP 至 EC2 Instance
:::spoiler **操作步驟**
1. 進入 **「EC2」** > **「Elastic IPs」** > 勾選 EIP `Federated Learning Instance` > **「Actions」** > **「Allocate Elastic IP address」**。

2. 選擇 **Instance** `Federated Learning Instance`,完成後點擊 **「Associate」**

:::
### 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` 所賦予的權限。

:::
### 6-5. 調整 Security Group (Firewall)
:::spoiler **操作步驟**
1. 進入 **「EC2」** > **「Security Groups」** > 勾選 `federated-learning-instance` > 切換 **「Inbound rules」** 分頁 > 點擊 **「Edit inbound rules」**。

2. 依需求增加及調整 Security Group (防火牆) 設定。
>[!Tip] 提示
>**Security Group 是預設阻擋流量的 Stateful 防火牆,因此僅需要針對發動端開通所需通道。**

:::
### 6-6. 調整 EC2 Instance Type
:::spoiler **操作步驟**
1. 選擇欲調整的 EC2 Instance,並點擊 **「Stop instance」** 以關閉該 EC2 Instance。

2. 當關閉完成時 ==(State: Stopped)==,點擊 **「Actions」** > **「Instance settings」** > **「Change instance type」**,以進行 EC2 Instance Type 變更。

3. 依資源需求選擇合適的 Instance Type,完成後點擊 **「Apply」**。


4. 完成變更後,點擊 **「Instance state」** > **「Start instance」**,並等待其啟動完成 ==(2/2 checks passed)==。

:::
### 6-7. 檢視 EC2 Instance 資源狀態
:::spoiler **操作步驟**
進入 **「EC2」** > **「Instances」** > 勾選 `Federated Learning Instance` > 切換 **「Monitoring」** 分頁


:::
[[返回大綱]](#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。

2. 進入 **「CloudTrail」** > **「Trails」** > 點擊 **「Create trail」**,您可將 CloudTrial Audit Logs 長期存放於 S3 Bucket 中。







:::
[[返回大綱]](#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」** ,以建立預算告警。

2. 選擇 **Use a template(simplified)** > **Monthly cost budget** > **輸入Budget名稱** > **Budget amount 輸入1800**。

3. 輸入欲通知的Email並以逗號做分隔,輸入完後點選 **Create budget** 。

在此配置下當:
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)
---