iT邦幫忙

2023 iThome 鐵人賽

DAY 2
0
DevOps

CDK 從 0 開始打造靈活自如的 IaC系列 第 2

02 - 第一個 CDK

  • 分享至 

  • xImage
  •  

本篇文章內有:

  • 創建一個簡單的 CDK 專案
  • 使用 AWS CDK CLI
  • 附錄
    • 取得 AWS 驗證資訊
      • 建立 AWS IAM User
    • 設置 AWS CLI

創建一個簡單的 CDK 專案

現在可以來進行我們的重頭戲 AWS CDK ,先新增一個資料夾。

進去資料夾之後,直接使用 npm 就收工了。

npm exec --package=aws-cdk -- cdk init sample-app --language=typescript

在這行指令中,我們告訴 npm 去執行 (exec) 在 aws-cdk 這個 package 中的 cdk 指令,並且跟 cdk 說做專案的初始化 (init) 時,使用 sample-app 模板生成出 typescript 專案。

只有在這次執行時, npm 會跳出下面的訊息。

Need to install the following packages:
  aws-cdk@2.x.x
Ok to proceed? (y)

直接按 Enter 就可以。

其實到這邊,我們就可以來試著部署他。
但是在部署之前,一定要先來看看這個專案的生辰八字,我是說,看他的檔案結構。

在 Visual Studio Code 中,開啟我們的專案。

code .

檔案的名稱可能會不同,請不要擔心,他是利用資料夾名字自動產生的,並不會影響實際行為。
Visual Studio Code project sample app

先簡單地依序介紹一下資料夾結構:

  • bin:AWS CDK 主要的進入點。
  • lib:AWS CDK 中會引用的所有資源。
  • node_modules:npm 存放 packages 的地方,基本上可以忽略。
  • test:AWS CDK 編寫測試的地方。
  • .gitignore:git 的除外清單,基本上可以忽略。
  • .npmignore:npm 的除外清單,基本上可以忽略。
  • cdk.json:AWS CDK CLI 的設定檔。
  • jest.config.js:測試的設定檔。
  • package-lock.json:npm package 的詳細版號設定,不是人讀的。
  • package.json:npm 的基本設定,包含常用指令與 package 版號。
  • README.md:專案的說明文件。
  • tsconfig.json:TypeScript 的設定檔。

也就是說,我們會頻繁改動的檔案就只有前兩個資料夾 (bin, lib) 。

使用 AWS CDK CLI

好的,說了這麼多,我們要來使用 AWS CDK CLI 了,首先來查看一下目前的 AWS CDK CLI 會針對哪個 AWS 帳號做更動。

aws sts get-caller-identity

這個指令是跟 aws 說,去跟訪問權限中心,也就是 AWS Security Token Service (sts) 問一下,我現在的身分是誰 (get-caller-identity) 。

如果看到以下錯誤訊息,請設置 AWS CLI,附錄中有相關步驟。

Unable to locate credentials. You can configure credentials by running "aws configure".

我們今天先簡單地看這個 AWS CDK 專案裡面有哪些東西。

npm run cdk -- list

這指令是告訴 npm 去執行 (run) 名為 cdk 的腳本,而其中所對應的 cdk 指令會列出 (list) 內含的資源。

應該會得到類似的輸出,名稱會因為資料夾不同有所差異。

SampleAppStack

接下來可以看更多的細節,我們查查看跟 AWS 帳號內的資源的差異。

npm run cdk -- diff

如果看到類似的輸出,就代表已經成功地做出第一個 CDK 專案,並且可以跟 AWS 帳號交換資訊了。

