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

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

全てのタグを見る

· 約3分
moritalous
お知らせ

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

AWS Summit Online 2021が開催中です。 https://summits-japan.virtual.awsevents.com/

すごくたくさんのセッションがあるのですが、ふと、どんな分野が流行りなのかなぁと思ったのでセッションの情報を分析してみました。

使用したツール

僕にはなんにもスキルがありませんので、便利なサイトを利用させていただきました。

AIテキストマイニング by ユーザーローカル https://textmining.userlocal.jp/

image.png

データ取得方法

セッションの一覧ページは、こんな感じで、タイトルと説明文で構成されています。 説明文が途中で切れてますが、このまま使用しました。

image.png

Chrome DevToolsのConsoleタブで以下のコマンド実行で取得できました。

タイトルの取得
item__name = ''
document.querySelectorAll('.event-list-item__name').forEach(value => item__name = item__name + value.innerText + '\n')
item__name
copy(item__name) // クリップボードにコピー
説明文の取得
item__description = ''
document.querySelectorAll('.event-list-item__description').forEach(value => item__description = item__description + value.innerText + '\n')
item__description
copy(item__description) // クリップボードにコピー

結果

セッションがAWSセッションとパートナーセッションに分かれているのでそれぞれでやってみました。

AWSセッション編

ワードクラウド

image.png

AWSは当然ですが、機械学習ワークロードなどが目を引く感じでしょうか

頻出単語(名詞)

image.png

先程のワードクラウドとはちょっと結果が異なる感じでしょうか。詳細情報は説明文の末尾に必ず詳細情報とあるので、それが出てるだけと思います。

パートナーセッション編

ワードクラウド

image.png

パートナーセッションだけに、パートナーの文字がでかい!!。AWSセッションとの違いではdxサーバレスの大きさが目を引きますね。

頻出単語(名詞)

image.png

セキュリティがパートナーセッションの方だけランクインですね。

以上です。

· 約4分
moritalous
お知らせ

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

あけましておめでとうございます。

AWS Lambdaがコンテナイメージをサポートしたので、Puppeteerでキャプチャを取るLambdaをつくてみました。

クラスメソッドさんの以下の記事の通りで、ローカルでの実行はうまくいきましたが、Lambdaへのデプロイするとうまく動作しませんでした。(Chromeの起動タイミングでエラー?)

Lambda コンテナイメージで Puppeteer を使ってみた | Developers.IO https://dev.classmethod.jp/articles/try-using-puppeteer-with-a-lambda-container-image/

試行錯誤の結果が、こちらとなります。

ソース

全体はこちらにアップロード済みです。 https://github.com/moritalous/m5core2-yweather/tree/master/lambda

Dockerfile

クラスメソッドさんはGoogle Chromeとpuppeteer-coreの組み合わせでしたが、puppeteer単体で動かしたかったので、インストールするパッケージを変えました。 インストールするパッケージはこちらを参考にしました。 日本語フォントgoogle-noto-sans-japanese-fontsもインストールします。

FROM amazon/aws-lambda-nodejs:12
RUN yum -y install libX11 libXcomposite libXcursor libXdamage libXext libXi libXtst cups-libs libXScrnSaver libXrandr alsa-lib pango atk at-spi2-atk gtk3 google-noto-sans-japanese-fonts
COPY app.js package*.json ./
RUN npm install
CMD [ "app.lambdaHandler" ]

ソースコード

依存ライブラリーはpuppeteersharpです。 sharpは取得したスクリーンショットをリサイズするために追加しました。

package.json
  "dependencies": {
"puppeteer": "^5.5.0",
"sharp": "^0.27.0"
}

puppeteer.launchに指定するargsについて ローカルでの実行の場合は--no-sandbox--disable-setuid-sandboxの指定だけでうまくいきましたが、Lambda上ではエラーになりました。 /tmpディレクトリ以外が読み取り専用だからではないでしょうか?

