- クラウド技術
AWS Lambdaでkubectlを使用する方法について
- #Kubernetes
- #AWS
目的
【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc. 詳細はこちらから>
AWS Lambdaからkubectlを使用したかったため
ここに手順をまとめておきます。
前提
- AWSアカウントを取得済みであること
- Dockerが使用可能な環境であること
- AWSCLIが使用可能な環境であること
作成手順
以下はAWSコンソール上で操作します。
【1】Lambda Layerのzipファイルを格納するS3を作成します。
①S3バケットを作成します。
S3バケット名:dev-lambda-layer-tmp
バケット名以外は全てデフォルトのままにしました。
以下はDocker、AWSCLIが動作する端末上で操作します。
【2】Lambda Layerを作成します。
①Layer用のkubectlをダウンロードするDockerfileを作成します。
作成ファイル:Dockerfile
1 |
vi Dockerfile |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# # versions # # KUBECTL_VERSION should not be changed at the moment, see https://github.com/aws/aws-cdk/issues/15736 # Version 1.21.0 is not compatible with version 1.20 (and lower) of the server. ARG KUBECTL_VERSION=1.23.0 USER root RUN mkdir -p /opt WORKDIR /tmp # # tools # RUN yum update -y \ && yum install -y zip unzip wget tar gzip # # kubectl # RUN mkdir -p /opt/kubectl RUN cd /opt/kubectl && curl -LO "https://storage.googleapis.com/kubernetes-release/release/v${KUBECTL_VERSION}/bin/linux/amd64/kubectl" RUN chmod +x /opt/kubectl/kubectl # # create the bundle # RUN cd /opt \ && zip --symlinks -r ../layer.zip * \ && echo "/layer.zip is ready" \ && ls -alh /layer.zip; WORKDIR / |
※今回はバージョン「1.23.0」としました。
②Dockerfileを実行し、Layer用のzipを取り出すシェルを作成します。
作成ファイル:build.sh
1 |
vi build.sh |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#!/bin/bash set -euo pipefail cd $(dirname $0) echo ">> Building AWS Lambda layer inside a docker image..." TAG='aws-lambda-layer' sudo docker build -t ${TAG} . echo ">> Extrating layer.zip from the build container..." CONTAINER=$(sudo docker run -d ${TAG} false) sudo docker cp ${CONTAINER}:/layer.zip layer.zip echo ">> Stopping container..." sudo docker rm -f ${CONTAINER} echo ">> layer.zip is ready" |
③シェルに実行権限を付与します。
1 |
chmod 755 build.sh |
④シェルを実行します。
「>> layer.zip is ready」と表示され、「layer.zip」が作成されていれば成功です。
⑤AWSCLIを使用して「layer.zip」をS3にアップロードします。
ファイルがS3にアップロードされたことを確認します。
⑥AWSCLIを使用してLambda Layerを作成します。
1 2 3 4 5 |
aws lambda publish-layer-version \ --layer-name dev-kubectl \ --content S3Bucket=dev-lambda-layer-tmp,S3Key=layer.zip \ --compatible-runtimes provided.al2 \ --description 'kubectl ver1.23.0' |
AWSコンソールでlambdalayerの画面で作成されていることを確認します。
上記の画面でバージョンが「3」となっていますが、事前時やり直ししたため
バージョンが上がっています。
初回はバージョン「1」となります。
【3】Lambdaを作成します。
①AWSコンソールでLambdaを作成します。
関数名:dev-kubectl-lambda
ランタイム:Amazon Linux 2 でユーザー独自のブートストラップを提供する
上記以外はデフォルトのまま作成しました。
②LambdaのLayerを設定します。
③lambdaのコードタブで「bootstrap.sample」を「bootstrap」にファイル名を変更します。
④lambdaのコードタブで「hello.sh.sample」を「hello.sh」にファイル名を変更します。
⑤「bootstrap」を編集します。
12行目~14行目を追記します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#!/bin/sh set -euo pipefail # Handler format: <script_name>.<bash_function_name> # # The script file <script_name>.sh must be located at the root of your # function's deployment package, alongside this bootstrap executable. source $(dirname "$0")/"$(echo $_HANDLER | cut -d. -f1).sh" while true do # Layerライブラリの読み込み export PATH=$PATH:/opt/kubectl # バージョン確認コマンド kubectl version --client # Request the next event from the Lambda runtime HEADERS="$(mktemp)" EVENT_DATA=$(curl -v -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next") INVOCATION_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2) # Execute the handler function from the script RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA") # Send the response to Lambda runtime curl -v -sS -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$INVOCATION_ID/response" -d "$RESPONSE" done |
⑥編集後の保存して「Deploy」を行います。
⑦Lambdaのテストを作成します。
イベント名:test
上記以外の項目はデフォルトのままとしました。
⑧テストを実行します。
ログにkubectlのバージョンが表示されれば成功です。
Client Version: version.info {Major:”1″, Minor:”23″, GitVersion:”v1.23.0″~
※ここには記載していませんが、configファイルを作成して「bootstrap」で
「export KUBECONFIG=config」を追記することでkubernetesの操作も可能になります。
以上
【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>