Stack SampleAppStack
current credentials could not be used to assume 'arn:aws:iam::123456789012:role/cdk-hnb659fds-lookup-role-123456789012-us-east-1', but are for the right account. Proceeding anyway.
(To get rid of this warning, please upgrade to bootstrap version >= 8)
current credentials could not be used to assume 'arn:aws:iam::123456789012:role/cdk-hnb659fds-deploy-role-123456789012-us-east-1', but are for the right account. Proceeding anyway.
IAM Statement Changes
┌───┬───────────┬────────┬───────────┬───────────┬─────────────┐ 
│   │ Resource  │ Effect │ Action    │ Principal │ Condition   │ 
├───┼───────────┼────────┼───────────┼───────────┼─────────────┤ 
│ + │ ${SampleA │ Allow  │ sqs:SendM │ Service:s │ "ArnEquals" │ 
│   │ ppQueue.A │        │ essage    │ ns.amazon │ : {         │ 
│   │ rn}       │        │           │ aws.com   │   "aws:Sour │ 
│   │           │        │           │           │ ceArn": "${ │ 
│   │           │        │           │           │ SampleAppTo │ 
│   │           │        │           │           │ pic}"       │ 
│   │           │        │           │           │ }           │ 
└───┴───────────┴────────┴───────────┴───────────┴─────────────┘ 
(NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299)

Parameters
[+] Parameter BootstrapVersion BootstrapVersion: {"Type":"AWS::SSM::Parameter::Value<String>","Default":"/cdk-bootstrap/hnb659fds/version","Description":"Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]"}