試行錯誤した結果、こんな感じです。

app.js
const browser = await puppeteer.launch({
headless: true,
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
'-–disable-dev-shm-usage',
'--disable-gpu',
'--no-first-run',
'--no-zygote',
'--single-process',
]
});

キャプチャを撮って、リサイズして、PNGにしました。 API Gateway経由で返却したので、Base64エンコードしてレスポンスにセットします。

app.js
buff = await page.screenshot({
clip: rect
});

buff = await sharp(buff).resize(320, 240).png().toBuffer();

base64 = buff.toString('base64');

await browser.close();

const response = {
statusCode: 200,
headers: {
'Content-Length': Buffer.byteLength(base64),
'Content-Type': 'image/png',
'Content-disposition': 'attachment;filename=weather.png'
},
isBase64Encoded: true,
body: base64
};

ECRへプッシュ

Lambdaのコンテナイメージサポートですが、

  • コンテナレジストリはECRでかつプライベート

ということのようです。

はじめはGitHub Container Registryで試してだめで、次にECRのパブリックで試してだめでした。。

$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin [AWSアカウントID].dkr.ecr.ap-northeast-1.amazonaws.com
$ docker build -t [AWSアカウントID].dkr.ecr.ap-northeast-1.amazonaws.com/[リポジトリ名]:latest .
$ docker push [AWSアカウントID].dkr.ecr.ap-northeast-1.amazonaws.com/[リポジトリ名]:latest

Lambdaの作成

基本的にウィザードに従うだけです。

image.png

一点注意ですが、ECRに新しいイメージをプッシュするたびに、Lambdaで使用するイメージを指定し直す必要があります。 sha256ダイジェストの値を見ているようで、latestタグだとしても毎回指定する必要があります。

API Gatewayの作成

Lambdaの画面でトリガーを追加します。かんたんです。 REST APIだと昔はバイナリサポートを有効化するとか色々手順があった気がしますが、何もしなくてもPNGイメージの返却ができました。

image.png

完成

ヤフーの天気をPNG画像にしてみました。

weather.png

· 約3分
moritalous
お知らせ

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

前回の続きです。 Greengrass側で動作するPythonプログラムからAWS IoT Coreへメッセージをパブリッシュできました。

公式ドキュメントがまだ整ってないのでちょっと大変でした。 https://docs.aws.amazon.com/greengrass/v2/developerguide/interprocess-communication.html#ipc-iot-core-mqtt

環境

ハード:Raspberry Pi 4 OS:Raspberry Pi OS(32bit)

ディレクトリ構成

RaspberryPi
$ tree 
.
├── artifacts
│ └── com.example.HelloWorld
│ └── 1.0.0
│ ├── hello_world.py
│ └── ipc_utils.py
└── recipes
└── com.example.HelloWorld-1.0.0.yaml

ソース

  • ipc_utils.py

これは公式ドキュメントにも記載があります。

ipc_utils.py
## Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
## SPDX-License-Identifier: Apache-2.0

import os

from awscrt.io import (
ClientBootstrap,
DefaultHostResolver,
EventLoopGroup,
SocketDomain,
SocketOptions,
)
from awsiot.eventstreamrpc import Connection, LifecycleHandler, MessageAmendment

TIMEOUT = 10


class IPCUtils:
def connect(self):
elg = EventLoopGroup()
resolver = DefaultHostResolver(elg)
bootstrap = ClientBootstrap(elg, resolver)
socket_options = SocketOptions()
socket_options.domain = SocketDomain.Local
amender = MessageAmendment.create_static_authtoken_amender(os.getenv("SVCUID"))
hostname = os.getenv("AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT")
connection = Connection(
host_name=hostname,
port=8033,
bootstrap=bootstrap,
socket_options=socket_options,
connect_message_amender=amender,
)
self.lifecycle_handler = LifecycleHandler()
connect_future = connection.connect(self.lifecycle_handler)
connect_future.result(TIMEOUT)
return connection
  • hello_world.py

