メインコンテンツまでスキップ

「AWS」タグの記事が97件件あります

全てのタグを見る

· 約3分
moritalous
お知らせ

過去にQiitaに投稿した内容のアーカイブです。

我が子の小学校で、「ツイタもん」が導入されました。

児童見守り安心システム ツイタもん https://tsuitamon.jp/

学校の門を通ると、「ツイタもん」とメールが来ます。 今どきなサービスですが、毎日メールが来ると、そのうち気にしなくなりそうです。 そこで、万が一、門を通ってないときだけ「ツイテないもん」と連絡が来る仕組みを考えました。

仕組み

仕組みとしては、子供が学校に行くまでの時間に、 「ツイテないもん」通知を行うスケジュール を有効にし、「ツイタもん」メールが来たらこの 「ツイテないもん」通知を行うスケジュール を無効にします。 学校についたら、スケジュールはキャンセルされて通知は実行されず、学校についてなければ、通知スケジュールに従って通知されるわけです。

これをIFTTTとAWSのLambdaやCloudWatch Eventsを組み合わせて実現します。

構成

全体構成

ツイテないもん.png

学校についた場合

ツイテないもん-ついた場合.png

学校についてない場合

ツイテないもん-ついてない場合.png

Lambdaの処理

CloudWatch Eventsを無効にするLambda

超適当 CloudWatch Eventsのイベント名は環境変数にセットしました。 無効ではなく有効にする場合はdisable_ruleenable_ruleになります。

import os
import boto3

def lambda_handler(event, context):
# TODO implement
event_name = os.environ.get("EVENT_NAME")

client = boto3.client('events')

response = client.disable_rule(
Name=event_name
)

return response

ツイテないもん通知を行うLambda

超適当

import requests
import os

def lambda_handler(event, context):
requests.post(os.environ.get("REQUEST_URL"))
return 'Hello from Lambda'

· 約11分
moritalous
お知らせ

過去にQiitaに投稿した内容のアーカイブです。

いい感じのチュートリアルを見つけたのでやってみました。 構成図も書いてみました。

例: AWS CLI を使用して IPv4 VPC とサブネットを作成 https://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/vpc-subnets-commands-example.html

完成形

Step3.png

環境

Windows 10 AWS CLI 1.15.10

AWS CLIのプロファイルを作成

qiitaという名前のプロファイルを作成。リージョンは東京にしました。

aws configure --profile qiita
AWS Access Key ID [None]:           <--- Access Keyを入力
AWS Secret Access Key [None]: <--- Secret Access Keyを入力
Default region name [None]: <--- ap-northeast-1を入力
Default output format [None]: <--- 未入力
aws configure list --profile qiita
      Name                    Value             Type    Location
---- ----- ---- --------
profile qiita manual --profile
access_key ****************PLCA shared-credentials-file
secret_key ****************rObp shared-credentials-file
region ap-northeast-1 config-file ~/.aws/config

ステップ 1: VPC とサブネットを作成する

AWS CLI を使用して VPC およびサブネットを作成するには

  • 10.0.0.0/16 CIDR ブロックを持つ VPC を作成します。
aws ec2 create-vpc --cidr-block 10.0.0.0/16 --profile qiita
{
"Vpc": {
"VpcId": "vpc-29b62c4e",
"InstanceTenancy": "default",
"Tags": [],
"CidrBlockAssociationSet": [
{
"AssociationId": "vpc-cidr-assoc-4850cf20",
"CidrBlock": "10.0.0.0/16",
"CidrBlockState": {
"State": "associated"
}
}
],
"Ipv6CidrBlockAssociationSet": [],
"State": "pending",
"DhcpOptionsId": "dopt-b3268cd6",
"CidrBlock": "10.0.0.0/16",
"IsDefault": false
}
}
  • 前の手順の VPC IDを使用して、10.0.1.0/24 CIDR ブロックを持つサブネットを作成します。