Conditions
[+] Condition CDKMetadata/Condition CDKMetadataAvailable: {"Fn::Or":[{"Fn::Or":[{"Fn::Equals":[{"Ref":"AWS::Region"},"af-south-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-east-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-northeast-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-northeast-2"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-south-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-southeast-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ap-southeast-2"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"ca-central-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"cn-north-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"cn-northwest-1"]}]},{"Fn::Or":[{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-central-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-north-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-south-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-west-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-west-2"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"eu-west-3"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"me-south-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"sa-east-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"us-east-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"us-east-2"]}]},{"Fn::Or":[{"Fn::Equals":[{"Ref":"AWS::Region"},"us-west-1"]},{"Fn::Equals":[{"Ref":"AWS::Region"},"us-west-2"]}]}]}

Resources
[+] AWS::SQS::Queue SampleAppQueue SampleAppQueueECFF513D        
[+] AWS::SQS::QueuePolicy SampleAppQueue/Policy SampleAppQueuePolicyC68AAFE2
[+] AWS::SNS::Subscription SampleAppQueue/SampleAppStackSampleAppTopic1FB495E2 SampleAppQueueSampleAppStackSampleAppTopic1FB495E2F636FD34
[+] AWS::SNS::Topic SampleAppTopic SampleAppTopicA1D4DBDE        

Other Changes
[+] Unknown Rules: {"CheckBootstrapVersion":{"Assertions":[{"Assert":{"Fn::Not":[{"Fn::Contains":[["1","2","3","4","5"],{"Ref":"BootstrapVersion"}]}]},"AssertDescription":"CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI."}]}}


✨  Number of stacks with differences: 1

在建立好 CDK 專案並且跟 AWS 帳號設定完成後,接著就是要來愉快的花錢,歐,對,新的 AWS 帳號會有 12 個月的有限度免費服務,所以實際上不會破費,太好了!


附錄

取得 AWS 驗證資訊

為了要設置 AWS CLI ,我們產生 AWS Access Key ,而這個動作要在 AWS Console 上面完成。

從右上角的帳戶名稱進入 Security credentials ,在中間的 Access keys 點選 Create access key
AWS Console Root Access Key

這個訊息是 AWS 強烈 不建議這個做法,因為會造成的資安危害程度不可估計。
AWS Console Root Warning

如果想要繼續,請勾選下面的I understand ,並心驚膽顫地跳過接下來的小小節。

如果覺得猶豫,不要誤動作,請建立 AWS IAM User 。

建立 AWS IAM User

在最左側有三個橫槓,請點下去,在下面的選單中,請點 Access management > Users ,點選右邊的 Create user
AWS Console IAM User

指定好名稱後,可以下一步連點,直接將沒有權限的使用者建立出來。
AWS Console IAM User Creating

這時會有綠色的通知出現,點右邊的 View user 。
AWS Console IAM User Created

進來之後,我們在右邊的 Add permissions 裡面,選 Create inline policy 。
AWS Console IAM User Policy

一樣是在右邊,有 JSON 的按鈕,點進去之後,先將原有的內容刪除,再貼上下面的 JSON 物件,接著直接建立。
AWS Console IAM User Policy Add

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "cloudformation:CreateChangeSet",
                "cloudformation:DescribeChangeSet",
                "cloudformation:DescribeStackEvents",
                "cloudformation:DescribeStacks",
                "cloudformation:ExecuteChangeSet",
                "cloudformation:GetTemplate"
            ],
            "Resource": "arn:aws:cloudformation:*:*:stack/CDKToolkit/*",
            "Effect": "Allow",
            "Sid": "CloudFormationPermissions"
        },
        {
            "Action": [
                "iam:CreateRole",
                "iam:GetRole",
                "iam:AttachRolePolicy",
                "iam:PutRolePolicy"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:iam::*:policy/*",
                "arn:aws:iam::*:role/cdk-*"
            ]
        },
        {
            "Action": [
                "ssm:DeleteParameter",
                "ssm:GetParameter",
                "ssm:GetParameters",
                "ssm:PutParameter"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:ssm:*:*:parameter/cdk-bootstrap/*"
            ]
        },
        {
            "Action": [
                "s3:CreateBucket",
                "s3:PutBucketPolicy",
                "s3:PutBucketPublicAccessBlock",
                "s3:PutBucketVersioning",
                "s3:PutEncryptionConfiguration",
                "s3:PutLifecycleConfiguration"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::cdk-*"
            ]
        },
        {
            "Action": [
                "ecr:CreateRepository",
                "ecr:DescribeRepositories",
                "ecr:SetRepositoryPolicy",
                "ecr:PutLifecyclePolicy"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:ecr:*:*:repository/cdk-*"
            ]
        },
        {
            "Action": [
                "sts:AssumeRole"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:iam::*:role/cdk-*"
            ]
        }
    ]
}

成功之後,進到第四個分頁, Security credentials ,來到下面的 Access keys 區域,點選中間的 Create access key 。
AWS Console IAM User Access Key

現在看到的是 AWS 針對各種情境所提供的替代方案,這邊就不深入一一介紹,畢竟已經爆字數了,選擇任何一個選項都行,並不會影響到接續的動作。
AWS Console IAM User Access Key Usage

第二步則是選填項目,可以略過。
AWS Console IAM User Access Key Tag

好的,終於拿到關鍵的 Access key 了,先不要離開這個頁面。
AWS Console IAM User Access Key Retrieve

設置 AWS CLI

這時我們要來設定 AWS 的驗證資訊,使用下面的指令開始。

aws configure

他會提示要輸入 AWS Access Key ID 以及 AWS Secret Access Key ,請直接從網頁上複製,左邊有個小按鈕可以幫忙複製起來。
AWS Console IAM User Access Key Copy

直接貼入到 CLI 的畫面中。

AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: 
Default output format [None]: 

這時我們再執行一次剛剛失敗的指令。

aws sts get-caller-identity

如果看到類似的輸出,就表示成功了。

{
    "UserId": "AIDASAMPLEUSERID",
    "Account": "123456789012",
    "Arn": "arn:aws:iam::123456789012:user/DevAdmin"
}

如果有想用多個不同驗證資訊,不管是不是同一個帳號,都可以在 CLI 中做 AWS Profile 的設定,可以帶在指令中,像是 --profile ,這邊推薦從環境變數中設置。
macOS:

export AWS_PROFILE='{{your-profile-name}}'

Windows:

$env:AWS_PROFILE='{{your-profile-name}}'

上一篇
01 - CDK 初心者
下一篇
03 - CDK App 部署流程
系列文
CDK 從 0 開始打造靈活自如的 IaC7
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言