ホーム 記事一覧 ブック DH週間トピックス 検索 このサイトについて
English
Github Actionsを使ってGithubからEC2までのDjangoのCICD環境構築(2023版)

Github Actionsを使ってGithubからEC2までのDjangoのCICD環境構築(2023版)

概要 Github Actionsを使ってGithubからEC2までのDjangoのCICD環境を構築する機会があり、その備忘録です。 以下の記事を参考にさせていただきました。 https://qiita.com/fffukken/items/27b0bfa712940914d3f6 上記の記事に対して、Github Actionsの設定を一部更新しました。 Github Actionsの設定 name: Test and Deploy on: push: branches: [ develop, main ] pull_request: branches: [ develop ] jobs: build: runs-on: ubuntu-latest strategy: max-parallel: 4 matrix: python-version: [3.9, "3.10"] steps: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Install Dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt - name: Run Tests run: | python manage.py makemigrations python manage.py migrate python manage.py test - name: deploy run: | echo "$SECRET_KEY" > secret_key chmod 600 secret_key ssh -oStrictHostKeyChecking=no ${EC2_USER}@${EC2_HOST} -i secret_key "source <仮想環境名>/bin/activate \ && cd ~/<プロジェクト名>\ && git pull origin main \ && python manage.py makemigrations \ && python manage.py migrate \ && deactivate \ && sudo systemctl restart gunicorn" env: SECRET_KEY: ${{ secrets.SECRET_KEY }} EC2_USER: ${{ secrets.EC2_USER }} EC2_HOST: ${{ secrets.EC2_HOST }} 変更した点として、actions/checkoutとactions/setup-pythonのバージョンを変更しました。また、pip installの部分を変更し、pip install -r requirements.txtにしました。 ...

Amazon ECRのリポジトリを一括削除する

Amazon ECRのリポジトリを一括削除する

概要 Amazon ECRのリポジトリを一括削除する機会がありましたので、その備忘録です。ご利用される際は注意して実行してください。 リポジトリの一覧を作成 以下の記事を参考にしました。 https://qiita.com/fk_2000/items/bffd3b1ad6f3ab109766 以下を実行します。 aws ecr describe-repositories --output json | jq -re ".repositories[].repositoryName" > repository.list macの場合でjqコマンドがない場合、brew install jqなどを実行してください。 削除 以下を実行します。--forceを使って、imageがあっても削除を行います。 for X in `awk '{print $1}' repository.list` ; do aws ecr delete-repository --repository-name $X --force ; done まとめ ご利用される際は十分注意の上、実行してください。参考になりましたら幸いです。

OpenAPIとAWS CDKを用いてREST APIを作成する(Opensearch接続・カスタムドメイン)

OpenAPIとAWS CDKを用いてREST APIを作成する(Opensearch接続・カスタムドメイン)

概要 OpenAPIとAWS CDKを用いてREST APIを作成する機会がありましたので、その備忘録です。以下の記事がとても参考になりました。 https://zenn.dev/taroman_zenn/articles/91879cec40627c 今回作成したものは以下のリポジトリで公開しています。 https://github.com/nakamura196/CdkOpenapi Opensearchとの接続 以下のLambdaで実装しています。 https://github.com/nakamura196/CdkOpenapi/blob/main/lambda/search.ts Lambdaに環境変数を渡す必要があり、lib以下のtsファイルで以下のように記述しました。 ... const searchFn = new NodejsFunction(this, "search", { entry: path.join(__dirname, "../lambda/search.ts"), runtime: Runtime.NODEJS_18_X, handler: "handler", environment: { ELASTIC_HOST: process.env.ELASTIC_HOST || "", ELASTIC_USERNAME: process.env.ELASTIC_USERNAME || "", ELASTIC_PASSWORD: process.env.ELASTIC_PASSWORD || "", ELASTIC_INDEX_NAME: process.env.ELASTIC_INDEX_NAME || "", }, }); ... カスタムドメイン 以下のファイルを参考にしてください。間違いなどがあるかもしれませんが、カスタムドメインの登録からAPI Gatewayへの設定も行ってみました。 https://github.com/nakamura196/CdkOpenapi/blob/main/lib/cdk-openapi-stack.ts まとめ 色々と中途半端なリポジトリではありますが、参考になる部分があれば幸いです。

StrapiとAmazon OpenSearchを連携する

StrapiとAmazon OpenSearchを連携する

概要 StrapiとElasticsearchとの連携にあたり、以下の記事が参考になりました。 https://punits.dev/blog/integrating-elasticsearch-with-strapi/ ソースコードも公開されています。 https://github.com/geeky-biz/strapi-integrate-elasticsearch ここでは、上記の記事を参考にして、Amazon OpenSearchと連携するなど、一部カスタマイズした内容についてメモします。 カスタマイズしたソースコードは以下です。 https://github.com/nakamura196/strapi-integrate-opensearch 修正点 以下について、記事ではindexing_typeとなっていますが、indexing_request_typeとする必要がありました。 https://github.com/nakamura196/strapi-integrate-opensearch/blob/006c533d4d7882fc9779552db31a7b0e2ada5e57/elastic/cron-search-indexing.js#L16 またElasticsearchではなく、Amazon OpenSearchを使用するにあたり、以下のライブラリをインストールする必要があります。 npm install @opensearch-project/opensearch npm install @aws-sdk/credential-providers 認証の方法はいくつかあると思いますが、ここでは以下のように変更しました。 https://github.com/nakamura196/strapi-integrate-opensearch/blob/006c533d4d7882fc9779552db31a7b0e2ada5e57/elastic/elasticClient.js#L1C1-L30 インデックスへの登録および削除の処理についても、以下のように修正する必要がありました。 https://github.com/nakamura196/strapi-integrate-opensearch/blob/006c533d4d7882fc9779552db31a7b0e2ada5e57/elastic/elasticClient.js#L39-L44 上記のような修正の結果、StrapiとAmazon OpenSearchを接続させることができました。 elastic/elasticClient.js および src/api/search/controllers/search.js を変更することで、APIの出力結果もカスタマイズできました。これにより、ElasticsearchのAggregationsを使用することができるようになりました。(私の調査不足により、Strapi単体でも実現できるかもしれません。) まとめ StrapiとAmazon OpenSearchの連携にあたり、参考になりましたら幸いです。