aws ec2 create-subnet --vpc-id vpc-29b62c4e --cidr-block 10.0.1.0/24 --profile qiita
{
"Subnet": {
"AvailabilityZone": "ap-northeast-1d",
"AvailableIpAddressCount": 251,
"DefaultForAz": false,
"Ipv6CidrBlockAssociationSet": [],
"VpcId": "vpc-29b62c4e",
"State": "pending",
"MapPublicIpOnLaunch": false,
"SubnetId": "subnet-30eeea18",
"CidrBlock": "10.0.1.0/24",
"AssignIpv6AddressOnCreation": false
}
}
  • VPC で、10.0.0.0/24 CIDR ブロックを持つ 2 番目のサブネットを作成します。
aws ec2 create-subnet --vpc-id vpc-29b62c4e --cidr-block 10.0.0.0/24 --profile qiita
{
"Subnet": {
"AvailabilityZone": "ap-northeast-1d",
"AvailableIpAddressCount": 251,
"DefaultForAz": false,
"Ipv6CidrBlockAssociationSet": [],
"VpcId": "vpc-29b62c4e",
"State": "pending",
"MapPublicIpOnLaunch": false,
"SubnetId": "subnet-45ede96d",
"CidrBlock": "10.0.0.0/24",
"AssignIpv6AddressOnCreation": false
}
}

構成図

Step1.png

ステップ2のカスタムルートテーブルを作ってないと、デフォルトのルートテーブルが作成されるようです。

ステップ2: サブネットをパブリックにします。

サブネットをパブリックサブネットにするには

  • インターネットゲートウェイを作成する.
aws ec2 create-internet-gateway --profile qiita
{
"InternetGateway": {
"Tags": [],
"Attachments": [],
"InternetGatewayId": "igw-9eda9dfa"
}
}
  • 前のステップの ID を使用して、VPC にインターネットゲートウェイをアタッチします。
aws ec2 attach-internet-gateway --vpc-id vpc-29b62c4e --internet-gateway-id igw-9eda9dfa --profile qiita

  • VPC に対してカスタムルートテーブルを作成します。
aws ec2 create-route-table --vpc-id vpc-29b62c4e --profile qiita
{
"RouteTable": {
"Associations": [],
"RouteTableId": "rtb-67c92101",
"VpcId": "vpc-29b62c4e",
"PropagatingVgws": [],
"Tags": [],
"Routes": [
{
"GatewayId": "local",
"DestinationCidrBlock": "10.0.0.0/16",
"State": "active",
"Origin": "CreateRouteTable"
}
]
}
}
  • インターネットゲートウェイへのすべてのトラフィック (0.0.0.0/0) をポイントするルートテーブルでルートを作成します。
aws ec2 create-route --route-table-id rtb-67c92101 --destination-cidr-block 0.0.0.0/0 --gateway-id igw-9eda9dfa --profile qiita
{
"Return": true
}
  • ルートが作成され有効になっていることを確認するには、ルートテーブルを記述して結果を表示できます。
aws ec2 describe-route-tables --route-table-id rtb-67c92101 --profile qiita
{
"RouteTables": [
{
"Associations": [],
"RouteTableId": "rtb-67c92101",
"VpcId": "vpc-29b62c4e",
"PropagatingVgws": [],
"Tags": [],
"Routes": [
{
"GatewayId": "local",
"DestinationCidrBlock": "10.0.0.0/16",
"State": "active",
"Origin": "CreateRouteTable"
},
{
"GatewayId": "igw-9eda9dfa",
"DestinationCidrBlock": "0.0.0.0/0",
"State": "active",
"Origin": "CreateRoute"
}
]
}
]
}
  • ルートテーブルは現在、サブネットには関連付けられていません。サブネットからのトラフィックがインターネットゲートウェイにルーティングされるよう、ルートテーブルを VPC のサブネットに関連付ける必要があります。最初に、describe-subnets コマンドを使用してサブネット ID を取得します。--filter オプションを使用して新しい VPC のサブネットだけを返し、--query オプションを使用してサブネット ID と CIDR ブロックだけを返します。