Javaのサンプルを参考に、頑張ってみました。

hello_world.py
import awsiot.greengrasscoreipc.client as client
import awsiot.greengrasscoreipc.model as model
from ipc_utils import IPCUtils
import json

print("Start Lambda !!!")

ipc_utils = IPCUtils()
connection = ipc_utils.connect()
ipc_client = client.GreengrassCoreIPCClient(connection)

message = {"hello": "world"}
message = json.dumps(message).encode('utf-8')

request = ipc_client.new_publish_to_iot_core()

publishMessage = model.PublishToIoTCoreRequest(topic_name='test/topic', qos='1', payload=message)

future = request.activate(publishMessage)
result = future.result(timeout=10.0)

print("Finish Lambda !!!")
  • com.example.HelloWorld-1.0.0.yaml

レシピの書き方が大苦戦。。

accessControlのところはaws.greengrass.ipc.mqttproxy、 operationsがaws.greengrass#PublishToIoTCore、 resourcesがトピック名です。 Greengrass 1.0のころのサブスクリプションのイメージですね。

com.example.HelloWorld-1.0.0.yaml
---
RecipeFormatVersion: '2020-01-25'
ComponentName: com.example.HelloWorld
ComponentVersion: '1.0.0'
ComponentDescription: A component that publishes messages.
ComponentPublisher: Amazon
ComponentConfiguration:
DefaultConfiguration:
accessControl:
aws.greengrass.ipc.mqttproxy:
"com.example.HelloWorld:pubsub:1":
policyDescription: Allows access to publish to test/topic.
operations:
- "aws.greengrass#PublishToIoTCore"
resources:
- "test/topic"
Manifests:
- Lifecycle:
Install:
Timeout: 1000
Script: pip3 install awsiotsdk
Run: |
python3 {artifacts:path}/hello_world.py

デプロイ

Greengrass 2.0の特徴で、「Lambdaにデプロイせずにローカルでデプロイできる」機能があります。

RaspberryPi
sudo /greengrass/v2/bin/greengrass-cli \
--ggcRootPath=/greengrass/v2 \
deployment create \
--recipeDir recipes \
--artifactDir artifacts \
--merge "com.example.HelloWorld=1.0.0"

image.png

おめでとうございます!!!

· 約7分
moritalous
お知らせ

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

re:InventでGreengassのバージョンアップが発表されました〜!!!

AWS IoT Greengrass 2.0 を発表 — オープンソースエッジランタイムと新しい開発者向け機能

ちょっと試してみたのですが、1.0とは別物です(笑)

環境

ハード:Raspberry Pi 4 OS:Raspberry Pi OS(32bit)

OSは新規インストール、SSH接続ができる状態でスタートしました。

インストール

Cgroupsを有効化

いつものcgroup_enable=memory cgroup_memory=1を末尾に足します。 ※いつもの過ぎて公式ドキュメントに載ってなさそう

/boot/cmdline.txt
- console=serial0,115200 console=tty1 root=PARTUUID=a1849cf9-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
+ console=serial0,115200 console=tty1 root=PARTUUID=a1849cf9-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles cgroup_enable=memory cgroup_memory=1

Javaのインストール

Greengrass 2.0はなんとJavaでできております。Open JDKをインストールします。

RaspberryPi4
sudo apt install openjdk-8-jdk

AWS認証情報の取得

Greengrassの動作にはAWS CLIやAWSの認証情報は不要ですが、インストール作業には必要です。 (インストール時にモノの登録とかIAMロール、ポリシーの作成を行うからです)

インストール時だけ必要な認証情報なので、最近提供されたばかりの AWS CloudShellを使ってみます

  • IAMロール、ポリシーの作成
CloudShell
ACCOUNT_ID=`aws sts get-caller-identity | jq -r '.Account'`