AWS CDK x CloudFront x S3 x Basic認証 x index.html対応 x 独自ドメイン

AWS CDK x CloudFront x S3 x Basic認証 x index.html対応 x 独自ドメイン

概要 AWS CDKを用いて、CloudFront + S3による静的サイトの作成を行いました。合わせて、CloudFront Functionを用いて、Basic認証とURLにファイル名や拡張子を含まないリクエストにindex.htmlを追加する処理を加えています。さらに、独自ドメインの追加も行いましたので、その備忘録です。 色々と不完全ですが、以下のリポジトリでソースコードを公開しています。 https://github.com/nakamura196/staticBasic 以下のような.envファイルを用意してcdk deployを実行する想定です。 CERT_ARN=arn:aws:acm:xxxx RECORD_NAME=aaa.bbb.com BUCKET_NAME=aaa.bbb.com REGION=us-east-1 ACCOUNT=yyyy DOMAIN_NAME=bbb.com それぞれの説明は以下のとおりです。 項目 説明 例 CERT_ARN 証明書のARN arn:aws:acm:xxxx RECORD_NAME 設定したいドメイン名 aaa.bbb.com BUCKET_NAME ファイルを格納するS3バケット名 aaa.bbb.com REGION リージョン名 us-east-1 ACCOUNT AWSのアカウント名(12 桁の数値 ) 123456789012 DOMAIN_NAME ホストゾーン名 bbb.com Stack 以下のStackを作成しました。 import { Stack, StackProps, RemovalPolicy, aws_cloudfront, aws_cloudfront_origins, aws_iam, } from "aws-cdk-lib"; import { Construct } from "constructs"; import * as s3 from "aws-cdk-lib/aws-s3"; import * as iam from "aws-cdk-lib/aws-iam"; import * as cloudfront from "aws-cdk-lib/aws-cloudfront"; import * as route53 from "aws-cdk-lib/aws-route53"; import * as targets from "aws-cdk-lib/aws-route53-targets"; import { Certificate } from "aws-cdk-lib/aws-certificatemanager"; import * as dotenv from "dotenv"; dotenv.config(); export class StaticBasicStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); const recordName = process.env.RECORD_NAME || ""; const domainName = process.env.DOMAIN_NAME || ""; const bucketName = process.env.BUCKET_NAME || ""; const cert = process.env.CERT_ARN || ""; // ホストゾーンIDを取得 const hostedZoneId = route53.HostedZone.fromLookup(this, "HostedZoneId", { domainName, }); // S3バケットを作成 const websiteBucket = new s3.Bucket(this, "WebsiteBucket", { removalPolicy: RemovalPolicy.DESTROY, autoDeleteObjects: true, bucketName, }); // CloudFront用のOrigin Access Identityを作成 const originAccessIdentity = new cloudfront.OriginAccessIdentity( this, "OriginAccessIdentity", { comment: `${bucketName}-identity`, } ); // S3バケットポリシーを設定 const webSiteBucketPolicyStatement = new iam.PolicyStatement({ actions: ["s3:GetObject"], effect: iam.Effect.ALLOW, principals: [ new aws_iam.CanonicalUserPrincipal( originAccessIdentity.cloudFrontOriginAccessIdentityS3CanonicalUserId ), ], resources: [`${websiteBucket.bucketArn}/*`], }); websiteBucket.addToResourcePolicy(webSiteBucketPolicyStatement); // CloudFront Functionの設定 const cfFunction = new aws_cloudfront.Function(this, "CloudFrontFunction", { code: aws_cloudfront.FunctionCode.fromFile({ filePath: "assets/redirect.js", }), }); // 証明書を取得 const certificate = Certificate.fromCertificateArn( this, "Certificate", cert ); // CloudFrontの設定 const distribution = new aws_cloudfront.Distribution(this, "distribution", { domainNames: [recordName ], certificate, comment: `${bucketName}-cloudfront`, defaultRootObject: "index.html", defaultBehavior: { allowedMethods: aws_cloudfront.AllowedMethods.ALLOW_GET_HEAD, cachedMethods: aws_cloudfront.CachedMethods.CACHE_GET_HEAD, cachePolicy: aws_cloudfront.CachePolicy.CACHING_OPTIMIZED, viewerProtocolPolicy: aws_cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS, origin: new aws_cloudfront_origins.S3Origin(websiteBucket, { originAccessIdentity, }), functionAssociations: [ { function: cfFunction, eventType: aws_cloudfront.FunctionEventType.VIEWER_REQUEST, }, ], }, priceClass: aws_cloudfront.PriceClass.PRICE_CLASS_ALL, }); // Route53レコード設定 new route53.ARecord(this, "Route53RecordSet", { // ドメイン指定 recordName, // ホストゾーンID指定 zone: hostedZoneId, // エイリアスターゲット設定 target: route53.RecordTarget.fromAlias( new targets.CloudFrontTarget(distribution) ), }); } } まとめ 色々と考慮不足の点があるかと思いますが、AWS CDKの便利さを体感することができました。他の方の参考になる部分がありましたら幸いです。 ...