aws ec2 describe-subnets --filters "Name=vpc-id,Values=vpc-29b62c4e" --query 'Subnets[*].{ID:SubnetId,CIDR:CidrBlock}' --profile qiita
"Subnets[*].{ID:SubnetId,CIDR:CidrBlock}"

queryすると結果が出ない。。Windowsだとだめなのかな

aws ec2 describe-subnets --filters "Name=vpc-id,Values=vpc-29b62c4e" --profile qiita
{
"Subnets": [
{
"AvailabilityZone": "ap-northeast-1d",
"AvailableIpAddressCount": 251,
"DefaultForAz": false,
"Ipv6CidrBlockAssociationSet": [],
"VpcId": "vpc-29b62c4e",
"State": "available",
"MapPublicIpOnLaunch": false,
"SubnetId": "subnet-30eeea18",
"CidrBlock": "10.0.1.0/24",
"AssignIpv6AddressOnCreation": false
},
{
"AvailabilityZone": "ap-northeast-1d",
"AvailableIpAddressCount": 251,
"DefaultForAz": false,
"Ipv6CidrBlockAssociationSet": [],
"VpcId": "vpc-29b62c4e",
"State": "available",
"MapPublicIpOnLaunch": false,
"SubnetId": "subnet-45ede96d",
"CidrBlock": "10.0.0.0/24",
"AssignIpv6AddressOnCreation": false
}
]
}
  • カスタムルートテーブルに関連付けるサブネット、例えば subnet-b46032ec を選択できます。このサブネットはパブリックサブネットになります。
aws ec2 associate-route-table  --subnet-id subnet-30eeea18 --route-table-id rtb-67c92101 --profile qiita
{
"AssociationId": "rtbassoc-b44659d2"
}
  • サブネット内で起動されたインスタンスがパブリック IP アドレスを自動的に受信できるよう、オプションで、サブネットの動作に対処しているパブリック IP を変更できます。これを行わない場合は、インターネットからインスタンスにアクセスできるよう、起動後に Elastic IP アドレスをインスタンスに関連付ける必要があります。
aws ec2 modify-subnet-attribute --subnet-id subnet-30eeea18 --map-public-ip-on-launch --profile qiita

もう一度サブネットの情報を取得

aws ec2 describe-subnets --filters "Name=vpc-id,Values=vpc-29b62c4e" --profile qiita
{
"Subnets": [
{
"AvailabilityZone": "ap-northeast-1d",
"AvailableIpAddressCount": 251,
"DefaultForAz": false,
"Ipv6CidrBlockAssociationSet": [],
"VpcId": "vpc-29b62c4e",
"State": "available",
"MapPublicIpOnLaunch": true,
"SubnetId": "subnet-30eeea18",
"CidrBlock": "10.0.1.0/24",
"AssignIpv6AddressOnCreation": false
},
{
"AvailabilityZone": "ap-northeast-1d",
"AvailableIpAddressCount": 251,
"DefaultForAz": false,
"Ipv6CidrBlockAssociationSet": [],
"VpcId": "vpc-29b62c4e",
"State": "available",
"MapPublicIpOnLaunch": false,
"SubnetId": "subnet-45ede96d",
"CidrBlock": "10.0.0.0/24",
"AssignIpv6AddressOnCreation": false
}
]
}

subnet-30eeea18MapPublicIpOnLaunchtrueになってますね。

構成図

Step2.png

ルートテーブルが2つになって、インターネットにアクセスできるサブネットとできないサブネットができました。

ステップ 3: サブネット内にインスタンスを起動する