cat << EOF > GreengrassV2InstallAssumeRolePolicy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::${ACCOUNT_ID}:root"
},
"Action": "sts:AssumeRole",
"Condition": {}
}
]
}
EOF

cat << EOF > GreengrassV2InstallPolicy.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"greengrass:CreateDeployment",
"iot:AddThingToThingGroup",
"iot:AttachPolicy",
"iot:AttachThingPrincipal",
"iot:CreateJob",
"iot:CreateKeysAndCertificate",
"iot:CreatePolicy",
"iot:CreateRoleAlias",
"iot:CreateThing",
"iot:CreateThingGroup",
"iot:DescribeEndpoint",
"iot:DescribeRoleAlias",
"iot:DescribeThingGroup",
"iot:GetPolicy",
"iam:GetRole",
"iam:GetPolicy",
"iam:CreateRole",
"iam:PassRole",
"iam:CreatePolicy",
"iam:AttachRolePolicy"
],
"Resource": "*"
}
]
}
EOF

aws iam create-policy --policy-name GreengrassV2InstallPolicy --policy-document file://GreengrassV2InstallPolicy.json
aws iam create-role --role-name GreengrassV2InstallRole --assume-role-policy-document file://GreengrassV2InstallAssumeRolePolicy.json
aws iam attach-role-policy --policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/GreengrassV2InstallPolicy --role-name GreengrassV2InstallRole

  • 認証情報の生成
CloudShell
aws sts assume-role --role-arn arn:aws:iam::${ACCOUNT_ID}:role/GreengrassV2InstallRole --role-session-name session1

こんな感じで出力されます

{
"Credentials": {
"AccessKeyId": "XXXXXXXXXX",
"SecretAccessKey": "XXXXXXXXXX",
"SessionToken": "XXXXXXXXXX",
"Expiration": "XXXX-XX-XXTXX:XX:XX+XX:XX"
},
"AssumedRoleUser": {
"AssumedRoleId": "XXXXXXXXXX",
"Arn": "XXXXXXXXXX"
}
}

インストール

  • Greengrassモジュールのダウンロードと展開
RaspberryPi4
cd ~
curl -s https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-nucleus-latest.zip > greengrass-nucleus-latest.zip
unzip greengrass-nucleus-latest.zip -d GreengrassCore
  • 認証情報の設定

先程取得した認証情報を環境変数にセットします。

RaspberryPi4
export AWS_ACCESS_KEY_ID=XXXXXXXXXX
export AWS_SECRET_ACCESS_KEY=XXXXXXXXXX
export AWS_SESSION_TOKEN=XXXXXXXXXX
  • インストール
RaspberryPi4
sudo -E java -Droot="/greengrass/v2" -Dlog.store=FILE \
-jar ./GreengrassCore/lib/Greengrass.jar \
--aws-region ap-northeast-1 \
--thing-name GreengrassCore-1767ad88a82 \
--thing-group-name GreengrassGroup \
--component-default-user ggc_user:ggc_group \
--provision true \
--setup-system-service true \
--deploy-dev-tools true

かんたん!!! サービス登録もされており、起動もしてます。