DrupalとAmazon OpenSearch Serviceを接続する

DrupalとAmazon OpenSearch Serviceを接続する

概要 DrupalとAmazon OpenSearch Serviceを接続する機会がありましたので、その備忘録です。以下の記事が参考になりました。 https://www.acquia.com/jp/blog/intergration-with-drupal-and-elasticsearch モジュールのインストール drupal/search_apiとdrupal/elasticsearch_connectorに加えて、nodespark/des-connectorをインストールする必要がありました。 (バージョンの指定方法など、改善の余地があるかもしれません。) composer require "nodespark/des-connector:^7.x-dev" composer require 'drupal/search_api:^1.29' composer require "drupal/elasticsearch_connector ^7.0@alpha" 続けて、以下で有効化します。 drush pm:enable search_api elasticsearch_connector DrupalをElasticsearchに接続する クラスタ 以下にアクセス /admin/config/search/elasticsearch-connector 「Add cluster」をクリックします。 そして、以下のように値を入力します。Amazon OpenSearch ServiceでBasic認証をかけている方法を前提としています。注意点として、「Server URL」に入力する値の末尾に、:443が必要でした。 Elasticsearchサーバーへの接続が成功すると、Cluster Statusに yellow や green と表示されます。 インデックス 次に、任意の作業ですが、インデックスを作成します。「Add index」ボタンを押して、nameだけ入力してみます。結果、以下のようにインデックスが作成されました。 Search APIの設定 今度は、Search API側の設定を行います。以下にアクセスします。 /admin/config/search/search-api サーバの追加 「Add Server」ボタンを押します。特に、BackendにElasticsearchを選択して、Clusterに先程作成したクラスタを選択します。 インデックスの追加 以下の画面には出ていませんが、「Datasources」のところで、「Content」を選択しています。また「Server」で、上記で作成したサーバを選択しています。 次に、末尾の「Save and add fields」ボタンをクリックします。 フィールドの追加 今回は最低限のフィールドとして、Titleを追加しておきます。 追加したフィールドに対するFulltext検索を可能とするために、「Type」を変更します。これらの設定は適宜変更してください。 再インデクシング 「Save changes」を押すと、以下のように、reindexingへのリンク(黄色)が表示されます。 ...

Amazon LightsailでStrapiを動かす(SSL, 独自ドメイン)

Amazon LightsailでStrapiを動かす(SSL, 独自ドメイン)

概要 Amazon LightsailでStrapiを動かす機会がありましたので、その備忘録です。以下の記事を参考にしました。 https://zenn.dev/holykzm/articles/1e54cc25207657 インスタンス Node.jsを選択します。 メモリは1GB以上のものを選択してください。Lightsail上でビルドする場合、メモリ不足でエラーが発生します。 SSL、独自ドメイン 以下を参考にしてください。 https://zenn.dev/nakamura196/articles/5772d6c918508a#独自ドメインの付与 Static IPを付与して、Route 53で独自ドメインを設定し、以下を実行します。 sudo /opt/bitnami/bncert-tool ProxyPassの設定 (より適切な記述箇所があるかと思いますが、)以下を追記します。 /opt/bitnami/apache2/conf/httpd.conf # 末尾に以下を追加 ProxyPass / http://localhost:1337/ ProxyPassReverse / http://localhost:1337/ apacheの再起動 sudo /opt/bitnami/ctlscript.sh restart apache Strapi のインストール cd /opt/bitnami/apache2/htdocs/ npx create-strapi-app@latest backend --quickstart アプリが起動するので、Ctrl+Cなどで一旦停止します。 pm2 pm2のインストール sudo npm install pm2 -g server.jsの作成 cd /opt/bitnami/apache2/htdocs/backend vi server.js /opt/bitnami/apache2/htdocs/backend/server.js const strapi = require('@strapi/strapi'); strapi(/* {...} */).start(); ビルド cd /opt/bitnami/apache2/htdocs/backend NODE_ENV=production npm run build サーバの起動 NODE_ENV=production pm2 start server.js --name strapi 以下のように、strapiを起動できました。 ...

Hugging Face Spaceを用いたNDL古典籍OCRのウェブアプリ

Hugging Face Spaceを用いたNDL古典籍OCRのウェブアプリ

概要 Hugging Face Spaceを用いたNDL古典籍OCRのウェブアプリを作成しました。以下でお試しいただけます。画像アップロードして、1分程度すると、OCR結果のテキストとJSONデータが表示されます。 https://huggingface.co/spaces/nakamura196/ndl_kotenseki_ocr 本アプリの作成にあたっては、以下の記事を参考にさせていただきました。 https://qiita.com/relu/items/e882e23a9bd07243211b 使い分け NDL古典籍OCRを試す環境として、Google Colabを用いたチュートリアルを別途用意しています。 上記では無料でGPUを使用することができるため、高速なOCR処理が可能です。一方、ノートブックの初回起動時に、関連するライブラリやモデルのダウンロードを行うため、4分程度のセットアップ時間がかかってしまう点等に課題があります。 一方、今回Hugging Face Spaceを用いた作成したアプリケーションでは、72時間連続して使用されない(2023年2月時点)限り、OCR処理を即座に実行することが可能です。さらに、Web APIによる利用も可能といった点が挙げられます。(APIによる利用については後述します。)ただし、無料枠ではGPUが使用できないため、1画像あたり1分程度の処理時間がかかる点が課題です。(有料枠でGPUを使用することもできます。) APIによる利用 APIによる利用例を試すことができるノートブックを用意しました。504 Gateway Time-outというエラーが発生してしまう場合もありますが、参考になりましたら幸いです。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/GradioのAPIを用いたNDL古典籍OCRの例.ipynb まとめ NDL古典籍OCRの精度(≠速度)を試してみる場合など参考になりましたら幸いです。

