WindowsでAWS CDK(Java)の開発環境を整えてみた

福岡オフィスの梶原です。 夏休みに、そこにAWS CDKがあるので、AWS CDKをやろうと思ったのですが、せっかくなのであまりサンプルのないJavaでやろうと開発環境を更新しようとしたのがきっかけです。

今回のゴールとしては、ほぼ何もない環境からAWS CDK(Java)でCDKのHelloWorldサンプルが実行できることを目指します。インストール手順は逐一は説明せずにポイントだけ記載していきます。またAWSCDKの実行環境の構築がメインですのでAWS CDK(Java)の中身の詳細については、別のエントリーで試したいと思います。

インストール方法としては、インストーラーが提供されているものは基本的にはインストーラーを使用しますが、各ソフトウェアの最新を使用したいなどあれば適時変更してください。(AWS 関連はアップデートがはやいので、インストーラはつかわずにpipインストールしてます) また、IDEや、ソフトウェアバージョンなどは、独断と偏見で選んでますので、ご容赦ください。

注:なお、AWS CDKのJavaサポートはDeveloper Previewとなりますので、正式リリースの際は変更があることをお含みおきください

使用するソフトウェアのバージョンとリンク集(ダウンロード先など)

Java関連

Node.js

Python

AWS関連

その他

各種ソフトのインストール

※各種ソフトウェアのインストールパスはC:\直下にインストール先を変更しています。

Python

  1. リンク先のダウンロードページからダウンロードしたファイル(python-3.7.4.exe)を起動し、インストールを実施します。
    • Add Pyhon to environment variableをチェックしてPATHを通します。
    • ダウンロード先のパスはC:\Python\Python37-32に変更しています
  2. インストールが完了しましたら、コマンドプロンプトを起動してパスまたはバージョンが意図したものか確認します。

> python --version
Python 3.7.4
> pip3 --version
pip 19.0.3 from c:\python\python37-32\lib\site-packages\pip (python 3.7)

AWS CLI

  1. コマンドプロンプトからpipを使用してインストールを行います
> pip3 install awscli --upgrade
  1. インストールが完了しましたら、コマンドプロンプトを起動してパスまたはバージョンが意図したものか確認します
> aws --version
aws-cli/1.16.220 Python/3.7.4 Windows/10 botocore/1.12.210

Java JDK

  1. リンク先のダウンロードページからダウンロードしたファイル(jdk-11.0.4_windows-x64_bin.exe)をインストール実施います。

  2. 環境変数を設定します。

    • JAVA_HOME=C:\Java\jdk-11.0.4
    • PATH=%JAVA_HOME%\bin
  3. インストールが完了しましたら、コマンドプロンプトを起動してパスまたはバージョンが意図したものか確認します。

> java --version
java 11.0.4 2019-07-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.4+10-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.4+10-LTS, mixed mode

Git

  1. ダウンロードしたGit-2.22.0-64-bit.exeをインストールします。 インストールパスだけ変更します。
> git --version
git version 2.22.0.windows.1

IntelliJ IDEA

  1. ダウンロードしたideaIC-2019.2.exeをインストールします。 インストールパスだけ'C:\JetBrains\IntelliJ IDEA Community Edition 2019.2'に変更します。

IntelliJ IDEA の日本語化

  1. ダウンロードしたpleiades-win.zipを展開して、適用します。

MavenのPath設定

  1. IntelliJ IDEAにバンドルされているMavenを使用するので、パスを通します。

    • PATH=C:\JetBrains\IntelliJ IDEA Community Edition 2019.2\plugins\maven\lib\maven3\bin

Node.jsのインストール

  1. ダウンロードしたnode-v10.16.2-x64.msiからインストールを行います。
> node --version
v10.16.2
> npm --version
6.9.0

AWS CDK

  1. AWS CDKはnpmを使用してインストールを実施します。
> npm install -g aws-cdk
> cdk --version
1.3.0 (build bba9914)

AWS CDKのHelloWorldサンプルを実行

Hello-Worldプロジェクトの作成

  1. IntelliJ IDEAを起動します。

  2. プロジェクトの作成

    1. [バージョン管理からチェックアウト]を行います
      1. git リポジトリからサンプルをクローンします。 URLは下記のAWSのサンプルのURLを指定します https://github.com/aws-samples/aws-cdk-examples/

    2. 既存モデルからプロジェクトを作成するで'Maven'を選択
    3. 再帰的にプロジェクト選択するにチェック
    4. Mavenプロジェクトを自動的に検出するにチェック

    5. インポートするMavenプロジェクトの選択で2つのプロジェクトが選択されるかと思います
        - hello-world
        - lambda-cron

    6. 次へを選択し、プロジェクトを作成します。
    7. プロジェクトが作成されるとMavenの依存関係等が更新されます。
    8. 正常に終了するとhello-world, lambda-cronの2つのプロジェクトが作成されます。