RaspberryPi4
sudo systemctl status greengrass
● greengrass.service - Greengrass Core
Loaded: loaded (/etc/systemd/system/greengrass.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2020-12-19 13:21:07 GMT; 4s ago
Main PID: 9148 (sh)
Tasks: 12 (limit: 4915)
Memory: 33.4M
CGroup: /system.slice/greengrass.service
├─9148 /bin/sh /greengrass/v2/alts/current/distro/bin/loader
└─9152 java -Dlog.store=FILE -Droot=/greengrass/v2 -jar /greengrass/v2/alts/current/distro/lib/Greengrass.jar --setup-syst

Dec 19 13:21:07 raspberrypi systemd[1]: Started Greengrass Core.
Dec 19 13:21:07 raspberrypi sh[9148]: Greengrass root: /greengrass/v2
Dec 19 13:21:07 raspberrypi sh[9148]: JVM options: -Droot=/greengrass/v2
Dec 19 13:21:07 raspberrypi sh[9148]: Nucleus options: --setup-system-service false
Dec 19 13:21:11 raspberrypi sh[9148]: Added ggc_user to ggc_group

使ってみた

Greengrass 2.0は、「レシピでコンポーネントを作ってデプロイする」という考え方になっているようです。

image.png

Greengrass 1.0は「Lambdaをエッジで」という感じでしたが、Greengrass 2.0はLambdaにとらわれず、「クラウドから任意のプログラムをデプロイできる仕組み」にバージョンアップしたイメージです。 サンプルがこんな感じなので、その気になれば何でもOK的な感じですよね。もちろんLambdaもデプロイできます。

image.png

Lambdaをデプロイしてみた

超簡単なLambdaをデプロイしてみました。

lambda_function.py
import json

def lambda_handler(event, context):
# TODO implement
print (json.dumps(event))
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}

print (json.dumps('start lambda'))

コンポーネントの作成

イベントソースを設定したり、タイムアウト、ロングライブ設定など、表現は変わってますが、旧バージョンと大体同じことができそうです。

image.png

ボリュームやデバイスの設定も、Lambdaに対して行うので、旧バージョンよりわかりやすい感じになりました。

image.png

デプロイ

まずはデプロイ対象を指定します。モノのグループを選ぶと、グループに追加になったコアに対しても自動で適用されるようです。

image.png

次に、デプロイするコンポーネントを選択します。自分で作ったコンポーネントの他に、AWSが提供するコンポーネントも沢山あります。もともとコネクタで提供されていた機能もここに統合されているような気がします。

image.png

コンポーネントごとの個別設定を行います。

image.png

これがNucleus(Greengrassコアのことと思います)の個別設定です。MQTTの接続ポートを替えたりできそうです。jvmOptionsまで変えれます。

image.png

最後にデプロイの設定です。タイムアウトや失敗時のロールバック設定ができます。

image.png

これでデプロイが実行されます。

動作確認

マネジメントコンソールのテストで、hello/worldトピックにメッセージを投げて、ログが出力されることを確認。

RaspberryPi(piユーザーでは権限がなくログが見れないのでrootで確認)
root@raspberrypi:~# tail /greengrass/v2/logs/gg_sample.log -n 1
2020-12-19T13:53:36.759Z [INFO] (pool-2-thread-22) gg_sample: lambda_function.py:5,{"message": "Hello from AWS IoT console"}. {serviceInstance=0, serviceName=gg_sample, currentState=RUNNING}
root@raspberrypi:~#

Lambda間の通信や、IoT CoreへのPublishはこちらの方法を使うようです。勉強中です

Interprocess communication https://docs.aws.amazon.com/greengrass/v2/developerguide/interprocess-communication.html

· 約5分
moritalous
お知らせ

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

Re:Invent 2020でAmazon EKS Distro (EKS-D)が発表されましたね。

公式ブログはこちら なぜか日本語の方にはEKS-Dの表記がないですね

Amazon EKS Distro: Amazon EKS で使用される Kubernetes ディストリビューション https://aws.amazon.com/jp/blogs/news/amazon-eks-distro-the-kubernetes-distribution-used-by-amazon-eks/

Introducing Amazon EKS Distro (EKS-D) https://aws.amazon.com/jp/blogs/opensource/introducing-amazon-eks-distro/

早速手持ちのRaspberry Pi 4でやってみました。

先にまとめ

環境

Raspberry Pi 4 (メモリ8GB) microSDカード 32GB ※EKS-Dのビルドを行う際に10GBほど必要です

OSはUbuntu 20.04(64bit)です。

前準備

sudo apt update && sudo apt upgrade -y
  • snapcraftのインストール
