LoginSignup
0
0

More than 3 years have passed since last update.

[書きかけ] libredwg を AWS Lambda レイヤーで使うためにビルド

Last updated at Posted at 2019-09-04

仮想マシン

Amazon Linux 2 で環境構築します。

クローン

git clone https://github.com/LibreDWG/libredwg.git

手修正

気に入らない部分を手修正します。

  • makeinfo がない、Convert::Binary::C がない、という、ないない病を回避するために doc をビルドから省きます
  • programs/Makefile.am:47: warning: compiling 'dwggrep.c' with per-target flags requires 'AM_PROG_CC_C_O' in 'configure.ac' という事なので AM_PROG_CC_C_O を追加します
diff --git a/Makefile.am b/Makefile.am
index 49b9ba14..d4148c35 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -19,7 +19,7 @@

 ACLOCAL_AMFLAGS = -I m4

-SUBDIRS = src programs examples test doc
+SUBDIRS = src programs examples test
 if HAVE_SWIG_PYTHON
 if !DISABLE_BINDINGS
 SUBDIRS += bindings
diff --git a/autogen.sh b/autogen.sh
old mode 100644
new mode 100755
diff --git a/configure.ac b/configure.ac
index 018033c3..b601e192 100644
--- a/configure.ac
+++ b/configure.ac
@@ -48,6 +48,7 @@ AC_CANONICAL_HOST
 dnl Checks for programs
 PKG_PROG_PKG_CONFIG
 AC_PROG_CC
+AM_PROG_CC_C_O
 AC_PROG_LN_S
 AC_PROG_MAKE_SET
 AC_PROG_INSTALL
diff --git a/src/config.h.in b/src/config.h.in
index 726d5837..acccadb8 100644
--- a/src/config.h.in
+++ b/src/config.h.in
@@ -134,9 +134,13 @@
    slash. */
 #undef LSTAT_FOLLOWS_SLASHED_SYMLINK

-/* Define to the sub-directory where libtool stores uninstalled libraries. */
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
 #undef LT_OBJDIR

+/* Define to 1 if your C compiler doesn't accept -c and -o together. */
+#undef NO_MINUS_C_MINUS_O
+
 /* Define to the address where bug reports for this package should be sent. */
 #undef PACKAGE_BUGREPORT

ビルド執行から zip まで

autoreconf

# configure.ac:51: error: required file 'build-aux/compile' not found
# configure.ac:51:   'automake --add-missing' can install 'compile'
automake --add-missing

autoreconf

# https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-layers.html によると、
# > レイヤーは、関数実行環境の /opt ディレクトリに抽出されます。
# > ランタイムごとに、言語に応じて、/opt のさまざまな場所のライブラリが検索されます。
./configure --prefix=/opt

make

make install DESTDIR=~/libredwg-build

cd ~/libredwg-build/opt

# デバッグ情報をそぎ落とす
strip bin/* lib/*.a

zip -r ~/libredwg-build.zip .

AWS Lambda の Node.js 10.x の event 引数の中身

API Gateway の メソッドテストにて

クエリ文字列

key=value

ヘッダー
plaintext
X-Header:Value1
X-Header:Value2
X-Header:Value3

応答

{
  "resource": "/dwg-converter",
  "path": "/dwg-converter",
  "httpMethod": "POST",
  "headers": {
    "X-Header": "Value3"
  },
  "multiValueHeaders": {
    "X-Header": [
      "Value1",
      "Value2",
      "Value3"
    ]
  },
  "queryStringParameters": {
    "key": "value"
  },
  "multiValueQueryStringParameters": {
    "key": [
      "value"
    ]
  },
  "pathParameters": null,
  "stageVariables": null,
  "requestContext": {
    "resourceId": "XXX",
    "resourcePath": "/dwg-converter",
    "httpMethod": "POST",
    "extendedRequestId": "XXX",
    "requestTime": "04/Sep/2019:13:47:57 +0000",
    "path": "/dwg-converter",
    "accountId": "123",
    "protocol": "HTTP/1.1",
    "stage": "test-invoke-stage",
    "domainPrefix": "testPrefix",
    "requestTimeEpoch": 123,
    "requestId": "XXX",
    "identity": {
      "cognitoIdentityPoolId": null,
      "cognitoIdentityId": null,
      "apiKey": "test-invoke-api-key",
      "principalOrgId": null,
      "cognitoAuthenticationType": null,
      "userArn": "XXX",
      "apiKeyId": "test-invoke-api-key-id",
      "userAgent": "aws-internal/3 aws-sdk-java/1.11.590 Linux/4.9.184-0.1.ac.235.83.329.metal1.x86_64 OpenJDK_64-Bit_Server_VM/25.212-b03 java/1.8.0_212 vendor/Oracle_Corporation",
      "accountId": "123",
      "caller": "123",
      "sourceIp": "test-invoke-source-ip",
      "accessKey": "XXX",
      "cognitoAuthenticationProvider": null,
      "user": "123"
    },
    "domainName": "testPrefix.testDomainName",
    "apiId": "XXX"
  },
  "body": "本文です",
  "isBase64Encoded": false
}

API Gateway+Lambdaでバイナリデータを処理 が続きとして完ぺきに近い…

適当過ぎて不完全ですが参考までに。

exports.handler = (event) => {
    return new Promise((resolve, reject) => {
        const fs = require('fs');
        fs.writeFile(
            '/tmp/input.dwg',
            new Buffer(event.body, 'base64'),
            (err) => {
                if (err) {
                    resolve({
                        statusCode: 500,
                        body: JSON.stringify('Conversion failed!')
                    });
                }
                else {
                    const { exec } = require('child_process');
                    exec('dwg2SVG input.dwg', {
                        cwd: "/tmp"
                    }, (error, stdout, stderr) => {
                        console.log(error);
                        console.log(stdout);
                        console.error(stderr);
                        const response = {
                            statusCode: 200,
                            body: JSON.stringify({ error, stdout, stderr })
                        };
                        resolve(response);
                    });
                }
            });
    });
};
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0