CDKのコンパイル

  1. IntelliJ IDEA 内のターミナルから実行します。
C:\IdeaProjects\aws-cdk-examples\java\hello-world>mvn compile
[INFO] Scanning for projects...
[INFO]
[INFO] --------------------< com.amazonaws.cdk:hello-cdk >---------------------
[INFO] Building hello-cdk 1.0.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ hello-cdk ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory C:\IdeaProjects\aws-cdk-examples\java\hello-world\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.7.0:compile (default-compile) @ hello-cdk ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 4 source files to C:\IdeaProjects\aws-cdk-examples\java\hello-world\target\classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.291 s
[INFO] Finished at: 2019-08-19T17:41:48+09:00
[INFO] ------------------------------------------------------------------------

CDKで作成されるCloudFormationの確認

C:\IdeaProjects\aws-cdk-examples\java\hello-world>cdk synth
[INFO] Scanning for projects...
[INFO]
[INFO] --------------------< com.amazonaws.cdk:hello-cdk >---------------------
[INFO] Building hello-cdk 1.0.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- exec-maven-plugin:1.6.0:java (default-cli) @ hello-cdk ---
Validating MyAutoScalingGroup...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  4.347 s
[INFO] Finished at: 2019-08-19T17:49:09+09:00
[INFO] ------------------------------------------------------------------------
Resources:
  VPCB9E5F0B4:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsHostnames: true
      EnableDnsSupport: true
      InstanceTenancy: default
      Tags:
        - Key: Name
          Value: hello-cdk/VPC
    Metadata:
      aws:cdk:path: hello-cdk/VPC/Resource
  VPCPublicSubnet1SubnetB4246D30:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.0.0/18
      VpcId:
        Ref: VPCB9E5F0B4
      AvailabilityZone:
        Fn::Select:
          - 0
          - Fn::GetAZs: ""
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: hello-cdk/VPC/PublicSubnet1
        - Key: aws-cdk:subnet-name
          Value: Public
        - Key: aws-cdk:subnet-type
          Value: Public
    Metadata:
      aws:cdk:path: hello-cdk/VPC/PublicSubnet1/Subnet
<<省略>>


CDKのデプロイ

※注意 deployを実施しますとAWSのリソースが作成されます。

