本篇文章內有:
現在可以來進行我們的重頭戲 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 .
檔案的名稱可能會不同,請不要擔心,他是利用資料夾名字自動產生的,並不會影響實際行為。
先簡單地依序介紹一下資料夾結構:
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 帳號做更動。
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 CLI ,我們產生 AWS Access Key ,而這個動作要在 AWS Console 上面完成。
從右上角的帳戶名稱進入 Security credentials ,在中間的 Access keys 點選 Create access key 。
這個訊息是 AWS 強烈 不建議這個做法,因為會造成的資安危害程度不可估計。
如果想要繼續,請勾選下面的I understand ,並心驚膽顫地跳過接下來的小小節。
如果覺得猶豫,不要誤動作,請建立 AWS IAM User 。
在最左側有三個橫槓,請點下去,在下面的選單中,請點 Access management > Users ,點選右邊的 Create user 。
指定好名稱後,可以下一步連點,直接將沒有權限的使用者建立出來。
這時會有綠色的通知出現,點右邊的 View user 。
進來之後,我們在右邊的 Add permissions 裡面,選 Create inline policy 。
一樣是在右邊,有 JSON 的按鈕,點進去之後,先將原有的內容刪除,再貼上下面的 JSON 物件,接著直接建立。
{
"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 針對各種情境所提供的替代方案,這邊就不深入一一介紹,畢竟已經爆字數了,選擇任何一個選項都行,並不會影響到接續的動作。
第二步則是選填項目,可以略過。
好的,終於拿到關鍵的 Access key 了,先不要離開這個頁面。
這時我們要來設定 AWS 的驗證資訊,使用下面的指令開始。
aws configure
他會提示要輸入 AWS Access Key ID 以及 AWS Secret Access Key ,請直接從網頁上複製,左邊有個小按鈕可以幫忙複製起來。
直接貼入到 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}}'