sudo snap install snapcraft --classic
  • /boot/firmware/cmdline.txtcgroup_enable=memory cgroup_memory=1を追加(1行目の末尾)
- net.ifnames=0 dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=LABEL=writable rootfstype=ext4 elevator=deadline rootwait fixrtc
+ net.ifnames=0 dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=LABEL=writable rootfstype=ext4 elevator=deadline rootwait fixrtc cgroup_enable=memory cgroup_memory=1
  • LXDの初期化

ビルド時にLXDを使ってみました。初期化します。ディスクスペースが5GBでは不足するので10GBにしました。それ以外はデフォルト設定です。

sudo lxd init
Would you like to use LXD clustering? (yes/no) [default=no]: 
Do you want to configure a new storage pool? (yes/no) [default=yes]:
Name of the new storage pool [default=default]:
Name of the storage backend to use (btrfs, dir, lvm, zfs, ceph) [default=zfs]:
Create a new ZFS pool? (yes/no) [default=yes]:
Would you like to use an existing empty block device (e.g. a disk or partition)? (yes/no) [default=no]:
Size in GB of the new loop device (1GB minimum) [default=5GB]: 10GB ←ここだけ!
Would you like to connect to a MAAS server? (yes/no) [default=no]:
Would you like to create a new local network bridge? (yes/no) [default=yes]:
What should the new bridge be called? [default=lxdbr0]:
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]:
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]:
Would you like LXD to be available over the network? (yes/no) [default=no]:
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]:

EKS-Dのsnapパッケージのビルド

cd /tmp/
git clone https://github.com/canonical/eks-snap.git
cd eks-snap/
snapcraft --use-lxd

45分ほど待つと、eks_v1.18.9_arm64.snapが出来上がります 私のビルド成果物はこちらに格納しました。 https://github.com/moritalous/eks-snap/releases/tag/eks_v1.18.9_arm64

EKS-Dのインストール

sudo snap install eks_v1.18.9_arm64.snap --classic --dangerous

EKS-Dの起動

sudo eks.start

ステータス確認

ubuntu@ubuntu:~$ sudo eks status
eks is running
high-availability: no
datastore master nodes: 127.0.0.1:19001
datastore standby nodes: none
ubuntu@ubuntu:~$

ubuntuユーザーで動作するように設定

mkdir ~/.kube
cd ~/.kube
sudo eks.config > config
chmod 600 config
sudo usermod -a -G eks ubuntu
sudo chown -f -R ubuntu ~/.kube

一度ログアウトして再ログインすると、eks.kubectlコマンドが使えると思います。

色々確認

eksに含まれるコマンドの確認

ubuntu@ubuntu:~$ eks help
Available subcommands are:
add-node
config
ctr
dashboard-proxy
dbctl
join
kubectl
leave
refresh-certs
remove-node
reset
start
status
stop
inspect
ubuntu@ubuntu:~$

kube-systemで起動しているPodの確認

ubuntu@ubuntueks kubectl get pods -n kube-system 
NAME READY STATUS RESTARTS AGE
calico-node-7js69 1/1 Running 1 83m
metrics-server-f59887c58-5wxdp 1/1 Running 0 83m
calico-kube-controllers-555fc8cc5c-6v286 1/1 Running 0 83m
coredns-6788f546c9-vtbq5 1/1 Running 0 83m
hostpath-provisioner-c77bfc987-vnbzk 1/1 Running 0 83m
ubuntu@ubuntu:~$

Serviceの確認

ubuntu@ubuntu:~$ eks kubectl get svc --all-namespaces 
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 87m
kube-system kube-dns ClusterIP 10.152.183.10 <none> 53/UDP,53/TCP,9153/TCP 87m
kube-system metrics-server ClusterIP 10.152.183.182 <none> 443/TCP 87m
ubuntu@ubuntu:~$

イマイチどのあたりがEKSなのか、わかりませんでした。。。