> C:\IdeaProjects\aws-cdk-examples\java\hello-world>cdk deploy 
[INFO] Scanning for projects...
[INFO]
[INFO] --------------------< com.amazonaws.cdk:hello-cdk >---------------------
[INFO] Building hello-cdk 1.0.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- exec-maven-plugin:1.6.0:java (default-cli) @ hello-cdk ---
Validating MyAutoScalingGroup...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  4.290 s
[INFO] Finished at: 2019-08-19T17:43:25+09:00
[INFO] ------------------------------------------------------------------------
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                                     │
├───┼────────────────────────────────────────────────┼────────┼─────────────────┼───────────────────────────────┼───────────────────────────────────────────────┤
│ + │ ${MyAutoScalingGroup/Compute/InstanceRole.Arn} │ Allow  │ sts:AssumeRole  │ Service:ec2.${AWS::URLSuffix} │                                               │
├───┼────────────────────────────────────────────────┼────────┼─────────────────┼───────────────────────────────┼───────────────────────────────────────────────┤
│ + │ ${MySinkQueue/Resource.Arn}                    │ Allow  │ sqs:SendMessage │ Service:sns.amazonaws.com     │ "ArnEquals": {                                │
│   │                                                │        │                 │                               │   "aws:SourceArn": "${Topic1}"                │
│   │                                                │        │                 │                               │ }                                             │
│ + │ ${MySinkQueue/Resource.Arn}                    │ Allow  │ sqs:SendMessage │ Service:sns.amazonaws.com     │ "ArnEquals": {                                │
│   │                                                │        │                 │                               │   "aws:SourceArn": "${Topic2}"                │
│   │                                                │        │                 │                               │ }                                             │
│ + │ ${MySinkQueue/Resource.Arn}                    │ Allow  │ sqs:SendMessage │ Service:sns.amazonaws.com     │ "ArnEquals": {                                │
│   │                                                │        │                 │                               │   "aws:SourceArn": "${Topic3}"                │
│   │                                                │        │                 │                               │ }                                             │
│ + │ ${MySinkQueue/Resource.Arn}                    │ Allow  │ sqs:SendMessage │ Service:sns.amazonaws.com     │ "ArnEquals": {                                │
│   │                                                │        │                 │                               │   "aws:SourceArn": "${Topic4}"                │
│   │                                                │        │                 │                               │ }                                             │
│ + │ ${MySinkQueue/Resource.Arn}                    │ Allow  │ sqs:SendMessage │ Service:sns.amazonaws.com     │ "ArnEquals": {                                │
│   │                                                │        │                 │                               │   "aws:SourceArn": "${Topic5}"                │
│   │                                                │        │                 │                               │ }                                             │
└───┴────────────────────────────────────────────────┴────────┴─────────────────┴───────────────────────────────┴───────────────────────────────────────────────┘
Security Group Changes
┌───┬─────────────────────────────────────────────────────────────┬─────┬────────────┬─────────────────┐
│   │ Group                                                       │ Dir │ Protocol   │ Peer            │
├───┼─────────────────────────────────────────────────────────────┼─────┼────────────┼─────────────────┤
│ + │ ${MyAutoScalingGroup/Compute/InstanceSecurityGroup.GroupId} │ Out │ Everything │ Everyone (IPv4) │
└───┴─────────────────────────────────────────────────────────────┴─────┴────────────┴─────────────────┘
(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
hello-cdk: deploying...
hello-cdk: creating CloudFormation changeset...
  0/42 | 5:44:10 PM | CREATE_IN_PROGRESS   | AWS::EC2::EIP                         | VPC/PublicSubnet1/EIP (VPCPublicSubnet1EIP6AD938E8)
  0/42 | 5:44:10 PM | CREATE_IN_PROGRESS   | AWS::SNS::Topic                       | Topic3 (Topic3DEAE47A7)
  0/42 | 5:44:10 PM | CREATE_IN_PROGRESS   | AWS::EC2::VPC                         | VPC (VPCB9E5F0B4)

 <<省略>>

 MyAutoScalingGroup/Compute/ASG (MyAutoScalingGroupComputeASG94DE51EF)
 42/42 | 5:47:38 PM | CREATE_COMPLETE      | AWS::CloudFormation::Stack            | hello-cdk

 ✅  hello-cdk

Stack ARN:
arn:aws:cloudformation:ap-northeast-1:XXXXXXXXXXX:stack/hello-cdk/6a6d3600-c25d-11e9-a71e-0a4b1943673a

  1. 正常に終了しましたら、対象のAWS環境でリソースが作成されるので、確認します。

    現時点ではJavaのサンプルのhello-worldプロジェクトをデプロイすると

    • VPC
    • Subnet
    • RouteTable
    • NatGateway
    • SecurityGroup
    • EIP
    • SNS(Topic)
    • SNS(Subscription)
    • SQS
    • AutoScalingGroup
    • IAM Role
    • EC2(AutoScalingにより作成されます)

    などのリソースが作成されます。

AWS 環境の削除

AWS CDKの動作確認、リソースの作成確認等ができましたら、無駄な課金を防ぐためにリソースを削除します。こちらもAWS CDKより実施できます。

C:\IdeaProjects\aws-cdk-examples\java\hello-world>cdk destroy 
[INFO] Scanning for projects...
[INFO]
[INFO] --------------------< com.amazonaws.cdk:hello-cdk >---------------------
[INFO] Building hello-cdk 1.0.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- exec-maven-plugin:1.6.0:java (default-cli) @ hello-cdk ---
Validating MyAutoScalingGroup...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  6.136 s
[INFO] Finished at: 2019-08-19T17:57:46+09:00
[INFO] ------------------------------------------------------------------------
Are you sure you want to delete: hello-cdk (y/n)? y
hello-cdk: destroying...
   0 | 5:57:56 PM | DELETE_IN_PROGRESS   | AWS::EC2::Route                       | VPC/PublicSubnet2/DefaultRoute (VPCPublicSubnet2DefaultRouteB7481BBA)
<< 省略>>

 ✅  hello-cdk: destroyed

正常に終了しましたら、実際に作成されたAWSのリソースが削除されているか確認してください。

まとめ

AWS CDK(Java)を実行する環境ができましたので、使い慣れた言語でAWS CDKを使っていきたいと思います。 AWS CDK(Java)の実際のユースケースとしては、WebアプリケーションのバックエンドでのAWS環境の作成用途などで使えるケースも今後はでてくるかもしれません(現時点では開発者プレビューですので正式リリースの際は変更があることをお含みおきください) また、AWS CDK自体も開発者プレビューですが、AWS SDKのJava 2.0ともリソースの方法等が似ており、相互につかえそうな気がしています。 AWS CDK(Java)の中身については、今回は動作確認程度でしたので、次回以降Deepに潜っていきたいと思います。

参考