ScalaããAWS CDKãå©ãã¦ã¤ã³ãã©ãæ§ç¯ãã
ã¢ããã¼ã·ã§ã³
å æ¥ãTypeScriptã¨Pythonåãã« AWS Cloud Development Kit ãGAã«ãªãã¾ããã
ç¾å¨GAã§ã¯ãªãã®ã§ãããJavaããã®AWS CDKã®å¯¾è±¡è¨èªã¨ãªã£ã¦ãã¾ãã
ããããJavaã§ã§ãããªãScalaã§ãã§ãããã?(決ã¾ãæå¥)
Scalaã§ã¤ã³ãã©ã³ã¼ããæ¸ããã®ã¯å¬ãããã
ã¨ããããã§ScalaããAWS CDKãå©ããã試ãã¦ã¿ã¾ããã
ã»ããã¢ãã
AWS CDKã®ã¤ã³ã¹ãã¼ã«
npm install -g aws-cdk
Ammoniteã®ã¤ã³ã¹ãã¼ã«
ä»åã¯Scalaã¹ã¯ãªããã使ã£ã¦AWS CDKã®APIãå©ãã¦ã¿ã¾ãã
以ä¸ã¯å·çæã®ææ°çãã¤ã³ã¹ãã¼ã«ãã¦ãã¾ãã
sudo sh -c '(echo "#!/usr/bin/env sh" && curl -L https://github.com/lihaoyi/Ammonite/releases/download/1.6.9/2.13-1.6.9) > /usr/local/bin/amm && chmod +x /usr/local/bin/amm' && amm
å®è¡ãã¡ã¤ã«ãããã¸ã§ã¯ãä¸ã«ç½®ãã¦ããã¨ãä»ã®äººãAmmoniteãã¤ã³ã¹ãã¼ã«ããå¿ è¦ããªããªãã®ã§ããããã
sudo cp /usr/local/bin/amm /path/to/your_project/amm
Scalaã¹ã¯ãªããã®å®è£
AWS CDKã®APIãå©ãScalaã¹ã¯ãªãããå®è£ ãã¾ãã
ãªã½ã¼ã¹ã®å®ç¾©ãªã©ã¯å ¬å¼ã®ãµã³ãã«ãªã©ãåèã«ãã¦ãã ããã
// ä¾åã©ã¤ãã©ãªã追å import $ivy.`software.amazon.awscdk:core:1.0.0.DEVPREVIEW` import $ivy.`software.amazon.awscdk:s3:1.0.0.DEVPREVIEW` import software.amazon.awscdk.core.{App, Construct, Stack, StackProps} import software.amazon.awscdk.services.s3.{Bucket, BucketProps} class ExampleStack(parent: Construct, id: String, props: StackProps = null) extends Stack(parent, id, props) { new Bucket(this, "aws-cdk-scala-script-example-bucket", BucketProps.builder().build()) } // CDKã¢ããªã±ã¼ã·ã§ã³ãå®ç¾© val app = new App() // CloudFormationã®ã¹ã¿ãã¯ãä½æãappã«è¿½å ã new ExampleStack(app, "example-stack") // CloudFormationã®ãã³ãã¬ã¼ããçæãæ示çã«è¡ãã // æ¬æ¥ã¯æé»çã«çæãè¡ãããã§ããã¯ã¯ã¼ã¯ã¢ã©ã¦ã³ããIssueãä¸ãã£ã¦ããã // https://github.com/aws/jsii/issues/456 app.synth()
cdk.json
ã§CDKã¢ããªã±ã¼ã·ã§ã³ã®å®è¡æ¹æ³ãè¨å®
ä»åã¯Scalaã¹ã¯ãªãããCDKã¢ããªã±ã¼ã·ã§ã³ã¨ãããã¨ã«ãªãã®ã§ãå ç¨ã®ã¹ã¯ãªãããAmmoniteã§å®è¡ããããè¨å®ãã¾ãã
{ "app": "./amm aws-cdk-example.sc" }
CDKã¢ããªã±ã¼ã·ã§ã³ã§ä½æããã¹ã¿ãã¯ããããã¤ãã
ã¹ã¿ãã¯ã®ä¸è¦§
cdk list
( or ls
) ã³ãã³ãã§CDKã¢ããªã±ã¼ã·ã§ã³ã§å®ç¾©ããã¹ã¿ãã¯ã®ä¸è¦§ã表示ã§ãã¾ãã
ããã§ã¯ãä¸è¨ã§è¨å®ããScalaã¹ã¯ãªããã®ã³ã³ãã¤ã«ã¨å®è¡ãè¡ããã¾ãã
$ cdk ls Compiling /home/blacky/projects/scala/aws-cdk-scala-script/aws-cdk-example.sc example-stack
cdk.out
ãã£ã¬ã¯ããªä»¥ä¸ã«ã¯CDKã¢ããªã±ã¼ã·ã§ã³ããä½æããããã³ãã¬ã¼ããªã©ãã§ãã¦ãã¾ãã
tree cdk.out/ cdk.out/ âââ cdk.out âââ example-stack.template.json âââ manifest.json 0 directories, 3 files $ cat cdk.out/example-stack.template.json { "Resources": { "awscdkscalascriptexamplebucketD9CE1DF9": { "Type": "AWS::S3::Bucket", "UpdateReplacePolicy": "Retain", "DeletionPolicy": "Retain", "Metadata": { "aws:cdk:path": "example-stack/aws-cdk-scala-script-example-bucket/Resource" } }, "awscdkscalaD5F5E654": { "Type": "AWS::IAM::User", "Metadata": { "aws:cdk:path": "example-stack/aws-cdk-scala/Resource" } }, "awscdkscalaDefaultPolicyF833299D": { "Type": "AWS::IAM::Policy", "Properties": { "PolicyDocument": { "Statement": [ { "Action": [ "s3:GetObject*", "s3:GetBucket*", "s3:List*", "s3:DeleteObject*", "s3:PutObject*", "s3:Abort*" ], "Effect": "Allow", "Resource": [ { "Fn::GetAtt": [ "awscdkscalascriptexamplebucketD9CE1DF9", "Arn" ] }, { "Fn::Join": [ "", [ { "Fn::GetAtt": [ "awscdkscalascriptexamplebucketD9CE1DF9", "Arn" ] }, "/*" ] ] } ] } ], "Version": "2012-10-17" }, "PolicyName": "awscdkscalaDefaultPolicyF833299D", "Users": [ { "Ref": "awscdkscalaD5F5E654" } ] }, "Metadata": { "aws:cdk:path": "example-stack/aws-cdk-scala/DefaultPolicy/Resource" } } } }
ã¹ã¿ãã¯ã®ãããã¤
cdk deploy
ã§ã¹ã¿ãã¯ã®ãããã¤ãè¡ãã¾ãã
$ cdk deploy example-stack # ä»åã¹ã¿ãã¯ã¯ã²ã¨ã¤ãªã®ã§ `example-stack` ã¯çç¥å¯ example-stack: deploying... example-stack: creating CloudFormation changeset... 0/3 | 18:42:21 | CREATE_IN_PROGRESS | AWS::CDK::Metadata | CDKMetadata 0/3 | 18:42:22 | CREATE_IN_PROGRESS | AWS::S3::Bucket | aws-cdk-scala-script-example-bucket (awscdkscalascriptexamplebucketD9CE1DF9) 0/3 | 18:42:24 | CREATE_IN_PROGRESS | AWS::S3::Bucket | aws-cdk-scala-script-example-bucket (awscdkscalascriptexamplebucketD9CE1DF9) Resource creation Initiated 0/3 | 18:42:24 | CREATE_IN_PROGRESS | AWS::CDK::Metadata | CDKMetadata Resource creation Initiated 1/3 | 18:42:24 | CREATE_COMPLETE | AWS::CDK::Metadata | CDKMetadata 2/3 | 18:42:44 | CREATE_COMPLETE | AWS::S3::Bucket | aws-cdk-scala-script-example-bucket (awscdkscalascriptexamplebucketD9CE1DF9) 3/3 | 18:42:46 | CREATE_COMPLETE | AWS::CloudFormation::Stack | example-stack â example-stack Stack ARN: arn:aws:cloudformation:ap-northeast-1:012345678912:stack/example-stack/a7f50010-xxxx-yyyy-zzzz-012345678912
ã¹ã¿ãã¯ã®ãããã¤ã¨é©ç¨ãã§ãã¾ãã!
å®éã«ãªã½ã¼ã¹ãä½æããã¦ããã確ããã¦ã¿ã¾ãããã
確ãã«S3ãã±ãããä½æããã¦ããã®ããããã¾ã!
ã¹ã¿ãã¯ã®æ´æ°
ãã£ãããªã®ã§ä»ã®ãªã½ã¼ã¹ãä½ã£ã¦ã¿ã¾ãããã
Scalaã¹ã¯ãªãããæ¸ãæãã¾ãã
import $ivy.`software.amazon.awscdk:core:1.0.0.DEVPREVIEW` import $ivy.`software.amazon.awscdk:s3:1.0.0.DEVPREVIEW` import $ivy.`software.amazon.awscdk:iam:1.0.0.DEVPREVIEW` // 追å import software.amazon.awscdk.core.{App, Construct, Stack, StackProps} import software.amazon.awscdk.services.iam.User import software.amazon.awscdk.services.s3.{Bucket, BucketProps} class ExampleStack(parent: Construct, id: String, props: StackProps = null) extends Stack(parent, id, props) { val bucket = new Bucket(this, "aws-cdk-scala-script-example-bucket", BucketProps.builder().build()) // ã¦ã¼ã¶ã¼ã®å®ç¾© val user = new User(this, "aws-cdk-scala") // ãã±ããã¸ã®ã¢ã¯ã»ã¹ã許å¯ãã bucket.grantReadWrite(user) } val app = new App() new ExampleStack(app, "example-stack") app.synth()
æ¸ãæãããã cdk diff
ãå®è¡ãã¦ã¿ã¾ãããã
ããã¯ç¾å¨ã®ã¹ã¿ãã¯ã®ç¶æ
ã¨ã®å·®åã表示ããã³ãã³ãã§ãã
$ cdk diff example-stack Stack example-stack IAM Statement Changes âââââ¬âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¬âââââââââ¬âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¬âââââââââââââââââââââââ¬ââââââââââââ â â Resource â Effect â Action â Principal â Condition â âââââ¼âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¼âââââââââ¼âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¼âââââââââââââââââââââââ¼âââââââââââ⤠â + â ${aws-cdk-scala-script-example-bucket.Arn} â Allow â s3:Abort* â AWS:${aws-cdk-scala} â â â â ${aws-cdk-scala-script-example-bucket.Arn}/* â â s3:DeleteObject* â â â â â â â s3:GetBucket* â â â â â â â s3:GetObject* â â â â â â â s3:List* â â â â â â â s3:PutObject* â â â âââââ´âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ´âââââââââ´âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ´âââââââââââââââââââââââ´ââââââââââââ (NOTE: There may be security-related changes not in this list. See http://bit.ly/cdk-2EhF7Np) Resources [+] AWS::IAM::User aws-cdk-scala awscdkscalaD5F5E654 [+] AWS::IAM::Policy aws-cdk-scala/DefaultPolicy awscdkscalaDefaultPolicyF833299D
追å ãããªã½ã¼ã¹ã¨IAMã®ããªã·ã¼ã®è©³ç´°ã表示ããã¦ããã®ããããã¾ãã
å¤æ´ã確èªããããããã¤ãã¾ãããã
$ cdk deploy example-stack This deployment will make potentially sensitive changes according to your current security approval level (--require-approval broadening). Please confirm you intend to make the following modifications: IAM Statement Changes âââââ¬âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¬âââââââââ¬âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¬âââââââââââââââââââââââ¬ââââââââââââ â â Resource â Effect â Action â Principal â Condition â âââââ¼âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¼âââââââââ¼âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ¼âââââââââââââââââââââââ¼âââââââââââ⤠â + â ${aws-cdk-scala-script-example-bucket.Arn} â Allow â s3:Abort* â AWS:${aws-cdk-scala} â â â â ${aws-cdk-scala-script-example-bucket.Arn}/* â â s3:DeleteObject* â â â â â â â s3:GetBucket* â â â â â â â s3:GetObject* â â â â â â â s3:List* â â â â â â â s3:PutObject* â â â âââââ´âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ´âââââââââ´âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ´âââââââââââââââââââââââ´ââââââââââââ (NOTE: There may be security-related changes not in this list. See http://bit.ly/cdk-2EhF7Np) Do you wish to deploy these changes (y/n)? y example-stack: deploying... example-stack: creating CloudFormation changeset... 0/3 | 19:03:03 | CREATE_IN_PROGRESS | AWS::IAM::User | aws-cdk-scala (awscdkscalaD5F5E654) 0/3 | 19:03:04 | CREATE_IN_PROGRESS | AWS::IAM::User | aws-cdk-scala (awscdkscalaD5F5E654) Resource creation Initiated 0/3 Currently in progress: awscdkscalaD5F5E654 1/3 | 19:03:40 | CREATE_COMPLETE | AWS::IAM::User | aws-cdk-scala (awscdkscalaD5F5E654) 1/3 | 19:03:42 | CREATE_IN_PROGRESS | AWS::IAM::Policy | aws-cdk-scala/DefaultPolicy (awscdkscalaDefaultPolicyF833299D) 1/3 | 19:03:44 | CREATE_IN_PROGRESS | AWS::IAM::Policy | aws-cdk-scala/DefaultPolicy (awscdkscalaDefaultPolicyF833299D) Resource creation Initiated 2/3 | 19:03:52 | CREATE_COMPLETE | AWS::IAM::Policy | aws-cdk-scala/DefaultPolicy (awscdkscalaDefaultPolicyF833299D) 2/3 | 19:03:54 | UPDATE_COMPLETE_CLEA | AWS::CloudFormation::Stack | example-stack 3/3 | 19:03:55 | UPDATE_COMPLETE | AWS::CloudFormation::Stack | example-stack â example-stack Stack ARN: arn:aws:cloudformation:ap-northeast-1:012345678912:stack/example-stack/a7f50010-xxxx-yyyy-zzzz-012345678912
ç¡äºãIAMã¦ã¼ã¶ã¨ããªã·ã¼ã®è¨å®ãã§ãã¾ãã!
ã¾ã¨ã
Scalaã§AWSã®ã¤ã³ãã©ä½æãã§ããããã«ãªãã¾ãããæ¿ã¢ãã§ãã!
Terraformã®ãããªHCLã®æ¸ãæ¹ãè¦ããå¿
è¦ããªãã§ãããæ
£ããè¨èªãIDEã®æ©æµãåããªããã¬ãã¬ãã¤ã³ãã©ãæ¸ããã®ã¯å¤¢ãããããã§ãã
ãã ããæ°ã«ãªãã¨ããã¯ããã¤ããã£ã¦ã
- AWS以å¤ã®ã¤ã³ãã©ãä½µãã¦ä½æããå ´åã«ã¯ç´ ç´ã«Terraformãªã©ã使ã£ãã»ããè¯ãããã
- Javaã®ãã«ãã¼ãã¿ã¼ã³ã«ãããªã½ã¼ã¹ã®å®ç¾©ãè¥å¹²é¬±é¶ãã
- AWS CDK Javaã¯ã¾ã éçºæ®µé
- ã³ã³ãã¤ã«æã«ãªã½ã¼ã¹å®ç¾©ã®èª¤ã(å¿ é ãã©ã¡ã¼ã¿ã足ããªããªã©)ã¯æ¤åºãããªãã
- ããªãã¼ã·ã§ã³ã«æãããã£ã¦ãã¹ã¿ãã¯ã®é©ç¨æã«ã¨ã©ã¼ã«ãªãã
ãªã©ãããããã«æå¾ ã¨ããæãã§ããããã
ウッ⦠pic.twitter.com/wUSa7uYg8w
— blac_k_ey (@blac_k_ey) July 13, 2019
ãã¼ã£â¦ããããã®ã³ã³ãã¤ã«ã§å¼¾ãã¦ã»ããã£ã⦠pic.twitter.com/Z6QM4OWWWh
— blac_k_ey (@blac_k_ey) July 13, 2019
ãµããâ¦ããªãã¼ã·ã§ã³ã¨ã©ã¼ã©ãããã©ã³ã¿ã¤ã ã¨ã©ã¼ã§ãã⦠pic.twitter.com/imuisg6HNP
— blac_k_ey (@blac_k_ey) July 13, 2019
ä»åã®ææç©
ä½è«
AWS CDK Javaã¯jsiiã¨ããã©ã¤ãã©ãªä½¿ã£ã¦JavaããTypeScriptã®ã¢ã¸ã¥ã¼ã«ãå¼ã³åºãã¦ãããããã§ãã