NDL古典籍OCRをAmazon EC2のCPU環境で実行する

NDL古典籍OCRをAmazon EC2のCPU環境で実行する

概要 NDL古典籍OCRをAmazon EC2のCPU環境で実行してみましたので、その備忘録です。高額になりがちなGPU環境を用意せずに実行できる点が利点ですが、1画像あたり30秒から1分程度の時間がかかりますので、ご注意ください。 本環境の構築にあたり、以下の記事を参考にしています。 https://qiita.com/relu/items/e882e23a9bd07243211b インスタンス クイックスタートのUbuntuを選択します。 インスタンスタイプについえは、t2.medium以上をおすすめします。それより小さいインスタンスだと、エラーが発生しました。 サーバ内での設定 sshでログインし、以下を実行します。 sudo apt-get update && sudo apt-get upgrade -y sudo apt -y install build-essential sudo apt -y install libgl1-mesa-dev libglib2.0-0 sudo apt -y install unzip sudo apt install -y python3-pip sudo apt install -y python3.10-venv python3 -m venv app source app/bin/activate pip install --upgrade pip git clone https://github.com/ndl-lab/ndlkotenocr_cli.git cd ndlkotenocr_cli vi requirements.txt requirements.txtを開き、scikit-imageのバージョンを除く。また、torchとtorchvisionを追加する。 click lmdb==1.2.1 natsort==7.1.1 nltk==3.6.6 numpy==1.22.4 albumentations==1.2.1 opencv-python==4.6.0.66 protobuf==3.19.6 pyyaml scikit-image # scikit-image==0.16.2 scipy==1.7.3 lightgbm==3.3.2 transformers==4.19.1 pandas==1.3.5 mmcls==0.23.1 mmdet==2.25.0 datasets==2.2.1 jiwer==2.3.0 wheel torch torchvision 引き続き以下を実行する。 ...

Amazon SageMaker Studioを用いたNDL古典籍OCRの実行

Amazon SageMaker Studioを用いたNDL古典籍OCRの実行

概要 これまで、Google Cloud PlatformやGoogle Colabを用いたNDL OCR及びNDL古典籍OCRのチュートリアルを作成してきました。 今回は、Amazon SageMaker Studioを用いたNDL古典籍OCRの実行方法について説明します。なお、今回の方法では、実行の際に費用が発生しますのでご注意ください。 Amazon SageMaker Studioの説明は以下です。 https://aws.amazon.com/jp/sagemaker/studio/ ドメインの設定など ドメインの設定などは以下の記事などを参考にしてください。 https://dev.classmethod.jp/articles/how-to-walk-around-amazon-sagemaker-studio-new-ui/ 今回は以下のように作成済みのユーザープロファイルから「起動」→「Studio」を選択したところから説明します。 Studioでの操作 ノートブックの起動方法はいくつかありますが、ここでは、「File」→「New」→「Notebook」で起動してみます。 その後、以下のようなダイアログが表示されるため、今回は「ml.g4dn.xlarge」を選択します。 !nvidia-smiを実行すると、Tesla T4が表示されます。 ノートブックの実行 以下のファイルをノートブックをダウンロードし、SageMakerにアップロードしてください。 https://github.com/nakamura196/ndl_ocr/blob/main/sagemaker_ndl_kotenseki_ocr.ipynb ノートブックの作成にあたっては、@blue0620さんのノートブックを参考にしています。 https://github.com/blue0620/NDLkotenOCR-GoogleColabVersion/blob/main/NDLkotensekiOCR_googlecolabversion.ipynb 上記からの大きな差分として、まず、以下を実行しています。これらを行わないと、ライブラリのインストール時に、error: command 'gcc' failed with exit status 1といったエラーが発生します。 !apt update !apt -y install build-essential !apt -y install libgl1-mesa-dev libglib2.0-0 以下のように、OCR処理が実行されます。 インスタンスの削除 実行後は、忘れずにインスタンスの削除を行います。例えば、画面左部の「Running Terminals and Kernels」から「Running Instances」にあるインスタンスをシャットダウンします。 まとめ Amazon SageMaker Studioを用いたNDL古典籍OCRの実行方法について説明しました。

Amazon EC2にArchivematicaを立てる

Amazon EC2にArchivematicaを立てる