パブリックサブネット内のインスタンスを起動して接続するには

  • キーペアを作成して、--query オプションと --output テキストオプションを使用し、.pem 拡張機能でプライベートキーをファイルに直接パイプします。 ※これもqueryが上手くいかない。。。
aws ec2 create-key-pair --key-name MyKeyPair --output text --profile qiita
ff:5b:2d:43:fa:cd:1e:f2:30:8a:fd:7a:38:6a:48:70:bc:ff:99:d1     -----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAnqussaU7076k4d56v4Wz5PpZDCfgKKTWTtCsoBD3nzyR6moFRzFAlZ2qi1Tq
(省略)
EZss5GqDXov5B23iXcK9E9iRSnyPNVxDHmM240eHOMKTZkoLog+jnEQhG9Y6pTaHJAM=
-----END RSA PRIVATE KEY----- MyKeyPair

-----BEGIN RSA PRIVATE KEY-----から-----END RSA PRIVATE KEY-----までをコピーしてテキストファイルに保存します。

  • VPC にセキュリティグループを作成し、SSH でどこからでもアクセスできるようにするルールを追加します。
aws ec2 create-security-group --group-name SSHAccess --description "Security group for SSH access" --vpc-id vpc-29b62c4e --profile qiita
{
"GroupId": "sg-1846be60"
}
aws ec2 authorize-security-group-ingress --group-id sg-1846be60 --protocol tcp --port 22 --cidr 0.0.0.0/0 --profile qiita

  • 作成したセキュリティグループとキーペアを使用して、パブリックサブネット内でインスタンスを起動します。出力内のインスタンスのインスタンス ID をメモしておきます。

※AMI IDはここでわかります。 https://aws.amazon.com/jp/amazon-linux-ami/

aws ec2 run-instances --image-id ami-ceafcba8   --count 1 --instance-type t2.micro --key-name MyKeyPair --security-group-ids sg-1846be60 --subnet-id subnet-30eeea18  --profile qiita
{
"Instances": [
{
"Monitoring": {
"State": "disabled"
},
"PublicDnsName": "",
"StateReason": {
"Message": "pending",
"Code": "pending"
},
"State": {
"Code": 0,
"Name": "pending"
},
"EbsOptimized": false,
"LaunchTime": "2018-04-30T02:17:53.000Z",
"PrivateIpAddress": "10.0.1.119",
"ProductCodes": [],
"VpcId": "vpc-29b62c4e",
"StateTransitionReason": "",
"InstanceId": "i-0b192396791d0afa0",
"ImageId": "ami-ceafcba8",
"PrivateDnsName": "ip-10-0-1-119.ap-northeast-1.compute.internal",
"KeyName": "MyKeyPair",
"SecurityGroups": [
{
"GroupName": "SSHAccess",
"GroupId": "sg-1846be60"
}
],
"ClientToken": "",
"SubnetId": "subnet-30eeea18",
"InstanceType": "t2.micro",
"NetworkInterfaces": [
{
"Status": "in-use",
"MacAddress": "0e:ca:57:b1:d0:d8",
"SourceDestCheck": true,
"VpcId": "vpc-29b62c4e",
"Description": "",
"NetworkInterfaceId": "eni-b22fa5ac",
"PrivateIpAddresses": [
{
"Primary": true,
"PrivateIpAddress": "10.0.1.119"
}
],
"SubnetId": "subnet-30eeea18",
"Attachment": {
"Status": "attaching",
"DeviceIndex": 0,
"DeleteOnTermination": true,
"AttachmentId": "eni-attach-a9d214cf",
"AttachTime": "2018-04-30T02:17:53.000Z"
},
"Groups": [
{
"GroupName": "SSHAccess",
"GroupId": "sg-1846be60"
}
],
"Ipv6Addresses": [],
"OwnerId": "781749372177",
"PrivateIpAddress": "10.0.1.119"
}
],
"SourceDestCheck": true,
"Placement": {
"Tenancy": "default",
"GroupName": "",
"AvailabilityZone": "ap-northeast-1d"
},
"Hypervisor": "xen",
"BlockDeviceMappings": [],
"Architecture": "x86_64",
"RootDeviceType": "ebs",
"RootDeviceName": "/dev/xvda",
"VirtualizationType": "hvm",
"AmiLaunchIndex": 0
}
],
"ReservationId": "r-0aedd8269b2d255bd",
"Groups": [],
"OwnerId": "781749372177"
}
  • インスタンスに接続するには、そのインスタンスが running 状態になっている必要があります。インスタンスを記述してその状態を確認し、パブリック IP アドレスを書き留めておきます。
