page_adsence

ラベル AWS の投稿を表示しています。 すべての投稿を表示
ラベル AWS の投稿を表示しています。 すべての投稿を表示

2020年6月26日金曜日

AWS CDK と AWS SAM CLI を利用してローカル実行しようとしたらハマった件 Part2

前回、AWS CDK と AWS SAM CLI を使ってローカル開発環境を作っていたのですが、時間を置いて別の環境を作ろうと思ったら別のエラーでハマったのでメモしておきます。

前提

MacOSX         10.14.6(Mojave)
AWS CLI        2.0.19
AWS SAM CLI    0.52.0
AWS CDK        1.44.0 -> (1.47.0 に上げた)

この記事のゴール

下記のエラーを回避し、ローカル環境で Lambda が実行できていること。

発生したエラー

$ yarn run build
yarn run v1.22.0
warning package.json: No license field
warning ../package.json: No license field
$ tsc
bin/cdk-test.ts:4:10 - error TS2305: Module '"/path/to/dir/cdk-test/lib/cdk-test-stack"' has no exported member 'CdkTestStack'.

4 import { CdkTestStack } from '../lib/cdk-test-stack';
           ~~~~~~~~~~~~

lib/cdk-test-stack.ts:9:45 - error TS2345: Argument of type 'this' is not assignable to parameter of type 'Construct'.
  Type 'CdkSampleStack' is not assignable to type 'Construct'.
    Property 'onValidate' is protected but type 'Construct' is not a class derived from 'Construct'.