概要 Archivematicaはデジタルデータの長期保存のためのオープンソースソフトウェアです。 https://www.archivematica.org/en/ このArchivematicaをAmazon EC2に立てる機会がありましたので、その備忘録です。 インストール 以下のページにインストール方法が記載されています。 https://www.archivematica.org/en/docs/archivematica-1.13/admin-manual/installation-setup/installation/installation/ いくつかの選択肢がありますが、今回は以下の「CentOS 7 64-bit、Installing Archivematica on CentOS/Red Hat」を試してみます。 https://www.archivematica.org/en/docs/archivematica-1.13/admin-manual/installation-setup/installation/install-centos/#install-pkg-centos EC2のインスタンス CentOS 7と指定されていましたので、以下のAmazon マシンイメージ(AMI)を選択しました。 以下にハードウェアの要件が記載されていますが、「Recommended minimum production requirements」であるメモリ4GBである「t2.medium」、200GBのストレージを選択しました。 https://www.archivematica.org/en/docs/archivematica-1.13/admin-manual/installation-setup/installation/installation/#hardware インストール EC2の起動後は、上記のサイトに記載されていたコマンドをすべて実行します。以下をコピー&ペーストすることがでインストールできます。 sudo yum -y update # Allow Nginx to use ports 81 and 8001 sudo semanage port -m -t http_port_t -p tcp 81 sudo semanage port -a -t http_port_t -p tcp 8001 # Allow Nginx to connect the MySQL server and Gunicorn backends sudo setsebool -P httpd_can_network_connect_db=1 sudo setsebool -P httpd_can_network_connect=1 # Allow Nginx to change system limits sudo setsebool -P httpd_setrlimit 1 sudo yum install -y epel-release sudo -u root rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch sudo -u root bash -c 'cat << EOF > /etc/yum.repos.d/elasticsearch.repo [elasticsearch-6.x] name=Elasticsearch repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md EOF' sudo -u root bash -c 'cat << EOF > /etc/yum.repos.d/archivematica.repo [archivematica] name=archivematica baseurl=https://packages.archivematica.org/1.13.x/centos gpgcheck=1 gpgkey=https://packages.archivematica.org/1.13.x/key.asc enabled=1 EOF' sudo -u root bash -c 'cat << EOF > /etc/yum.repos.d/archivematica-extras.repo [archivematica-extras] name=archivematica-extras baseurl=https://packages.archivematica.org/1.13.x/centos-extras gpgcheck=1 gpgkey=https://packages.archivematica.org/1.13.x/key.asc enabled=1 EOF' sudo -u root yum install -y java-1.8.0-openjdk-headless elasticsearch mariadb-server gearmand sudo -u root systemctl enable elasticsearch sudo -u root systemctl start elasticsearch sudo -u root systemctl enable mariadb sudo -u root systemctl start mariadb sudo -u root systemctl enable gearmand sudo -u root systemctl start gearmand sudo -H -u root mysql -hlocalhost -uroot -e "DROP DATABASE IF EXISTS MCP; CREATE DATABASE MCP CHARACTER SET utf8 COLLATE utf8_unicode_ci;" sudo -H -u root mysql -hlocalhost -uroot -e "DROP DATABASE IF EXISTS SS; CREATE DATABASE SS CHARACTER SET utf8 COLLATE utf8_unicode_ci;" sudo -H -u root mysql -hlocalhost -uroot -e "CREATE USER 'archivematica'@'localhost' IDENTIFIED BY 'demo';" sudo -H -u root mysql -hlocalhost -uroot -e "GRANT ALL ON MCP.* TO 'archivematica'@'localhost';" sudo -H -u root mysql -hlocalhost -uroot -e "GRANT ALL ON SS.* TO 'archivematica'@'localhost';" sudo -u root yum install -y python-pip archivematica-storage-service sudo -u archivematica bash -c " \ set -a -e -x source /etc/sysconfig/archivematica-storage-service cd /usr/lib/archivematica/storage-service /usr/share/archivematica/virtualenvs/archivematica-storage-service/bin/python manage.py migrate"; sudo -u root systemctl enable archivematica-storage-service sudo -u root systemctl start archivematica-storage-service sudo -u root systemctl enable nginx sudo -u root systemctl start nginx sudo -u root systemctl enable rngd sudo -u root systemctl start rngd sudo -u root yum install -y archivematica-common archivematica-mcp-server archivematica-dashboard sudo -u archivematica bash -c " \ set -a -e -x source /etc/sysconfig/archivematica-dashboard cd /usr/share/archivematica/dashboard /usr/share/archivematica/virtualenvs/archivematica/bin/python manage.py migrate "; sudo -u root systemctl enable archivematica-mcp-server sudo -u root systemctl start archivematica-mcp-server sudo -u root systemctl enable archivematica-dashboard sudo -u root systemctl start archivematica-dashboard sudo -u root systemctl restart nginx sudo -u root yum install -y archivematica-mcp-client sudo -u root sed -i 's/^#TCPSocket/TCPSocket/g' /etc/clamd.d/scan.conf sudo -u root sed -i 's/^Example//g' /etc/clamd.d/scan.conf sudo -u root systemctl enable archivematica-mcp-client sudo -u root systemctl start archivematica-mcp-client sudo -u root systemctl enable fits-nailgun sudo -u root systemctl start fits-nailgun sudo -u root systemctl enable clamd@scan sudo -u root systemctl start clamd@scan sudo -u root systemctl restart archivematica-dashboard sudo -u root systemctl restart archivematica-mcp-server sudo -u archivematica bash -c " \ set -a -e -x source /etc/default/archivematica-storage-service || \ source /etc/sysconfig/archivematica-storage-service \ || (echo 'Environment file not found'; exit 1) cd /usr/lib/archivematica/storage-service /usr/share/archivematica/virtualenvs/archivematica-storage-service/bin/python manage.py createsuperuser "; 最後のコマンドで、archivematica-storage-serviceのユーザを作成します。ユーザ名やパスワードを指定します。 ...

Amazon LightsailでOmeka Sの初期設定を行うscript(Easy Adminモジュールの追加)