aws ec2 describe-instances --instance-id i-0b192396791d0afa0 --profile qiita
{
"Reservations": [
{
"Instances": [
{
"Monitoring": {
"State": "disabled"
},
"PublicDnsName": "",
"State": {
"Code": 16,
"Name": "running"
},
"EbsOptimized": false,
"LaunchTime": "2018-04-30T02:17:53.000Z",
"PublicIpAddress": "18.182.20.38",
"PrivateIpAddress": "10.0.1.119",
"ProductCodes": [],
"VpcId": "vpc-29b62c4e",
"StateTransitionReason": "",
"InstanceId": "i-0b192396791d0afa0",
"EnaSupport": true,
"ImageId": "ami-ceafcba8",
"PrivateDnsName": "ip-10-0-1-119.ap-northeast-1.compute.internal",
"KeyName": "MyKeyPair",
"SecurityGroups": [
{
"GroupName": "SSHAccess",
"GroupId": "sg-1846be60"
}
],
"ClientToken": "",
"SubnetId": "subnet-30eeea18",
"InstanceType": "t2.micro",
"NetworkInterfaces": [
{
"Status": "in-use",
"MacAddress": "0e:ca:57:b1:d0:d8",
"SourceDestCheck": true,
"VpcId": "vpc-29b62c4e",
"Description": "",
"NetworkInterfaceId": "eni-b22fa5ac",
"PrivateIpAddresses": [
{
"PrivateIpAddress": "10.0.1.119",
"Primary": true,
"Association": {
"PublicIp": "18.182.20.38",
"PublicDnsName": "",
"IpOwnerId": "amazon"
}
}
],
"SubnetId": "subnet-30eeea18",
"Attachment": {
"Status": "attached",
"DeviceIndex": 0,
"DeleteOnTermination": true,
"AttachmentId": "eni-attach-a9d214cf",
"AttachTime": "2018-04-30T02:17:53.000Z"
},
"Groups": [
{
"GroupName": "SSHAccess",
"GroupId": "sg-1846be60"
}
],
"Ipv6Addresses": [],
"OwnerId": "781749372177",
"PrivateIpAddress": "10.0.1.119",
"Association": {
"PublicIp": "18.182.20.38",
"PublicDnsName": "",
"IpOwnerId": "amazon"
}
}
],
"SourceDestCheck": true,
"Placement": {
"Tenancy": "default",
"GroupName": "",
"AvailabilityZone": "ap-northeast-1d"
},
"Hypervisor": "xen",
"BlockDeviceMappings": [
{
"DeviceName": "/dev/xvda",
"Ebs": {
"Status": "attached",
"DeleteOnTermination": true,
"VolumeId": "vol-06f8f3fc34c17685d",
"AttachTime": "2018-04-30T02:17:54.000Z"
}
}
],
"Architecture": "x86_64",
"RootDeviceType": "ebs",
"RootDeviceName": "/dev/xvda",
"VirtualizationType": "hvm",
"AmiLaunchIndex": 0
}
],
"ReservationId": "r-0aedd8269b2d255bd",
"Groups": [],
"OwnerId": "781749372177"
}
]
}

構成図

Step3.png

インターネット側へのアクセスが可能で、外部の任意のIPアドレスからのSSH接続が可能なインスタンスが起動しました。