9     const helloLambda = new lambda.Function(this, "helloLambda", {
                                              ~~~~

lib/cdk-test-stack.ts:16:45 - error TS2345: Argument of type 'this' is not assignable to parameter of type 'Construct'.

16     const helloApi = new apigateway.RestApi(this, "helloApi", {
                                               ~~~~

test/cdk-test.test.ts:8:31 - error TS2339: Property 'CdkTestStack' does not exist on type 'typeof import("/path/to/dir/cdk-test/lib/cdk-test-stack")'.

8     const stack = new CdkTest.CdkTestStack(app, 'MyTestStack');
                                ~~~~~~~~~~~~


Found 4 errors.

error Command failed with exit code 2.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

やったこと

$ cdk init --language typescript
$ yarn add @aws-cdk/aws-lambda @aws-cdk/aws-apigateway aws-lambda
$ yarn add -D @types/node @types/aws-lambda
$ vi lib/cdk-test-stack.ts

Stack の定義は下記のようにした。

import  *  as  lambda  from  '@aws-cdk/aws-lambda'
import  *  as  apigateway  from  '@aws-cdk/aws-apigateway'
import  *  as  cdk  from  '@aws-cdk/core';

export  class  CdkSampleStack  extends  cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // Lambda
    const  helloLambda = new  lambda.Function(this, "helloLambda", {
      runtime:  lambda.Runtime.NODEJS_12_X,
      handler:  "index.handler",
      code:  lambda.Code.asset("src")
    });

    // API Gateway
    const  helloApi = new  apigateway.RestApi(this, "helloApi", {
      restApiName:  "helloApi"
    });

    const  samplesResource = helloApi.root.addResource("ping");
    const  getSamplesIntegration = new  apigateway.LambdaIntegration(helloLambda);
    samplesResource.addMethod("GET", getSamplesIntegration);
  }
}

直すためにやったこと

package.json 内の aws-cdk 関連のバージョンをあわせるように修正しました。

修正前

"devDependencies": {
  "@aws-cdk/assert": "1.44.0", <= ここのバージョンが古かった
  "@types/jest": "^25.2.1",
  "@types/node": "10.17.5",
  "aws-cdk": "1.44.0", <= ここのバージョンが古かった
  "jest": "^25.5.0",
  "ts-jest": "^25.3.1",
  "ts-node": "^8.1.0",
  "typescript": "~3.7.2"
},
"dependencies": {
  "@aws-cdk/aws-apigateway": "^1.47.0",
  "@aws-cdk/aws-lambda": "^1.47.0",
  "@aws-cdk/core": "1.44.0", <= ここのバージョンが古かった
  "aws-lambda": "^1.0.6",
  "source-map-support": "^0.5.16"
}

修正後

"devDependencies": {
  "@aws-cdk/assert": "^1.47.0",
  "@types/jest": "^25.2.1",
  "@types/node": "10.17.5",
  "aws-cdk": "^1.47.0",
  "jest": "^25.5.0",
  "ts-jest": "^25.3.1",
  "ts-node": "^8.1.0",
  "typescript": "~3.7.2"
},
"dependencies": {
  "@aws-cdk/aws-apigateway": "^1.47.0",
  "@aws-cdk/aws-lambda": "^1.47.0",
  "@aws-cdk/core": "^1.47.0",
  "aws-lambda": "^1.0.6",
  "source-map-support": "^0.5.16"
}

原因

正直最初は原因が全くわからず・・・。
ググってもピンポイントな記事は見つからず・・・。

とはいえ、少し前は問題なく動かすこと出来ていたので、一旦動いていた時のバージョンを下げてみたところ、ちゃんとビルドできるようになりました。

とりあえず動いたので、これで終わりにしようかと思っていたのですが、package.json の中身を見てみると、yarn add で追加した @aws-cdk/aws-apigateway@aws-cdk/aws-lambda のパッケージのバージョン(1.47.0)と、@aws-cdk/core のバージョン(1.44.0)があっていないことに気づきました。
もしかしてと思って、諸々のバージョンをあわせるような形で修正をしたら、きちんと最新のバージョンで動くようになりました。

私の環境では、cdk はグローバルにインストールしているのですが、ここのバージョンが古かったせいで、cdk init した際に生成される package.json のファイルのバージョンが古く、後から yarn add で追加したパッケージのバージョンは最新が追加され、バージョンの乖離が発生してしまっていたという状態でした。

今回の反省点

前回同様、インストールしたことに満足せず、きちんとバージョン確認します・・・。
反省点活かせてない。
仕事で使っているわけではないので、ついバージョンアップは怠けがち。

2020年6月7日日曜日

AWS CDK と AWS SAM CLI を利用して、API Gateway + Lambda をローカル実行しようとしたらハマった件

AWS CDK が使えるのかどうか試してみようと思ってハマった内容をメモとして残しておきます。

前提

MacOSX         10.14.6(Mojave)
AWS CLI        1.16.155
AWS SAM CLI    0.15.0 -> 0.52.0(バグの回避のためにバージョン上げた時のバージョン)
AWS CDK        1.44.0
Docker for Mac 2.3.0.3

この記事のゴール

下記のエラーを回避し、ローカル環境で Lambda が実行できていること。

発生したエラー

$ sam local start-api -t template.yaml --docker-network bridge
2020-06-07 10:52:59 Found credentials in shared credentials file: ~/.aws/credentials
Error: Template does not have any APIs connected to Lambda functions

やったこと

brew 経由で AWS SAM CLI をインストール

brew install aws-sam-cli

AWS CDK をインストール(AWSの公式を参考に)

npm install -g aws-cdk

クラメソさんの記事を参考に、API Gateway + Lambda をローカルで動かす準備をした。

直すためにやったこと

// pip 経由でインストールした aws-sam-cli を削除
$ pip uninstall aws-sam-cli

// シェル再起動
$ exec $SHELL -l

// sam コマンドがあるか確認。brew でインストールしたものが残っていそうなことは確認できた
$ which sam
/usr/local/bin/sam

// sam cli のバージョン確認
$ sam --version
SAM CLI, version 0.52.0

// 一応 brew 側のバージョンも確認
$ brew info aws-sam-cli
aws/tap/aws-sam-cli: stable 0.52.0 (bottled), HEAD
AWS SAM CLI 🐿 is a tool for local development and testing of Serverless applications

原因

AWS SAM CLI のバージョンが古かったことが原因だったっぽい。
最新のバージョンに上げたことで解消できた。

はっきりとした原因が発見できたわけではなく、いろんな記事を渡り歩いたらこの結論に至ったという形。

気づけたのは sam start-api ではなく sam local invoke を実行してみたら、nodejs12.X 系のランタイムはサポートしてないとか言われたので、aws-sam-cli のバージョン確認してみたらやたら古かった。
どうやらはるか昔に pip 経由でインストールした aws-sam-cli があり、そっちのパスが通っていたらしく、今回brew 経由でインストールした方は利用されなかった。

今回の反省点

インストールしたことに満足せず、きちんとバージョン確認します・・・。

2018年2月14日水曜日

Amazon Linux 2のイメージを使ってみる

背景

現在業務でAmazon Linuxを使っているのですが、Amazon Linux 2に移行したらどうなるのかなーと思ったのと、
個人的に会社の環境をコンテナ化していったらどうなるかなーというのを試してみたかったのがきっかけ。
そのためにまず Amazon Linux 2 のイメージを落としてみようと思いました。

とりあえず調べてみる

どうやらAmazon Linuxのイメージの取得方法は2種類あるらしい。
最近DockerHubから落とせるようになったって話題になっていたので、DockerHubから落とせるのは知っていたのですが、
AWS ECRからも落とせるみたいですね。

それぞれ、ダウンロードする為に必要なものは下記の通り。

  1. AWS ECR からDockerイメージをダウンロードする方法
    -> AWSのアカウントが必要

  2. DockerHubから取得する方法
    -> DockerHubのアカウントが必要

AWS ECRからダウンロードするのはAWSのアカウントが必要になるので、会社で試しにやってみたのですが、結構面倒でした。
DockerHubで落としてくる方が断然楽なので、こちらをオススメします。

やってみる

DockerHubのアカウントの発行に関しては、事前に済ませている前提で進めます。

  1. ターミナル上でDockerHubにログインする

    docker login
    

    ログイン時のユーザー名を入力する

    Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
    Username: (DockerHubのユーザー名。メールアドレスではない。)
    

    ログイン時のパスワードを入力する

    Password: (DockerHubのログイン時に使用するパスワード)
    

    認証情報が合っていればログインに成功した旨が表示される

    Login Succeeded
    
  2. DockerHubからimageをpullしてくる

    docker pull amazonlinux
    
  3. Amazon Linux 2 のコンテナに入ってみる

    docker run -it amazonlinux /bin/bash
    
  4. OSの確認

    # cat /etc/os-release
    NAME="Amazon Linux AMI"
    VERSION="2017.09"
    ID="amzn"
    ID_LIKE="rhel fedora"
    VERSION_ID="2017.09"
    PRETTY_NAME="Amazon Linux AMI 2017.09"
    ANSI_COLOR="0;33"
    CPE_NAME="cpe:/o:amazon:linux:2017.09:ga"
    HOME_URL="http://aws.amazon.com/amazon-linux-ami/"
    

以上でAmazon Linux 2のイメージをダウンロードしてくることが出来ました。
AWS ECRからダウンロードするのは面倒だけど、DockerHubから落としてくるのはめっちゃ楽でした。
あと、Amazon Linux 2って言っているけど、ec2-userがいるわけでもないし、普通にalpineのイメージと大差ない感じでした。
まぁベースイメージとしてはこんな感じなのかなぁという気がしないでもない。

2015年2月12日木曜日

MacからAWSで作成したWindows8のマシンにリモートデスクトップで接続出来ない

AWSで作ったWindows8のマシンを手に入れたのですが、Macから直接リモートデスクトップで接続しようとすると、
以下の様なエラーが出てきて接続出来なかった。

「接続先のコンピューターのIDを確認できません。」

そのせいで、MacbookPro→Parallels上のWindows7→Windows8見たいな感じで接続しないと使えなかった。
Macから直接使えないと意味ない(Macbook Airから主に使いたいため)と思い、調べてみたら案外あっさり見つかった。

AWSに作ったWindowsマシンに接続する為に使っていたアプリは、

Microsoft Remote Desktop Connection Client for Mac

どうやらこれがいけないというか、このアプリだとWindows8側で設定を諸々変更する必要があるらしい。
ちょっと面倒だったのですが、何個か別の記事を読んでみると、どうやら別のアプリを落とすだけでいけるらしい事がわかった。
そのアプリはApple Storeで公開されている「Microsoft Remote Desktop」を使えば問題ない。

早速試してみた。
Apple Storeにいって「Microsoft Remote Desktop」で検索すると、一発で出てきた。
赤いアイコンで目立つ感じ。

早速インストールして接続。
全部英語ですが、そんなに難しい単語は使われていないので、特に問題ないと思います。
※入力した内容を保存するボタンが無いので、ちょっと不安な気持ちになりますが、閉じるボタンを押したタイミングで勝手に保存されるようです。


Windows8側の設定を変える方法として、以下の様な方法があります。
新しくアプリ落とす方が面倒だという方はこちらの方法を試してみてください。
設定を変更することで接続出来ることは確認しました。

1.検索で「gpedit.msc」を入力。
2.下記のようにツリーを辿って、セキュリティを選択。
ローカルコンピューターポリシー
 │
 └ コンピューターの構成
    │
    └ 管理者用テンプレート
      │
      └ Windowsコンポーネント
         │
         └ リモート デスクトップ サービス
           │
           └ リモート デスクトップ セッションホスト
               │
              └ セキュリティ ← ここを選択


「リモート(RDP)接続に特定のセキュリティレイヤーの使用を必要とする」を有効にし、セキュリティレイヤーをRDPに変更する

「リモート接続にネットワークレベル認証を使用したユーザー認証を必要とする」を無効にする

以上の設定が終わったら再起動して、再接続してみるとつながった。

AWSアカウントを作って、Windowsマシンを手に入れる

1年間無料で使えるので、AWSでどこからでも使えるWindowsマシンを手に入れようかと思い、アカウントを作ってみた。

登録フローは公式サイトに書かれているので、そちらを参考に。

で、Windowsマシンを作ってみる。
まず、以下のサイトにアクセス。

http://aws.amazon.com/jp/
コンソールへサインインボタンをクリック

Emailアドレスとパスワードを入力してログイン

ログインが完了すると、マネージメントコンソールという画面が開く。
画面左上のEC2をクリック

Launch Instanceボタンをクリック

作りたいOSを選ぶ
但し、無料で使えるOSの種類は限られているので、「Free tier only」にチェックを付けて無料で使えるやつのみをリスト上に表示させるとよい。

インスタンスタイプを選ぶ
無料のものは一番上のもののみなので、自動的にこれを選ぶ事になる。

作成するインスタンスの詳細を選択する。
基本的には赤線で囲ってある部分を両方チェックしておく。

ストレージのサイズを決める
特に問題がなければそのままにしておく。
30GBまでは無料で使えるので、30GBにした。

インスタンスの名前を決める

セキュリティグループを選ぶ。
Windowsマシンを選択した場合、自動でここがRDPになっているので、基本的には何もしなくてもOK。

作成されるマシンの内容を確認し、起動ボタンを押す。

鍵を作成してダウンロード後、インスタンスを起動させる。

これでとりあえずマシンの作成は完了。
次に作成したマシンにログインするまでの方法。
マネージメントコンソールTOPから、Instancesをクリック

起動させたいマシンを選んで、Connectボタンを押す。(ここからVMに繋がるわけではない。)

ログインパスワードを取得する。

マシンを作った時にダウンロードした鍵ファイルをアップロードして、パスワードを抽出する。

リモートデスクトップファイルをダウンロードして、
ユーザー名、抽出されたパスワードやIPが表示されているので、これを元にリモートデスクトップで接続する。

※MacからWindows8系にリモートデスクトップ接続する場合に接続できない事があるが、それは別の記事で。
結論としては、Apple Storeに公開されているMicrosoft Remote Desktopを使えば問題なく接続出来るということです。