Amazon LightsailでOmeka Sの初期設定を行うscript(Easy Adminモジュールの追加)

以下の記事で紹介した「Amazon LightsailでOmeka Sの初期設定を行うscript」に対して、テーマやモジュールを簡単に追加できる「Easy Admin」を追加し、また関連ディレクトリの権限を修正したスクリプトを作成しました。 参考になりましたら幸いです。 # 変数 OMEKA_PATH=/home/bitnami/htdocs/omeka-s ## ハイフンは含めない DBNAME=omeka_s VERSION=3.2.3 ############# set -e mkdir $OMEKA_PATH # Omekaのダウンロード wget https://github.com/omeka/omeka-s/releases/download/v$VERSION/omeka-s-$VERSION.zip unzip -q omeka-s-$VERSION.zip mv omeka-s/* $OMEKA_PATH # .htaccessの移動 mv omeka-s/.htaccess $OMEKA_PATH # 不要なフォルダの削除 rm -rf omeka-s rm omeka-s-$VERSION.zip # 元からあったindex.htmlを削除(もし存在すれば) if [ -e $OMEKA_PATH/index.html ]; then rm $OMEKA_PATH/index.html fi # データベースの作成 cat <<EOF > sql.cnf [client] user = root password = $(cat /home/bitnami/bitnami_application_password) host = localhost EOF mysql --defaults-extra-file=sql.cnf -e "create database $DBNAME"; # Omeka Sの設定 cat <<EOF > $OMEKA_PATH/config/database.ini user = root password = $(cat bitnami_application_password) dbname = $DBNAME host = localhost EOF sudo chown -R daemon:daemon $OMEKA_PATH/files sudo apt install imagemagick -y # Module cd $OMEKA_PATH/modules ## easy admin wget https://github.com/Daniel-KM/Omeka-S-module-EasyAdmin/releases/download/3.3.7/EasyAdmin-3.3.7.zip unzip EasyAdmin-3.3.7.zip rm EasyAdmin-3.3.7.zip sudo chown -R daemon:daemon $OMEKA_PATH/files sudo chown -R daemon:daemon $OMEKA_PATH/modules sudo chown -R daemon:daemon $OMEKA_PATH/themes

nuxt3をamazon lightsailで公開する:pm2の使用

nuxt3をamazon lightsailで公開する:pm2の使用

はじめに nuxt3などを用いて開発したアプリケーションについて、github pages, netlify, aws amplify, およびServerless Framework+Lambdaなどを用いてデプロイすることが多いのですが、今回はvpsを用いて公開する機会があり、その備忘録です。 参考 具体的には、Amazon Lightsailとpm2を使用します。 Amazon Lightsailインスタンスの作成 Node.jsのblueprintを選択します。 また3000番ポートを使用するので、ファイアウォールを開放しておきます。 pm2の設定 以下の記事を参考にしました。 https://it-evo.jp/blog/blog-70/ インストール sudo su npm install pm2 -g Nuxt3のダウンロードとビルド サンプルプログラムをダウンロードします。 su bitnami cd /home/bitnami/ git clone https://github.com/nakamura196/nuxt3-pm2 セットアップ cd nuxt3-pm2 npm install ビルド npm run build npm run preview localhost:3000 でNuxt3のアプリケーションをご確認いただけます。 pm2を用いて起動する cd /home/bitnami/ vi /home/bitnami/ecosystem.config.js module.exports = { apps: [{ name: 'demo', cwd: '/home/bitnami/nuxt3-pm2', exec_mode: 'cluster', instances: 'max', script: './.output/server/index.mjs', watch: ['./'], // または true watch_options: { followSymlinks: true, usePolling: true, interval: 10000, binaryInterval: 10000, }, env: { PORT: 3000, NODE_ENV: 'production', } }] } 以下のコマンドで、pm2が起動します。 ...

EC2サーバセットアップ時のTODOメモ

EC2サーバセットアップ時のTODOメモ

EC2でサーバをセットアップする際のTODOメモです。 Elastic IPの付与 sudo権限のユーザ追加 sudo su useradd nakamura passwd nakamura usermod -G wheel nakamura 公開鍵の設置 cd /home/nakamura mkdir .ssh touch .ssh/authorized_keys chmod 700 .ssh chmod 600 .ssh/authorized_keys vi .ssh/authorized_keys chown -R nakamura:nakamura .ssh

Amazon LightsailでOmeka Classicの初期設定を行うscript

Amazon LightsailでOmeka Classicの初期設定を行うscript

Amazon LightsailでOmeka Classicの初期設定を行うscriptを作成しました。 以下の記事の「Omeka Classic版」です。 Amazon Lightsailを用いてOmeka Classicを使用する際の参考になりましたら幸いです。 # 変数 OMEKA_PATH=/home/bitnami/htdocs/omeka ## ハイフンは含めないこと DBNAME=omeka VERSION=3.0.3 ############# set -e mkdir -p $OMEKA_PATH # Omekaのダウンロード wget https://github.com/omeka/Omeka/releases/download/v$VERSION/omeka-$VERSION.zip unzip -q omeka-$VERSION.zip mv omeka-$VERSION/* $OMEKA_PATH # .htaccessの移動 mv omeka-$VERSION/.htaccess $OMEKA_PATH # 不要なフォルダの削除 rm -rf omeka-$VERSION rm omeka-$VERSION.zip # 元からあったindex.htmlを削除(もし存在すれば) if [ -e $OMEKA_PATH/index.html ]; then rm $OMEKA_PATH/index.html fi # データベースの作成 cat <<EOF > sql.cnf [client] user = root password = $(cat /home/bitnami/bitnami_application_password) host = localhost EOF mysql --defaults-extra-file=sql.cnf -e "create database $DBNAME"; # Omeka Sの設定 cat <<EOF > $OMEKA_PATH/db.ini [database] host = localhost username = root password = $(cat bitnami_application_password) dbname = $DBNAME prefix = "omeka_" charset = "utf8" EOF sudo chown -R daemon:daemon $OMEKA_PATH/files sudo apt install imagemagick -y