手順 4: クリーンアップ

  • インスタンスを終了
aws ec2 terminate-instances --instance-id i-0b192396791d0afa0 --profile qiita
{
"TerminatingInstances": [
{
"InstanceId": "i-0b192396791d0afa0",
"CurrentState": {
"Code": 32,
"Name": "shutting-down"
},
"PreviousState": {
"Code": 16,
"Name": "running"
}
}
]
}
  • セキュリティグループを削除する:
aws ec2 delete-security-group --group-id sg-1846be60 --profile qiita

  • サブネットを削除する:
aws ec2 delete-subnet --subnet-id subnet-30eeea18 --profile qiita

aws ec2 delete-subnet --subnet-id subnet-45ede96d --profile qiita

  • カスタムルートテーブルを削除する:
aws ec2 delete-route-table --route-table-id rtb-67c92101 --profile qiita

  • VPC からのインターネットゲートウェイのデタッチ:
aws ec2 detach-internet-gateway --internet-gateway-id igw-9eda9dfa --vpc-id vpc-29b62c4e --profile qiita

  • インターネットゲートウェイの削除:
aws ec2 delete-internet-gateway --internet-gateway-id igw-9eda9dfa --profile qiita

  • VPC の削除:
aws ec2 delete-vpc --vpc-id vpc-29b62c4e --profile qiita

終わりに

次はCloudFormationに挑戦しようと思います。

· 約4分
moritalous
お知らせ

過去にQiitaに投稿した内容のアーカイブです。

ブラウザからのユーザーアクセスであればamazon-cognito-identity-jsを使ってユーザーの追加、ログインは簡単にできますが、どうにかサーバーサイドでできないものか、調査しました。 Javaのプログラムからユーザー追加やログイン(トークンの取得)ができましたので紹介します。

前準備(マネジメントコンソール)

ユーザープールを作成します。ユーザーの登録以降のフローは異なりますが、ユーザープールを作成する手順まではこちらのサイトが参考になると思います。

前準備(Java)

AWS SDKを使う設定をします。Gradleの場合は、build.gradleに以下の内容を追加します。

build.gradle
    // https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-cognitoidp
compile group: 'com.amazonaws', name: 'aws-java-sdk-cognitoidp', version: '1.11.123'

AWSCognitoIdentityProviderの作成

AWSCredentialsProviderとリージョン(今回は東京リージョン)を引数に渡して、AWSCognitoIdentityProviderを作成します。

AWSCredentialsProviderの作成方法は色々あるようですが、今回はこちらを参考にProfileCredentialsProviderを使用しました。

AWSCredentialsProvider credentialsProvider = new ProfileCredentialsProvider("プロファイル名");

AWSCognitoIdentityProvider client = AWSCognitoIdentityProviderClientBuilder.standard()
.withCredentials(credentialsProvider)
.withRegion(Regions.AP_NORTHEAST_1)
.build();

ユーザーの新規作成

ユーザーを新規作成します。 ユーザープールIDはマネジメントコンソールで確認できます。

AdminCreateUserRequest adminCreateUserRequest = new AdminCreateUserRequest();
adminCreateUserRequest
.withUserPoolId("ユーザープールID")
.withUsername("新規作成するユーザーのユーザー名")
.withTemporaryPassword("新規作成するユーザーの一時パスワード");
AdminCreateUserResult response = client.adminCreateUser(adminCreateUserRequest);

トークンの取得

ユーザーIDとパスワードを使ってトークンを取得します。クライアントIDはマネジメントコンソール上の「Apps」のところにあります。 ※Appsの設定のEnable sign-in API for server-based authentication (ADMIN_NO_SRP_AUTH)は有効になっている必要があります。

Map<String, String> authParameters = new HashMap<>();
authParameters.put("USERNAME", "ユーザー名");
authParameters.put("PASSWORD", "パスワード");

AdminInitiateAuthRequest request = new AdminInitiateAuthRequest();
request
.withAuthFlow(AuthFlowType.ADMIN_NO_SRP_AUTH)
.withUserPoolId("ユーザープールID")
.withClientId("クライアントID")
.withAuthParameters(authParameters);

AdminInitiateAuthResult response = client.adminInitiateAuth(request);

成功するとトークンが取得できます。(加工しています)

System.out.println(response.getAuthenticationResult().toString());
トークン取得成功時
{
AccessToken: xxxxx,
ExpiresIn: 3600,
TokenType: Bearer,
RefreshToken: yyyyy,
IdToken: zzzzz,
}

ただし、新規作成したばかりのユーザーは、パスワード変更の必要があるため、トークンは取得できません。その場合、ChallengeNameが「NEW_PASSWORD_REQUIRED」となってしまいますので、次の一時パスワード変更を行います。 (トークン取得成功時はChallengeNameがnull、トークン取得失敗時はAuthenticationResultがnullになるようです)

System.out.println(response.getChallengeName());
トークン取得失敗時
NEW_PASSWORD_REQUIRED

一時パスワード変更

一時パスワード変更処理です。adminInitiateAuthのレスポンスで受け取るChallengeNameとSessionが必要になります。

Map<String, String> challengeResponses = new HashMap<>();
challengeResponses.put("USERNAME", "ユーザー名");
challengeResponses.put("NEW_PASSWORD", "変更後の新しいパスワード");

AdminRespondToAuthChallengeRequest request = new AdminRespondToAuthChallengeRequest();
request
.withChallengeName(adminInitiateAuthResult.getChallengeName())
.withUserPoolId("ユーザープールID")
.withClientId("クライアントID")
.withSession(adminInitiateAuthResult.getSession())
.withChallengeResponses(challengeResponses);

AdminRespondToAuthChallengeResult response = client.adminRespondToAuthChallenge(request);

上手く行けば、この手順を持ってトークンが取得できます。

System.out.println(response.getAuthenticationResult().toString());
{
AccessToken: xxxxx,
ExpiresIn: 3600,
TokenType: Bearer,
RefreshToken: yyyyy,
IdToken: zzzzz,
}

トークンの更新

リフレッシュトークンを使用してのトークンの更新は、トークンの取得と同様adminInitiateAuthメソッドにて行います。 authParametersの値とAuthFlowが違うだけです

Map<String, String> authParameters = new HashMap<>();
authParameters.put("REFRESH_TOKEN", "リフレッシュトークン");

AdminInitiateAuthRequest request = new AdminInitiateAuthRequest();
request
.withAuthFlow(AuthFlowType.REFRESH_TOKEN_AUTH)
.withUserPoolId("ユーザープールID")
.withClientId("クライアントID")
.withAuthParameters(authParameters);

AdminInitiateAuthResult response = client.adminInitiateAuth(request);

取得したトークンの利用方法など

勉強中です。

· 約5分
moritalous
お知らせ

過去にQiitaに投稿した内容のアーカイブです。

AWS IoTのデータをKibanaに表示するを実際にやってみました。

記事の投稿以降、AWS IoTが直接Elasticsearch Serviceと連携できる様になったとのことで、そのあたりも試しました。

【アップデート】 AWS IoT が Elasticsearch Service と CloudWatch に連携できるようになりました https://aws.amazon.com/jp/blogs/news/aws-iot-update/

なんと、サーバー側はノンコーディングです。

Elasticsearchインスタンスを立ち上げる

元記事と基本的に同じです。 まずは、立ち上がりが遅いElasticsearchを先に立ち上げておきましょう。 Domain nameを plant-sensor、Instance typeはt2.micro.elasticsearchが選べなかったのでt2.small.elasticsearch (Free tire eligible)、Instance countは 1、Strage typeは EBS に設定します。