Nuxt3をNetlifyおよびAWSにデプロイする方法の一例

Nuxt3をNetlifyおよびAWSにデプロイする方法の一例

概要 Nuxt3をNetlifyおよびAWSにデプロイする方法の一例の備忘録です。 以下、構築例です。 Netlify app.vue https://nuxt3-nakamura196.netlify.app/ server/api/hello.ts https://nuxt3-nakamura196.netlify.app/api/hello AWS(Serverless) app.vue https://nuxt3.aws.ldas.jp/ server/api/hello.ts https://nuxt3.aws.ldas.jp/api/hello ソースコードは以下です。 https://github.com/nakamura196/nuxt3 以下、それぞれについて説明します。 Netlify 以下の記事を参考にすることで、BFFを含むデプロイができました。 https://blog.cloud-acct.com/posts/nuxt3-netlify-deploy/ AWS(Serverless) Lambda Functions URLを使用する方法は以下の記事が参考になりました。 https://qiita.com/P3117/items/e2893804c3161a161a49 一方、今回はAPI Gatewayを使用する方法を示します。以下の記事が参考になりました。 https://stackoverflow.com/questions/73862456/nuxt-3-in-aws-lambda-with-serverless-framework 上記を参考にすることで、以下のようにデプロイすることができました。 https://9f4jl2wn81.execute-api.us-east-1.amazonaws.com/ こちらについて、カスタムドメインの設定を行います。以下、API Gatewayのみを使用する場合と、CloudFrontを用いる場合のそれぞれについて説明します。 API Gatewayのみ API Gatewayの「カスタムドメイン名」から、ドメイン名を作成します。 その後、APIマッピングから、上述のAPIを選択します。 そして、Route 53でレコードを追加します。 これにより、以下のように、カスタムドメインを用いて公開することができます。 https://nuxt3-apigateway.aws.ldas.jp/ CloudFrontを用いる場合 CloudFrontのディストリビューションの作成において、オリジンドメインにAPI GatewayのURLを入力します。 「デフォルトのキャッシュビヘイビア」の「ビューワー」では、「Redirect HTTP to HTTPS」を選択しました。 「設定」において、代替ドメイン名およびカスタムSSL証明書を指定します。 最後に、Route 53でCloudFrontのドメイン名を用いたレコード追加を行います。 これにより、以下のように、カスタムドメインを用いた公開を行うことができました。 https://nuxt3.aws.ldas.jp/ まとめ 他にもより良い方法があるかと思いますが、Nuxt3のデプロイに関して参考になりましたら幸いです。 またSPAやSSGとしてデプロイする場合には、GitHub Pagesを利用する方法もあるかと思います。 用途に応じて使い分けていきたいと思います。

Amazon LightsailでOmeka Sの初期設定を行うscript

Amazon LightsailでOmeka Sの初期設定を行うscript

Amazon LightsailでOmeka Sの初期設定を行うscriptを作成しました。 Amazon Lightsailを用いてOmeka Sを使用する際の参考になりましたら幸いです。 # 変数 OMEKA_PATH=/home/bitnami/htdocs/omeka-s ## ハイフンは含めない DBNAME=omeka_s VERSION=3.2.3 ############# set -e mkdir $OMEKA_PATH # Omekaのダウンロード wget https://github.com/omeka/omeka-s/releases/download/v$VERSION/omeka-s-$VERSION.zip unzip -q omeka-s-$VERSION.zip mv omeka-s/* $OMEKA_PATH # .htaccessの移動 mv omeka-s/.htaccess $OMEKA_PATH # 不要なフォルダの削除 rm -rf omeka-s rm omeka-s-$VERSION.zip # 元からあったindex.htmlを削除(もし存在すれば) if [ -e $OMEKA_PATH/index.html ]; then rm $OMEKA_PATH/index.html fi # データベースの作成 cat <<EOF > sql.cnf [client] user = root password = $(cat /home/bitnami/bitnami_application_password) host = localhost EOF mysql --defaults-extra-file=sql.cnf -e "create database $DBNAME"; # Omeka Sの設定 cat <<EOF > $OMEKA_PATH/config/database.ini user = root password = $(cat bitnami_application_password) dbname = $DBNAME host = localhost EOF sudo chown -R daemon:daemon $OMEKA_PATH/files sudo apt install imagemagick -y

AWS EC2を用いたVirtuoso RDFストアの構築

AWS EC2を用いたVirtuoso RDFストアの構築

はじめに AWS EC2を用いたVirtuoso RDFストアの構築に関する備忘録です。独自ドメイン設定、HTTPS接続、Snorqlの設置、までを行います。 本記事以外にも、Virtuoso構築に関する有益な記事が多数存在しています。参考にしてください。 https://midoriit.com/2014/04/rdfストア環境構築virtuoso編1.html https://qiita.com/mirkohm/items/30991fec120541888acd https://zenn.dev/ningensei848/articles/virtuoso_on_gcp_faster_with_cos 前提 ACM Certificateは作成済みとします。以下の記事などを参考にしてください。 https://dev.classmethod.jp/articles/specification-elb-setting/#toc-3 EC2 まずEC2のインスタンスを作成します。 Amazon Linuxを選択し、インスタンスタイプはt2.microとしました。 ネットワーク設定については、「セキュリティグループを作成する」を選択し、「HTTPSトラフィックを許可する」と「HTTPトラフィックを許可する」の両方にチェックを入れます(以下の図では、後者にのみチェックが入っている状態ですのでご注意ください)。 インスタンスの状態が「実行中」になったら、画面右上の「接続」ボタンを押して、サーバに接続します。 接続後、以下を実行して、apacheサーバを立ち上げておきます。 sudo yum install httpd -y cd /var/www/html sudo vi index.html <p>test</p> sudo systemctl start httpd sudo systemctl enable httpd ELB作成 「ロードバランシング」の「ターゲットグループ」を選択します。 「Create target group」から、[Basic configuration]で「Instances」を選択して、あとは下図のように設定します。「VPC」は先ほど立ち上げたEC2インスタンスと同じものを選択しています。 「Register targets」の画面において、画面上部でインスタンスを選択して、「Include as pending below」ボタンをクリックします。すると、下図のように、選択したインスタンスが画面下部に移動します。 その後、「Create」ボタンを押します。 次に、「ロードバランサー」から「ロードバランサーの作成」を行います。 「Create Application Load Balancer」を選択し、以下のように「Network mapping」で複数のサブネットを選択します。 次がポイントですが、「Security groups」において、選択済みの「default」を削除して、先にEC2インスタンスの作成時に作成したセキュリティグループ「lanch-wizard-XX」など選択します。 また、「Listeners and routing」は、「HTTPS」を選択して、「Forward to」に先ほど作成したターゲットグループを選択してください。 ...

Hugging FaceモデルをAWS Lambdaでホスティングし、サーバーレス推論を実現する

Hugging FaceモデルをAWS Lambdaでホスティングし、サーバーレス推論を実現する

概要 以下の記事を参考に、Hugging FaceモデルをAWS Lambdaでホスティングし、サーバーレス推論を行った備忘録です。 https://aws.amazon.com/jp/blogs/compute/hosting-hugging-face-models-on-aws-lambda/ また、Lambdaの関数URLとCloudFrontを用いたAPIの提供までを行います。 Hugging FaceモデルをAWS Lambdaでホスティング 準備 この点については冒頭でも紹介した、以下のドキュメントを参考にしています。 https://aws.amazon.com/jp/blogs/compute/hosting-hugging-face-models-on-aws-lambda/ まず以下のコマンドを実行します。venvという仮想環境を作成していますが、この点は必須ではないはずです。 #Clone the project to your development environment git clone https://github.com/aws-samples/zero-administration-inference-with-aws-lambda-for-hugging-face.git cd zero-administration-inference-with-aws-lambda-for-hugging-face # 仮想環境の作成と有効化 python -m venv venv source venv/bin/activate # Install the required dependencies: pip install -r requirements.txt # Bootstrap the CDK. This command provisions the initial resources needed by the CDK to perform deployments: cdk bootstrap 注意 ドキュメントでは、この後にcdk deployをするように記載されています。その結果、deployすることができ、lambdaのテストも実行できました。しかし、後述するlambdaの関数URLを発行して利用した際に、いくつかエラーが発生しました。そのため、次の修正を行います。 inference/*.py 関数URLから利用する場合、パラメータがqueryStringParametersに格納されるため、そのための処理を追加します。postで利用する場合には、さらに修正が必要です。 以下、sentiment.pyの変更例です。pipelineの引数などを変更することで、自作モデルに基づく推論を行うことも可能です。 ...

AWS Copilotを用いたOmeka Sデータの定期バックアップ

AWS Copilotを用いたOmeka Sデータの定期バックアップ

概要 先日、Omeka Sのデータをダウンロードするプログラムを作成しました。 今回は、AWS Copilotを使用して、上記のプログラムを定期的に実行してみます。 AWS Copilotのインストール 以下を参考にしてください。 https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/AWS_Copilot.html ファイルの準備 任意の場所で、Dockerfile、main.sh、.envの3ファイルを作成します。 Dockerfile FROM python:3 COPY *.sh . CMD sh main.sh main.sh set -e export output_dir=../docs # Omeka Sからデータをダウンロードするプログラム export repo_tool=https://github.com/nakamura196/omekas_backup.git dir_tool=tool dir_dataset=dataset # フォルダが存在したら if [ -d $dir_tool ]; then rm -rf $dir_tool rm -rf $dir_dataset fi # clone git clone --depth 1 $repo_tool $dir_tool git clone --depth 1 $repo_dataset $dir_dataset # requirements.txt cd $dir_tool pip install --upgrade pip pip install -r requirements.txt # 実行 cd src sh main.sh # copy odir=../../$dir_dataset/$subdir mkdir -p $odir cd $odir cp -r ../../$dir_tool/data . cp -r ../../$dir_tool/docs . # git git status git add . git config user.email "$email" git config user.name "$name" git commit -m "update" git push # 後処理 cd ../../ rm -rf $dir_tool rm -rf $dir_dataset .env api_url=https://dev.omeka.org/omeka-s-sandbox/api github_url=https://<個人アクセストークン>@github.com/<ユーザ名>/<リポジトリ名>.git username=nakamura email=nakamura@example.org dirname=dev 以下、説明です。 ...