image

Kibana のURLをクリックするとKibana4の画面が表示されます。EndpointのURLはAWS IoTで使います(自動で設定されます)。

AWS IoTでThingやRuleを作成

元記事の通りしようとしても、画面構成が違うのか、メニューが見つかりません。なので、順を追って解説します。

image (こんな感じでしたっけ?)

「Get started」を押します。そして、左メニューの[Registory]->[Things]を選択します。 「Register a thing」を押します。

image

plant-sensor という名前のThingを作成。

image

左メニューの[Security]を選び、「Create certificate」を選択します。

image

色々ダウンロードできますので、一旦すべてダウンロードした後、「Activate」を押します。

ダウンロードできるもの

  • A certificate for this thing
  • A public key
  • A private key
  • A root CA for AWS IoT

続いてPolicyを作成。トップ画面の左メニューの[Policies]を選び、「Create a Policy」を選択します。

image

名前をつけ、とりあえずActionはiot:*としました。Resource ARNについてですが、キャプチャではtopic/replaceWithATopicとなってますが、plant/sensorsまたは*/*などに変えましょう。

image image

certificateとPolicyの紐付け 左メニューの[Certificates]を再度選び、先程作成したceritificateを選択。「Actions」メニューの「Attatch policy」を選ぶ。

image

同様に、「Attatch thing」も行います。

最後にRuleを作成します。トップ画面の左メニューの[Rules]を選び、「Create a rule」を選択します。

image

今回は plant/sensors というトピック名でデータを飛ばそうと思うので、Topic filterに plant/sensors を設定します。

image

image

Actionの指定は、「Add Action」ボタンを押して行います。

image

2017/3/14時点で以下のActionが選べます。一番下の「Elasticsearch Service」を選びます。

image image

Elasticsearch Service用の設定画面が出ます。 IDに${newuuid()}、Indexにtimestamp、Typeにtimestampと指定し、IAMロールも追加します。

image

これで、Thing, Certificate, Policy, Ruleが作成できました。元記事のように一覧では表示されないようです。

仮想的なIoTデバイスを作成

元記事の通り、plant-sensor.jsを作成します。 そして実行です。

実行してみましょう。

$ npm init
$ npm install --save aws-iot-device-sdk
$ node plant-sensor.js
connect
{"timestamp":"2017-03-14T15:19:47.401Z","humidity":45,"temperature":19,"lux":32701,"moisture":309}
{"timestamp":"2017-03-14T15:19:48.405Z","humidity":43,"temperature":19,"lux":33473,"moisture":309}
{"timestamp":"2017-03-14T15:19:49.406Z","humidity":44,"temperature":19,"lux":30713,"moisture":295}
{"timestamp":"2017-03-14T15:19:50.408Z","humidity":42,"temperature":20,"lux":31499,"moisture":296}
{"timestamp":"2017-03-14T15:19:51.414Z","humidity":46,"temperature":20,"lux":30687,"moisture":315}
{"timestamp":"2017-03-14T15:19:52.417Z","humidity":46,"temperature":20,"lux":31960,"moisture":302}
{"timestamp":"2017-03-14T15:19:53.420Z","humidity":45,"temperature":20,"lux":30782,"moisture":301}

Kibanaでダッシュボードを作成する

Kibanaを起動すると、エラー画面のような形となりますが、初期設定ができていないからだと思います。

image

Index name or patternのところにtimestampといれると、設定できます。

image

Discoverタブを見てみると、ちゃんとデータが来ているのを確認できます。

image

では、チャートを作ってみましょう。Visualizeタブで、以下の様な感じでグラフを作成します。

image

最後にダッシュボードを作成します。Dashboardタブを選択して、Add visualization で先ほど作成したチャートをポンポンと選択していくだけです!

image

終わりに

元記事を作成された、@hideyuki さん、勝手に更新版を投稿してしまいました。ありがとうございます。